Ejemplo n.º 1
0
    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
Ejemplo n.º 3
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]
            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]
Ejemplo n.º 4
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]
Ejemplo n.º 5
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'])
Ejemplo n.º 6
0
    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]
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
Ejemplo n.º 8
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'
Ejemplo n.º 9
0
    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'
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
 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
Ejemplo n.º 14
0
 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
Ejemplo n.º 15
0
 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
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
    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())
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
    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]
Ejemplo n.º 20
0
    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]
Ejemplo n.º 21
0
        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'
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
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')
Ejemplo n.º 29
0
    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 setUp(self):
     self.definitions = ProGenDef('novalid')
Ejemplo n.º 31
0
    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]