def process_data_for_makefile(self, project_data): #Flatten our dictionary, we don't need groups for key in SOURCE_KEYS: project_data[key] = list(chain(*project_data[key].values())) self._get_libs(project_data) self._parse_specific_options(project_data) project_data['toolchain'] = 'arm-none-eabi-' project_data[ 'toolchain_bin_path'] = self.env_settings.get_env_settings('gcc') pro_def = ProGenDef() if pro_def.get_mcu_core(project_data['target'].lower()): project_data['core'] = pro_def.get_mcu_core( project_data['target'].lower())[0] else: raise RuntimeError( "Target: %s not found, Please add the target to https://github.com/project-generator/project_generator_definitions" % project_data['target'].lower()) # gcc arm is funny about cortex-m4f. if project_data['core'] == 'cortex-m4f': project_data['core'] = 'cortex-m4' # change cortex-m0+ to cortex-m0plus if project_data['core'] == 'cortex-m0+': project_data['core'] = 'cortex-m0plus'
class TestDefinitions(TestCase): """test things related to ProjGenDef class""" def setUp(self): self.definitions = ProGenDef('novalid') # def test_get_mcu_def(self): # mcu_def = self.definitions.get_mcu_definition() # # not empty dic return # assert bool(mcu_def) # assert mcu_def['mcu']['vendor'] # assert mcu_def['mcu']['name'] # assert mcu_def['mcu']['core'] def test_get_targets(self): target = self.definitions.get_targets() # it's not empty list as we got some targets assert bool(target) def test_get_mcu_core(self): # valid target core = self.definitions.get_mcu_core('frdm-k64f') assert core != None assert core[0] == 'cortex-m4f' core = self.definitions.get_mcu_core('novalid') assert core == None def test_tool_def(self): tool_def = self.definitions.get_tool_definition('novalid') assert tool_def == None def test_is_supported(self): supported = self.definitions.is_supported('novalid') supported == False
def _set_target(self, expanded_dic, uvproj_dic, tool_name): pro_def = ProGenDef(tool_name) if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Target definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) logger.debug("Mcu definitions: %s" % mcu_def_dic) uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Device'] = mcu_def_dic['TargetOption']['Device'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['DeviceId'] = mcu_def_dic['TargetOption']['DeviceId'][0] try: uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Vendor'] = mcu_def_dic['TargetOption']['Vendor'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Cpu'] = mcu_def_dic['TargetOption']['Cpu'][0].encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['FlashDriverDll'] = str(mcu_def_dic['TargetOption']['FlashDriverDll'][0]).encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['SFDFile'] = mcu_def_dic['TargetOption']['SFDFile'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['RegisterFile'] = mcu_def_dic['TargetOption']['RegisterFile'][0] except KeyError: pass # overwrite the template if target has defined debugger # later progen can overwrite this if debugger is set in project data try: debugger_name = pro_def.get_debugger(expanded_dic['target'])['name'] uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[debugger_name]['uvproj']['TargetDlls']['Driver'] uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[debugger_name]['uvproj']['Utilities']['Flash2'] except (TypeError, KeyError) as err: pass # Support new device packs if 'PackID' in mcu_def_dic['TargetOption']: if tool_name != 'uvision5': # using software packs require v5 logger.info("The target might not be supported in %s, requires uvision5" % tool_name) uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['PackID'] = mcu_def_dic['TargetOption']['PackID'][0]
def _set_target(self, expanded_dic, uvproj_dic, tool_name): pro_def = ProGenDef(tool_name) if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Target definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) logger.debug("Mcu definitions: %s" % mcu_def_dic) uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Device'] = mcu_def_dic['TargetOption']['Device'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['DeviceId'] = mcu_def_dic['TargetOption']['DeviceId'][0] try: uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Vendor'] = mcu_def_dic['TargetOption']['Vendor'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Cpu'] = mcu_def_dic['TargetOption']['Cpu'][0].encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['FlashDriverDll'] = str(mcu_def_dic['TargetOption']['FlashDriverDll'][0]).encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['SFDFile'] = mcu_def_dic['TargetOption']['SFDFile'][0] except KeyError: # TODO: remove for next patch logger.debug("Using old definitions which are faulty for uvision, please update >v0.1.3.") # overwrite the template if target has defined debugger # later progen can overwrite this if debugger is set in project data try: debugger_name = pro_def.get_debugger(expanded_dic['target'])['name'] uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[debugger_name]['TargetDlls']['Driver'] uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[debugger_name]['Utilities']['Flash2'] except (TypeError, KeyError) as err: pass # Support new device packs if 'PackID' in mcu_def_dic['TargetOption']: if tool_name != 'uvision5': # using software packs require v5 logger.info("The target might not be supported in %s, requires uvision5" % tool_name) uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['PackID'] = mcu_def_dic['TargetOption']['PackID'][0]
def _uvoptx_set_debugger(self, expanded_dic, uvoptx_dic, tool_name): pro_def = ProGenDef(tool_name) if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Target definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) logger.debug("Mcu definitions: %s" % mcu_def_dic) # set the same target name FlashDriverDll config as in uvprojx file try: uvoptx_dic['ProjectOpt']['Target']['TargetName'] = expanded_dic['name'] uvoptx_dic['ProjectOpt']['Target']['TargetOption']['TargetDriverDllRegistry']['SetRegEntry']['Name'] = str(mcu_def_dic['TargetOption']['FlashDriverDll'][0]).encode('utf-8') except KeyError: return # load debugger from target dictionary or use default debugger try: debugger_dic = pro_def.get_debugger(expanded_dic['target']) if debugger_dic is None: debugger_name = self.definitions.debuggers_default else: debugger_name = debugger_dic['name'] uvoptx_dic['ProjectOpt']['Target']['TargetOption']['DebugOpt']['nTsel'] = self.definitions.debuggers[debugger_name]['uvoptx']['DebugOpt']['nTsel'] uvoptx_dic['ProjectOpt']['Target']['TargetOption']['DebugOpt']['pMon'] = self.definitions.debuggers[debugger_name]['uvoptx']['DebugOpt']['pMon'] uvoptx_dic['ProjectOpt']['Target']['TargetOption']['TargetDriverDllRegistry']['SetRegEntry']['Key'] = self.definitions.debuggers[debugger_name]['uvoptx']['SetRegEntry']['Key'] except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger'])
def process_data_for_makefile(self, data): self._fix_paths(data) self._list_files(data, 'source_files_c', data['output_dir']['rel_path']) self._list_files(data, 'source_files_cpp', data['output_dir']['rel_path']) self._list_files(data, 'source_files_s', data['output_dir']['rel_path']) self._list_files(data, 'source_files_obj', data['output_dir']['rel_path']) self._parse_specific_options(data) data['toolchain'] = 'arm-none-eabi-' data['toolchain_bin_path'] = self.env_settings.get_env_settings('gcc') pro_def = ProGenDef() if pro_def.get_mcu_core(data['target'].lower()): data['core'] = pro_def.get_mcu_core(data['target'].lower())[0] else: raise RuntimeError( "Target: %s not found, Please add them to https://github.com/project-generator/project_generator_definitions" % data['target'].lower()) # gcc arm is funny about cortex-m4f. if data['core'] == 'cortex-m4f': data['core'] = 'cortex-m4' # change cortex-m0+ to cortex-m0plus if data['core'] == 'cortex-m0+': data['core'] = 'cortex-m0plus' # set default values if 'optimization_level' not in data: data['optimization_level'] = self.optimization_options[0]
def process_data_for_makefile(self, project_data): # Flatten source dictionaries, we don't need groups for key in SOURCE_KEYS: project_data[key] = list(sorted( chain(*project_data[key].values()))) # flatten also include files project_data['include_files'] = list( sorted(chain(*project_data['include_files'].values()))) self._get_libs(project_data) self._parse_specific_options(project_data) pro_def = ProGenDef() if pro_def.get_mcu_core(project_data['target'].lower()): project_data['core'] = pro_def.get_mcu_core( project_data['target'].lower())[0] else: raise RuntimeError( "Target: %s not found, Please add the target to https://github.com/project-generator/project_generator_definitions" % project_data['target'].lower()) # gcc arm is funny about cortex-m4f. if project_data['core'] == 'cortex-m4f': project_data['core'] = 'cortex-m4' # change cortex-m0+ to cortex-m0plus if project_data['core'] == 'cortex-m0+': project_data['core'] = 'cortex-m0plus'
def process_data_for_makefile(self, project_data): #Flatten our dictionary, we don't need groups for key in SOURCE_KEYS: project_data[key] = list(chain(*project_data[key].values())) self._get_libs(project_data) self._parse_specific_options(project_data) project_data['toolchain'] = 'arm-none-eabi-' project_data['toolchain_bin_path'] = self.env_settings.get_env_settings('gcc') pro_def = ProGenDef() if pro_def.get_mcu_core(project_data['target'].lower()): project_data['core'] = pro_def.get_mcu_core(project_data['target'].lower())[0] else: raise RuntimeError( "Target: %s not found, Please add the target to https://github.com/project-generator/project_generator_definitions" % project_data['target'].lower()) # gcc arm is funny about cortex-m4f. if project_data['core'] == 'cortex-m4f': project_data['core'] = 'cortex-m4' # change cortex-m0+ to cortex-m0plus if project_data['core'] == 'cortex-m0+': project_data['core'] = 'cortex-m0plus'
class IAREmbeddedWorkbench(Exporter): """ Exporter class for IAR Systems. This class uses project generator. """ # These 2 are currently for exporters backward compatiblity NAME = 'IAR' TOOLCHAIN = 'IAR' # PROGEN_ACTIVE contains information for exporter scripts that this is using progen PROGEN_ACTIVE = True MBED_CONFIG_HEADER_SUPPORTED = True # backward compatibility with our scripts TARGETS = [] for target in TARGET_NAMES: try: if (ProGenDef('iar').is_supported(str(TARGET_MAP[target])) or ProGenDef('iar').is_supported( TARGET_MAP[target].progen['target'])): TARGETS.append(target) except AttributeError: # target is not supported yet continue def generate(self): """ Generates the project files """ project_data = self.progen_get_project_data() tool_specific = {} # Expand tool specific settings by IAR specific settings which are required try: if TARGET_MAP[self.target].progen['iar']['template']: tool_specific['iar'] = TARGET_MAP[self.target].progen['iar'] except KeyError: # use default template # by the mbed projects tool_specific['iar'] = { # We currently don't use misc, template sets those for us # 'misc': { # 'cxx_flags': ['--no_rtti', '--no_exceptions'], # 'c_flags': ['--diag_suppress=Pa050,Pa084,Pa093,Pa082'], # 'ld_flags': ['--skip_dynamic_initialization'], # }, 'template': [ os.path.join(os.path.dirname(__file__), 'iar_template.ewp.tmpl') ], } project_data['tool_specific'] = {} project_data['tool_specific'].setdefault("iar", {}) project_data['tool_specific']['iar'].setdefault("misc", {}) project_data['tool_specific']['iar'].update(tool_specific['iar']) project_data['tool_specific']['iar']['misc'].update(self.progen_flags) # VLA is enabled via template IccAllowVLA project_data['tool_specific']['iar']['misc']['c_flags'].remove("--vla") project_data['common']['build_dir'] = os.path.join( project_data['common']['build_dir'], 'iar_arm') self.progen_gen_file('iar_arm', project_data)
class Uvision4(Exporter): """ Exporter class for uvision. This class uses project generator. """ # These 2 are currently for exporters backward compatiblity NAME = 'uVision4' TOOLCHAIN = 'ARM' # PROGEN_ACTIVE contains information for exporter scripts that this is using progen PROGEN_ACTIVE = True # backward compatibility with our scripts TARGETS = [] for target in TARGET_NAMES: try: if (ProGenDef('uvision').is_supported(str(TARGET_MAP[target])) or ProGenDef('uvision').is_supported( TARGET_MAP[target].progen['target'])): TARGETS.append(target) except AttributeError: # target is not supported yet continue def get_toolchain(self): return TARGET_MAP[self.target].default_toolchain def generate(self): """ Generates the project files """ project_data = self.progen_get_project_data() tool_specific = {} # Expand tool specific settings by uvision specific settings which are required try: if TARGET_MAP[self.target].progen['uvision']['template']: tool_specific['uvision'] = TARGET_MAP[ self.target].progen['uvision'] except KeyError: # use default template # by the mbed projects tool_specific['uvision'] = { 'template': [join(dirname(__file__), 'uvision.uvproj.tmpl')], } project_data['tool_specific'] = {} project_data['tool_specific'].update(tool_specific) i = 0 for macro in project_data['common']['macros']: # armasm does not like floating numbers in macros, timestamp to int if macro.startswith('MBED_BUILD_TIMESTAMP'): timestamp = macro[len('MBED_BUILD_TIMESTAMP='):] project_data['common']['macros'][ i] = 'MBED_BUILD_TIMESTAMP=' + str(int(float(timestamp))) # armasm does not even accept MACRO=string if macro.startswith('MBED_USERNAME'): project_data['common']['macros'].pop(i) i += 1 project_data['common']['macros'].append('__ASSERT_MSG') self.progen_gen_file('uvision', project_data)
def TARGETS(cls): if not hasattr(cls, "_targets_supported"): cls._targets_supported = [] progendef = ProGenDef('uvision') for target in TARGET_NAMES: try: if (progendef.is_supported(str(TARGET_MAP[target])) or progendef.is_supported(TARGET_MAP[target].progen['target'])): cls._targets_supported.append(target) except AttributeError: # target is not supported yet continue return cls._targets_supported
def TARGETS(cls): if not hasattr(cls, "_targets_supported"): cls._targets_supported = [] progendef = ProGenDef('uvision5') for target in TARGET_NAMES: try: if (progendef.is_supported(str(TARGET_MAP[target])) or progendef.is_supported(TARGET_MAP[target].progen['target'])): cls._targets_supported.append(target) except AttributeError: # target is not supported yet continue return cls._targets_supported
def get_pgen_targets(ides): #targets supported by pgen and desired ides for tests targs = [] for ide in ides: for target in TARGET_NAMES: if target not in targs and hasattr(TARGET_MAP[target],'progen') \ and ProGenDef(ide).is_supported(TARGET_MAP[target].progen['target']): targs.append(target) return targs
def check_supported(self, ide): """Indicated if this combination of IDE and MCU is supported""" if self.target not in self.TARGETS or \ self.TOOLCHAIN not in TARGET_MAP[self.target].supported_toolchains: return False if not ProGenDef(ide).is_supported( TARGET_MAP[self.target].progen['target']): return False return True
class IAREmbeddedWorkbench(Exporter): """ Exporter class for IAR Systems. This class uses project generator. """ # These 2 are currently for exporters backward compatiblity NAME = 'IAR' TOOLCHAIN = 'IAR' # PROGEN_ACTIVE contains information for exporter scripts that this is using progen PROGEN_ACTIVE = True # backward compatibility with our scripts TARGETS = [] for target in TARGET_NAMES: try: if (ProGenDef('iar').is_supported(TARGET_MAP[target]) or ProGenDef('iar').is_supported( TARGET_MAP[target].progen_target)): TARGETS.append(target) except AttributeError: # target is not supported yet continue def generate(self): """ Generates the project files """ project_data = self.progen_get_project_data() # Expand tool specific settings by IAR specific settings which are required # by the mbed projects tool_specific = { 'iar': { # We currently don't use misc, template sets those for us # 'misc': { # 'cxx_flags': ['--no_rtti', '--no_exceptions'], # 'c_flags': ['--diag_suppress=Pa050,Pa084,Pa093,Pa082'], # 'ld_flags': ['--skip_dynamic_initialization'], # }, 'template': [ os.path.join(os.path.dirname(__file__), 'iar_template.ewp.tmpl') ], } } project_data['tool_specific'] = {} project_data['tool_specific'].update(tool_specific) self.progen_gen_file('iar_arm', project_data)
def process_data_for_makefile(self, project_data): #Flatten our dictionary, we don't need groups for key in SOURCE_KEYS: project_data[key] = list(chain(*project_data[key].values())) self._get_libs(project_data) self._parse_specific_options(project_data) def morph_define (define) : if '=' in define : return define.replace("=", " SETA ") else : return define + " SETA 1 " project_data['toolchain'] = '' project_data['preprocess_asm_seperately'] = True project_data['morph_define'] = morph_define pro_def = ProGenDef() if pro_def.get_mcu_core(project_data['target'].lower()): project_data['core'] = pro_def.get_mcu_core(project_data['target'].lower())[0] else: raise RuntimeError( "Target: %s not found, Please add the target to https://github.com/project-generator/project_generator_definitions" % project_data['target'].lower())
def select(available_ides, target, project_settings): ''' select the preferred option out of the available IDEs to debug the selected target, or None ''' possible_ides = [] for ide in available_ides: tool = tools_supported.ToolsSupported().get_tool(ide) if not tool.is_supported_by_default(target): if ProGenDef(ide).is_supported(target): possible_ides.append(ide) else: possible_ides.append(ide) if len(possible_ides): return sorted(possible_ides, key=lambda x: IDE_Preference.index(x))[0] else: return None
def _export_single_project(self): expanded_dic = self.workspace.copy() groups = self._get_groups(expanded_dic) expanded_dic['groups'] = {} for group in groups: expanded_dic['groups'][group] = [] self._iterate(self.workspace, expanded_dic, expanded_dic['output_dir']['rel_path']) self._fix_paths(expanded_dic, expanded_dic['output_dir']['rel_path']) # generic tool template specified or project if expanded_dic['template']: # TODO 0xc0170: template list ! project_file = join(getcwd(), expanded_dic['template'][0]) ewp_dic = xmltodict.parse(file(project_file), dict_constructor=dict) elif 'iar' in self.env_settings.templates.keys(): # template overrides what is set in the yaml files # TODO 0xc0170: extension check/expansion project_file = join(getcwd(), self.env_settings.templates['iar'][0]) ewp_dic = xmltodict.parse(file(project_file), dict_constructor=dict) else: ewp_dic = self.definitions.ewp_file # TODO 0xc0170: add ewd file parsing and support ewd_dic = self.definitions.ewd_file eww = None if self.workspace['singular']: # TODO 0xc0170: if we use here self.definitions.eww, travis fails. I cant reproduce it and dont see # eww used anywhere prior to exporting this. eww_dic = {u'workspace': {u'project': {u'path': u''}, u'batchBuild': None}} # set eww self._eww_set_path_single_project(eww_dic, expanded_dic['name']) eww_xml = xmltodict.unparse(eww_dic, pretty=True) project_path, eww = self.gen_file_raw(eww_xml, '%s.eww' % expanded_dic['name'], expanded_dic['output_dir']['path']) try: self._ewp_set_name(ewp_dic, expanded_dic['name']) except KeyError: raise RuntimeError("The IAR template is not valid .ewp file") # replace all None with empty strings '' self._clean_xmldict_ewp(ewp_dic) #self._clean_xmldict_ewd(ewd_dic) # set ARM toolchain and project name\ self._ewp_set_toolchain(ewp_dic, 'ARM') # set common things we have for IAR self._ewp_general_set(ewp_dic, expanded_dic) self._ewp_iccarm_set(ewp_dic, expanded_dic) self._ewp_aarm_set(ewp_dic, expanded_dic) self._ewp_ilink_set(ewp_dic, expanded_dic) self._ewp_files_set(ewp_dic, expanded_dic) # set target only if defined, otherwise use from template/default one if expanded_dic['target']: # get target definition (target + mcu) proj_def = ProGenDef('iar') if not proj_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = proj_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) self._normalize_mcu_def(mcu_def_dic) logging.debug("Mcu definitions: %s" % mcu_def_dic) self._ewp_set_target(ewp_dic, mcu_def_dic) # overwrite debugger only if defined in the project file, otherwise use either default or from template if expanded_dic['debugger']: try: debugger = self.definitions.debuggers[expanded_dic['debugger']] self._ewd_set_debugger(ewd_dic, ewp_dic, debugger) except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) ewp_xml = xmltodict.unparse(ewp_dic, pretty=True) project_path, ewp = self.gen_file_raw(ewp_xml, '%s.ewp' % expanded_dic['name'], expanded_dic['output_dir']['path']) ewd_xml = xmltodict.unparse(ewd_dic, pretty=True) project_path, ewd = self.gen_file_raw(ewd_xml, '%s.ewd' % expanded_dic['name'], expanded_dic['output_dir']['path']) return project_path, [ewp, eww, ewd]
def _export_single_project(self): """ A single project export """ expanded_dic = self.workspace.copy() self._fix_paths(expanded_dic) # generic tool template specified or project if expanded_dic['template']: template_ewp = False template_ewd = False # process each template file for template in expanded_dic['template']: template = join(getcwd(), template) # we support .ewp or .ewp.tmpl templates if os.path.splitext(template)[1] == '.ewp' or re.match('.*\.ewp.tmpl$', template): try: ewp_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewp = True except IOError: logger.info("Template file %s not found" % template) ewp_dic = xmltodict.parse(open(self.ewp_file).read()) if os.path.splitext(template)[1] == '.ewd' or re.match('.*\.ewd.tmpl$', template): try: ewd_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewd = True except IOError: logger.info("Template file %s not found" % template) ewd_dic = xmltodict.parse(open(self.ewd_file).read()) # handle non valid template files or not specified if not template_ewp and template_ewd: ewp_dic, _ = self._get_default_templates() elif not template_ewd and template_ewp: _, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() elif 'iar' in self.env_settings.templates.keys(): template_ewp = False template_ewd = False # template overrides what is set in the yaml files for template in self.env_settings.templates['iar']: template = join(getcwd(), template) if os.path.splitext(template)[1] == '.ewp' or re.match('.*\.ewp.tmpl$', template): try: ewp_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewp = True except IOError: logger.info("Template file %s not found" % template) ewp_dic = xmltodict.parse(open(self.ewp_file).read()) if os.path.splitext(template)[1] == '.ewd' or re.match('.*\.ewd.tmpl$', template): # get ewd template try: ewd_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewd = True except IOError: logger.info("Template file %s not found" % template) ewd_dic = xmltodict.parse(open(self.ewd_file).read()) # handle non valid template files or not specified if not template_ewp and template_ewd: ewp_dic, _ = self._get_default_templates() elif not template_ewd and template_ewp: _, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() eww = None if self.workspace['singular']: # TODO 0xc0170: if we use here self.definitions.eww, travis fails. I cant reproduce it and dont see # eww used anywhere prior to exporting this. eww_dic = {u'workspace': {u'project': {u'path': u''}, u'batchBuild': None}} # set eww self._eww_set_path_single_project(eww_dic, expanded_dic['name']) eww_xml = xmltodict.unparse(eww_dic, pretty=True) project_path, eww = self.gen_file_raw(eww_xml, '%s.eww' % expanded_dic['name'], expanded_dic['output_dir']['path']) try: ewp_configuration = ewp_dic['project']['configuration'][0] logging.debug("Provided .ewp file has multiple configuration, we use only the first one") ewp_dic['project']['configuration'] = ewp_dic['project']['configuration'][0] except KeyError: ewp_configuration = ewp_dic['project']['configuration'] try: ewp_configuration = ewp_dic['project']['configuration'][0] logging.debug("Provided .ewp file has multiple configuration, we use only the first one") ewp_dic['project']['configuration'] = ewp_dic['project']['configuration'][0] except KeyError: ewp_configuration = ewp_dic['project']['configuration'] # replace all None with empty strings '' self._clean_xmldict_ewp(ewp_configuration) #self._clean_xmldict_ewd(ewd_dic) try: self._ewp_set_name(ewp_configuration, expanded_dic['name']) except KeyError: raise RuntimeError("The IAR template is not valid .ewp file") # set ARM toolchain and project name\ self._ewp_set_toolchain(ewp_configuration, 'ARM') # set common things we have for IAR self._ewp_general_set(ewp_configuration['settings'], expanded_dic) self._ewp_iccarm_set(ewp_configuration['settings'], expanded_dic) self._ewp_aarm_set(ewp_configuration['settings'], expanded_dic) self._ewp_ilink_set(ewp_configuration['settings'], expanded_dic) self._ewp_files_set(ewp_dic, expanded_dic) # set target only if defined, otherwise use from template/default one if expanded_dic['target']: # get target definition (target + mcu) proj_def = ProGenDef('iar') if not proj_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = proj_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) self._normalize_mcu_def(mcu_def_dic) logger.debug("Mcu definitions: %s" % mcu_def_dic) self._ewp_set_target(ewp_configuration['settings'], mcu_def_dic) try: debugger = proj_def.get_debugger(expanded_dic['target']) self._ewd_set_debugger(ewd_dic['project']['configuration']['settings'], debugger) except KeyError as err: # TODO: worth reporting? pass # overwrite debugger only if defined in the project file, otherwise use either default or from template if expanded_dic['debugger']: try: self._ewd_set_debugger(ewd_dic['project']['configuration']['settings'], expanded_dic['debugger']) except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) self._ewd_set_name(ewd_dic['project']['configuration'], expanded_dic['name']) # IAR uses ident 2 spaces, encoding iso-8859-1 ewp_xml = xmltodict.unparse(ewp_dic, encoding='iso-8859-1', pretty=True, indent=' ') project_path, ewp = self.gen_file_raw(ewp_xml, '%s.ewp' % expanded_dic['name'], expanded_dic['output_dir']['path']) ewd_xml = xmltodict.unparse(ewd_dic, encoding='iso-8859-1', pretty=True, indent=' ') project_path, ewd = self.gen_file_raw(ewd_xml, '%s.ewd' % expanded_dic['name'], expanded_dic['output_dir']['path']) return project_path, [ewp, eww, ewd]
except OldLibrariesException, e: report['errormsg'] = ERROR_MESSAGE_NOT_EXPORT_LIBS else: if ide not in EXPORTERS: report['errormsg'] = ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN % (target, ide) else: Exporter = EXPORTERS[ide] target = EXPORT_MAP.get(target, target) try: if Exporter.PROGEN_ACTIVE: use_progen = True except AttributeError: pass if use_progen: if not ProGenDef(ide).is_supported( TARGET_MAP[target].progen['target']): supported = False else: if target not in Exporter.TARGETS: supported = False if supported: # target checked, export try: exporter = Exporter(target, tempdir, project_name, build_url_resolver, extra_symbols=extra_symbols) exporter.scan_and_copy_resources(project_path, tempdir) exporter.generate()
def test_tool_def(self): # test k64f for uvision, should not be empty tool_def = ProGenDef('uvision').get_tool_definition('frdm-k64f') assert bool(tool_def)
def test_tool_def_nonexist(self): tool_def = ProGenDef('novalid').get_tool_definition('frdm-k64f') assert tool_def is None
def test_core(self): core = ProGenDef('uvision').get_mcu_core('frdm-k64f') assert core[0] == 'cortex-m4f'
def _export_single_project(self): expanded_dic = self.workspace.copy() groups = self._get_groups(self.workspace) expanded_dic['groups'] = {} for group in groups: expanded_dic['groups'][group] = [] # get relative path and fix all paths within a project self._iterate(self.workspace, expanded_dic, expanded_dic['output_dir']['rel_path']) self._fix_paths(expanded_dic, expanded_dic['output_dir']['rel_path']) expanded_dic['build_dir'] = '.\\' + expanded_dic['build_dir'] + '\\' # generic tool template specified or project if expanded_dic['template']: # TODO 0xc0170: template list ! project_file = join(getcwd(), expanded_dic['template'][0]) uvproj_dic = xmltodict.parse(file(project_file)) elif 'uvision' in self.env_settings.templates.keys(): # template overrides what is set in the yaml files # TODO 0xc0170: extensions for templates - support multiple files and get their extension # and check if user defined them correctly project_file = join(getcwd(), self.env_settings.templates['uvision'][0]) uvproj_dic = xmltodict.parse(file(project_file)) else: uvproj_dic = self.definitions.uvproj_file try: uvproj_dic['Project']['Targets']['Target']['TargetName'] = expanded_dic['name'] except KeyError: raise RuntimeError("The uvision template is not valid .uvproj file") self._uvproj_files_set(uvproj_dic, expanded_dic) self._uvproj_set_CommonProperty( uvproj_dic['Project']['Targets']['Target']['TargetOption']['CommonProperty'], expanded_dic) self._uvproj_set_DebugOption( uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption'], expanded_dic) self._uvproj_set_DllOption( uvproj_dic['Project']['Targets']['Target']['TargetOption']['DllOption'], expanded_dic) self._uvproj_set_TargetArmAds( uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetArmAds'], expanded_dic) self._uvproj_set_TargetCommonOption( uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption'], expanded_dic) self._uvproj_set_Utilities( uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities'], expanded_dic) # set target only if defined, otherwise use from template/default one extension = 'uvproj' if expanded_dic['target']: pro_def = ProGenDef('uvision') if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) logging.debug("Mcu definitions: %s" % mcu_def_dic) uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Device'] = mcu_def_dic['TargetOption']['Device'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['DeviceId'] = mcu_def_dic['TargetOption']['DeviceId'][0] try: uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Vendor'] = mcu_def_dic['TargetOption']['Vendor'][0] uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['Cpu'] = mcu_def_dic['TargetOption']['Cpu'][0].encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['FlashDriverDll'] = str(mcu_def_dic['TargetOption']['FlashDriverDll'][0]).encode('utf-8') uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['SFDFile'] = mcu_def_dic['TargetOption']['SFDFile'][0] except KeyError: # TODO: remove for next patch logging.debug("Using old definitions which are faulty for uvision, please update >v0.1.3.") # Support new device packs, we just need probably one of the new features for # uvision to notice it's using software packs if 'RegisterFile' in mcu_def_dic['TargetOption']: uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['RegisterFile'] = mcu_def_dic['TargetOption']['RegisterFile'][0] # Add x for the new one so it does not need to convert it extension = 'uvprojx' # load debugger if expanded_dic['debugger']: try: uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[expanded_dic['debugger']]['TargetDlls']['Driver'] uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[expanded_dic['debugger']]['Utilities']['Flash2'] except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) # Project file uvproj_xml = xmltodict.unparse(uvproj_dic, pretty=True) path, files = self.gen_file_raw(uvproj_xml, '%s.%s' % (expanded_dic['name'], extension), expanded_dic['output_dir']['path']) return path, files
def _export_single_project(self): """ Processes groups and misc options specific for CoIDE, and run generator """ expanded_dic = self.workspace.copy() # TODO 0xc0170: fix misc , its a list with a dictionary if 'misc' in expanded_dic and bool(expanded_dic['misc']): print( "Using deprecated misc options for coide. Please use template project files." ) groups = self._get_groups() expanded_dic['groups'] = {} for group in groups: expanded_dic['groups'][group] = [] self._iterate(self.workspace, expanded_dic) # generic tool template specified or project if expanded_dic['template']: for template in expanded_dic['template']: template = join(getcwd(), template) if splitext(template)[1] == '.coproj' or re.match( '.*\.coproj.tmpl$', template): try: coproj_dic = xmltodict.parse(open(template)) except IOError: logger.info( "Template file %s not found. Using default template" % template) coproj_dic = self.definitions.coproj_file else: logger.info( "Template file %s contains unknown template extension (.coproj/.coproj.tmpl are valid). Using default one" % template) coproj_dic = self.definitions.coproj_file elif 'coide' in self.env_settings.templates.keys(): # template overrides what is set in the yaml files for template in self.env_settings.templates['coide']: template = join(getcwd(), template) if splitext(template)[1] == '.coproj' or re.match( '.*\.coproj.tmpl$', template): try: coproj_dic = xmltodict.parse(open(template)) except IOError: logger.info( "Template file %s not found. Using default template" % template) coproj_dic = self.definitions.coproj_file else: logger.info( "Template file %s contains unknown template extension (.coproj/.coproj.tmpl are valid). Using default one" % template) coproj_dic = self.definitions.coproj_file else: # setting values from the yaml files coproj_dic = self.definitions.coproj_file # set name and target try: coproj_dic['Project']['@name'] = expanded_dic['name'] except KeyError: raise RuntimeError("The coide template is not valid .coproj file") coproj_dic['Project']['Target']['@name'] = expanded_dic['name'] # library/exe coproj_dic['Project']['Target']['BuildOption']['Output']['Option'][0][ '@value'] = 0 if expanded_dic['output_type'] == 'exe' else 1 # Fill in progen data to the coproj_dic self._coproj_set_files(coproj_dic, expanded_dic) self._coproj_set_macros(coproj_dic, expanded_dic) self._coproj_set_includepaths(coproj_dic, expanded_dic) self._coproj_set_linker(coproj_dic, expanded_dic) # set target only if defined, otherwise use from template/default one if expanded_dic['target']: pro_def = ProGenDef('coide') if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition( expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/0xc0170/project_generator_definitions" % expanded_dic['target'].lower()) self._normalize_mcu_def(mcu_def_dic) logger.debug("Mcu definitions: %s" % mcu_def_dic) # correct attributes from definition, as yaml does not allowed multiple keys (=dict), we need to # do this magic. for k, v in mcu_def_dic['Device'].items(): del mcu_def_dic['Device'][k] mcu_def_dic['Device']['@' + k] = str(v) memory_areas = [] for k, v in mcu_def_dic['MemoryAreas'].items(): # ??? duplicate use of k for k, att in v.items(): del v[k] v['@' + k] = str(att) memory_areas.append(v) coproj_dic['Project']['Target']['Device'].update( mcu_def_dic['Device']) # TODO 0xc0170: fix debug options # coproj_dic['Project']['Target']['DebugOption'].update(mcu_def_dic['DebugOption']) coproj_dic['Project']['Target']['BuildOption']['Link'][ 'MemoryAreas']['Memory'] = memory_areas # TODO 0xc0170: create a method and look at finding that option if we can reuse already defined method try: # find debugger definitions in the list of options index = 0 for option in coproj_dic['Project']['Target']['DebugOption'][ 'Option']: # ??? k, v not used ??? for k, v in option.items(): if option[ '@name'] == 'org.coocox.codebugger.gdbjtag.core.adapter': found = index index += 1 debugger_name = pro_def.get_debugger( expanded_dic['target'])['name'] coproj_dic['Project']['Target']['DebugOption']['Option'][ found]['@value'] = self.definitions.debuggers[ debugger_name]['Target']['DebugOption'][ 'org.coocox.codebugger.gdbjtag.core.adapter'] except (TypeError, KeyError) as err: pass # get debugger definitions if expanded_dic['debugger']: try: # find debugger definitions in the list of options index = 0 for option in coproj_dic['Project']['Target']['DebugOption'][ 'Option']: # ??? k, v not used ??? for k, v in option.items(): if option[ '@name'] == 'org.coocox.codebugger.gdbjtag.core.adapter': found = index index += 1 coproj_dic['Project']['Target']['DebugOption']['Option'][ found]['@value'] = self.definitions.debuggers[ expanded_dic['debugger']]['Target']['DebugOption'][ 'org.coocox.codebugger.gdbjtag.core.adapter'] except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) # Project file # somehow this xml is not compatible with coide, coide v2.0 changing few things, lets use jinja # for now, more testing to get xml output right. Jinja template follows the xml dictionary,which is # what we want anyway. # coproj_xml = xmltodict.unparse(coproj_dic, pretty=True) project_path, projfile = self.gen_file_jinja( 'coide.coproj.tmpl', coproj_dic, '%s.coproj' % expanded_dic['name'], expanded_dic['output_dir']['path']) return project_path, projfile
class Uvision5(Exporter): """ Exporter class for uvision5. This class uses project generator. """ # These 2 are currently for exporters backward compatiblity NAME = 'uVision5' TOOLCHAIN = 'ARM' # PROGEN_ACTIVE contains information for exporter scripts that this is using progen PROGEN_ACTIVE = True # backward compatibility with our scripts TARGETS = [] for target in TARGET_NAMES: try: if (ProGenDef('uvision5').is_supported(str(TARGET_MAP[target])) or ProGenDef('uvision5').is_supported( TARGET_MAP[target].progen['target'])): TARGETS.append(target) except AttributeError: # target is not supported yet continue def get_toolchain(self): return TARGET_MAP[self.target].default_toolchain def generate(self): """ Generates the project files """ project_data = self.progen_get_project_data() tool_specific = {} # Expand tool specific settings by uvision specific settings which are required try: if TARGET_MAP[self.target].progen['uvision5']['template']: tool_specific['uvision5'] = TARGET_MAP[ self.target].progen['uvision5'] except KeyError: # use default template # by the mbed projects tool_specific['uvision5'] = { 'template': [join(dirname(__file__), 'uvision.uvproj.tmpl')], } project_data['tool_specific'] = {} project_data['tool_specific'].update(tool_specific) # get flags from toolchain and apply project_data['tool_specific']['uvision5']['misc'] = {} # asm flags only, common are not valid within uvision project, they are armcc specific project_data['tool_specific']['uvision5']['misc']['asm_flags'] = list( set(self.toolchain.flags['asm'])) # cxx flags included, as uvision have them all in one tab project_data['tool_specific']['uvision5']['misc']['c_flags'] = list( set(self.toolchain.flags['common'] + self.toolchain.flags['c'] + self.toolchain.flags['cxx'])) # ARM_INC is by default as system inclusion, not required for exported project project_data['tool_specific']['uvision5']['misc']['c_flags'].remove( "-I \"" + ARM_INC + "\"") # not compatible with c99 flag set in the template project_data['tool_specific']['uvision5']['misc']['c_flags'].remove( "--c99") # cpp is not required as it's implicit for cpp files project_data['tool_specific']['uvision5']['misc']['c_flags'].remove( "--cpp") project_data['tool_specific']['uvision5']['misc'][ 'ld_flags'] = self.toolchain.flags['ld'] i = 0 for macro in project_data['common']['macros']: # armasm does not like floating numbers in macros, timestamp to int if macro.startswith('MBED_BUILD_TIMESTAMP'): timestamp = macro[len('MBED_BUILD_TIMESTAMP='):] project_data['common']['macros'][ i] = 'MBED_BUILD_TIMESTAMP=' + str(int(float(timestamp))) # armasm does not even accept MACRO=string if macro.startswith('MBED_USERNAME'): project_data['common']['macros'].pop(i) i += 1 project_data['common']['macros'].append('__ASSERT_MSG') self.progen_gen_file('uvision5', project_data)
def setUp(self): self.definitions = ProGenDef('novalid')
def _export_single_project(self): """ Processes groups and misc options specific for CoIDE, and run generator """ expanded_dic = self.workspace.copy() # TODO 0xc0170: fix misc , its a list with a dictionary if 'misc' in expanded_dic and bool(expanded_dic['misc']): print ("Using deprecated misc options for coide. Please use template project files.") groups = self._get_groups() expanded_dic['groups'] = {} for group in groups: expanded_dic['groups'][group] = [] self._iterate(self.workspace, expanded_dic) # generic tool template specified or project if expanded_dic['template']: project_file = join(getcwd(), expanded_dic['template'][0]) try: coproj_dic = xmltodict.parse(open(project_file)) except IOError: logger.info("Template file %s not found. Using default template" % project_file) coproj_dic = self.definitions.coproj_file elif 'coide' in self.env_settings.templates.keys(): # template overrides what is set in the yaml files # TODO 0xc0170: extension check/expansion project_file = join(getcwd(), self.env_settings.templates['coide'][0]) try: coproj_dic = xmltodict.parse(open(project_file)) except IOError: logger.info("Template file %s not found. Using default template" % project_file) coproj_dic = self.definitions.coproj_file else: # setting values from the yaml files coproj_dic = self.definitions.coproj_file # set name and target try: coproj_dic['Project']['@name'] = expanded_dic['name'] except KeyError: raise RuntimeError("The coide template is not valid .coproj file") coproj_dic['Project']['Target']['@name'] = expanded_dic['name'] # library/exe coproj_dic['Project']['Target']['BuildOption']['Output']['Option'][0]['@value'] = 0 if expanded_dic['output_type'] == 'exe' else 1 # Fill in progen data to the coproj_dic self._coproj_set_files(coproj_dic, expanded_dic) self._coproj_set_macros(coproj_dic, expanded_dic) self._coproj_set_includepaths(coproj_dic, expanded_dic) self._coproj_set_linker(coproj_dic, expanded_dic) # set target only if defined, otherwise use from template/default one if expanded_dic['target']: pro_def = ProGenDef('coide') if not pro_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/0xc0170/project_generator_definitions" % expanded_dic['target'].lower()) self._normalize_mcu_def(mcu_def_dic) logger.debug("Mcu definitions: %s" % mcu_def_dic) # correct attributes from definition, as yaml does not allowed multiple keys (=dict), we need to # do this magic. for k, v in mcu_def_dic['Device'].items(): del mcu_def_dic['Device'][k] mcu_def_dic['Device']['@' + k] = str(v) memory_areas = [] for k, v in mcu_def_dic['MemoryAreas'].items(): # ??? duplicate use of k for k, att in v.items(): del v[k] v['@' + k] = str(att) memory_areas.append(v) coproj_dic['Project']['Target']['Device'].update(mcu_def_dic['Device']) # TODO 0xc0170: fix debug options # coproj_dic['Project']['Target']['DebugOption'].update(mcu_def_dic['DebugOption']) coproj_dic['Project']['Target']['BuildOption']['Link']['MemoryAreas']['Memory'] = memory_areas # TODO 0xc0170: create a method and look at finding that option if we can reuse already defined method try: # find debugger definitions in the list of options index = 0 for option in coproj_dic['Project']['Target']['DebugOption']['Option']: # ??? k, v not used ??? for k, v in option.items(): if option['@name'] == 'org.coocox.codebugger.gdbjtag.core.adapter': found = index index += 1 debugger_name =pro_def.get_debugger(expanded_dic['target'])['name'] coproj_dic['Project']['Target']['DebugOption']['Option'][found]['@value'] = self.definitions.debuggers[debugger_name]['Target']['DebugOption']['org.coocox.codebugger.gdbjtag.core.adapter'] except (TypeError, KeyError) as err: pass # get debugger definitions if expanded_dic['debugger']: try: # find debugger definitions in the list of options index = 0 for option in coproj_dic['Project']['Target']['DebugOption']['Option']: # ??? k, v not used ??? for k, v in option.items(): if option['@name'] == 'org.coocox.codebugger.gdbjtag.core.adapter': found = index index += 1 coproj_dic['Project']['Target']['DebugOption']['Option'][found]['@value'] = self.definitions.debuggers[expanded_dic['debugger']]['Target']['DebugOption']['org.coocox.codebugger.gdbjtag.core.adapter'] except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) # Project file # somehow this xml is not compatible with coide, coide v2.0 changing few things, lets use jinja # for now, more testing to get xml output right. Jinja template follows the xml dictionary,which is # what we want anyway. # coproj_xml = xmltodict.unparse(coproj_dic, pretty=True) project_path, projfile = self.gen_file_jinja( 'coide.coproj.tmpl', coproj_dic, '%s.coproj' % expanded_dic['name'], expanded_dic['output_dir']['path']) return project_path, projfile
def _export_single_project(self): """ A single project export """ expanded_dic = self.workspace.copy() self._fix_paths(expanded_dic) # generic tool template specified or project if expanded_dic['template']: template_ewp = False template_ewd = False # process each template file for template in expanded_dic['template']: template = join(getcwd(), template) # we support .ewp or .ewp.tmpl templates if os.path.splitext(template)[1] == '.ewp' or re.match( '.*\.ewp.tmpl$', template): try: ewp_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewp = True except IOError: logger.info("Template file %s not found" % template) ewp_dic = xmltodict.parse(open(self.ewp_file).read()) if os.path.splitext(template)[1] == '.ewd' or re.match( '.*\.ewd.tmpl$', template): try: ewd_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewd = True except IOError: logger.info("Template file %s not found" % template) ewd_dic = xmltodict.parse(open(self.ewd_file).read()) # handle non valid template files or not specified if not template_ewp and template_ewd: ewp_dic, _ = self._get_default_templates() elif not template_ewd and template_ewp: _, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() elif 'iar' in self.env_settings.templates.keys(): template_ewp = False template_ewd = False # template overrides what is set in the yaml files for template in self.env_settings.templates['iar']: template = join(getcwd(), template) if os.path.splitext(template)[1] == '.ewp' or re.match( '.*\.ewp.tmpl$', template): try: ewp_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewp = True except IOError: logger.info("Template file %s not found" % template) ewp_dic = xmltodict.parse(open(self.ewp_file).read()) if os.path.splitext(template)[1] == '.ewd' or re.match( '.*\.ewd.tmpl$', template): # get ewd template try: ewd_dic = xmltodict.parse(open(template), dict_constructor=dict) template_ewd = True except IOError: logger.info("Template file %s not found" % template) ewd_dic = xmltodict.parse(open(self.ewd_file).read()) # handle non valid template files or not specified if not template_ewp and template_ewd: ewp_dic, _ = self._get_default_templates() elif not template_ewd and template_ewp: _, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() else: ewp_dic, ewd_dic = self._get_default_templates() eww = None if self.workspace['singular']: # TODO 0xc0170: if we use here self.definitions.eww, travis fails. I cant reproduce it and dont see # eww used anywhere prior to exporting this. eww_dic = { u'workspace': { u'project': { u'path': u'' }, u'batchBuild': None } } # set eww self._eww_set_path_single_project(eww_dic, expanded_dic['name']) eww_xml = xmltodict.unparse(eww_dic, pretty=True) project_path, eww = self.gen_file_raw( eww_xml, '%s.eww' % expanded_dic['name'], expanded_dic['output_dir']['path']) try: ewp_configuration = ewp_dic['project']['configuration'][0] logging.debug( "Provided .ewp file has multiple configuration, we use only the first one" ) ewp_dic['project']['configuration'] = ewp_dic['project'][ 'configuration'][0] except KeyError: ewp_configuration = ewp_dic['project']['configuration'] try: ewp_configuration = ewp_dic['project']['configuration'][0] logging.debug( "Provided .ewp file has multiple configuration, we use only the first one" ) ewp_dic['project']['configuration'] = ewp_dic['project'][ 'configuration'][0] except KeyError: ewp_configuration = ewp_dic['project']['configuration'] # replace all None with empty strings '' self._clean_xmldict_ewp(ewp_configuration) #self._clean_xmldict_ewd(ewd_dic) try: self._ewp_set_name(ewp_configuration, expanded_dic['name']) except KeyError: raise RuntimeError("The IAR template is not valid .ewp file") # set ARM toolchain and project name\ self._ewp_set_toolchain(ewp_configuration, 'ARM') # set common things we have for IAR self._ewp_general_set(ewp_configuration['settings'], expanded_dic) self._ewp_iccarm_set(ewp_configuration['settings'], expanded_dic) self._ewp_aarm_set(ewp_configuration['settings'], expanded_dic) self._ewp_ilink_set(ewp_configuration['settings'], expanded_dic) self._ewp_files_set(ewp_dic, expanded_dic) # set target only if defined, otherwise use from template/default one if expanded_dic['target']: # get target definition (target + mcu) proj_def = ProGenDef('iar') if not proj_def.is_supported(expanded_dic['target'].lower()): raise RuntimeError("Target %s is not supported." % expanded_dic['target'].lower()) mcu_def_dic = proj_def.get_tool_definition( expanded_dic['target'].lower()) if not mcu_def_dic: raise RuntimeError( "Mcu definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower()) self._normalize_mcu_def(mcu_def_dic) logger.debug("Mcu definitions: %s" % mcu_def_dic) self._ewp_set_target(ewp_configuration['settings'], mcu_def_dic) try: debugger = proj_def.get_debugger(expanded_dic['target']) self._ewd_set_debugger( ewd_dic['project']['configuration']['settings'], debugger) except KeyError as err: # TODO: worth reporting? pass # overwrite debugger only if defined in the project file, otherwise use either default or from template if expanded_dic['debugger']: try: self._ewd_set_debugger( ewd_dic['project']['configuration']['settings'], expanded_dic['debugger']) except KeyError: raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger']) self._ewd_set_name(ewd_dic['project']['configuration'], expanded_dic['name']) # IAR uses ident 2 spaces, encoding iso-8859-1 ewp_xml = xmltodict.unparse(ewp_dic, encoding='iso-8859-1', pretty=True, indent=' ') project_path, ewp = self.gen_file_raw( ewp_xml, '%s.ewp' % expanded_dic['name'], expanded_dic['output_dir']['path']) ewd_xml = xmltodict.unparse(ewd_dic, encoding='iso-8859-1', pretty=True, indent=' ') project_path, ewd = self.gen_file_raw( ewd_xml, '%s.ewd' % expanded_dic['name'], expanded_dic['output_dir']['path']) return project_path, [ewp, eww, ewd]