Clone of official tools
Diff: export/iar.py
- Revision:
- 35:da9c89f8be7d
- Parent:
- 34:42f20e28adf5
- Child:
- 36:96847d42f010
--- a/export/iar.py Mon Feb 13 09:29:13 2017 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -""" -mbed SDK -Copyright (c) 2011-2015 ARM Limited - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" -import re -import os -from project_generator_definitions.definitions import ProGenDef - -from tools.export.exporters import Exporter, ExporterTargetsProperty -from tools.targets import TARGET_MAP, TARGET_NAMES - -# If you wish to add a new target, add it to project_generator_definitions, and then -# define progen_target name in the target class (`` self.progen_target = 'my_target_name' ``) -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 - - @ExporterTargetsProperty - def TARGETS(cls): - if not hasattr(cls, "_targets_supported"): - cls._targets_supported = [] - progendef = ProGenDef('iar') - 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 generate(self, progen_build=False): - """ 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') - if progen_build: - self.progen_gen_file('iar_arm', project_data, True) - else: - self.progen_gen_file('iar_arm', project_data) - -# Currently not used, we should reuse folder_name to create virtual folders -class IarFolder(): - """ - This is a recursive folder object. - To present the folder structure in the IDE as it is presented on the disk. - This can be used for uvision as well if you replace the __str__ method. - Example: - files: ./main.cpp, ./apis/I2C.h, ./mbed/common/I2C.cpp - in the project this would look like: - main.cpp - common/I2C.cpp - input: - folder_level : folder path to current folder - folder_name : name of current folder - source_files : list of source_files (all must be in same directory) - """ - def __init__(self, folder_level, folder_name, source_files): - self.folder_level = folder_level - self.folder_name = folder_name - self.source_files = source_files - self.sub_folders = {} - - def __str__(self): - """ - converts the folder structue to IAR project format. - """ - group_start = "" - group_end = "" - if self.folder_name != "": - group_start = "<group>\n<name>%s</name>\n" %(self.folder_name) - group_end = "</group>\n" - - str_content = group_start - #Add files in current folder - if self.source_files: - for src in self.source_files: - str_content += "<file>\n<name>$PROJ_DIR$/%s</name>\n</file>\n" % src - #Add sub folders - if self.sub_folders: - for folder_name in self.sub_folders.iterkeys(): - str_content += self.sub_folders[folder_name].__str__() - - str_content += group_end - return str_content - - def insert_file(self, source_input): - """ - Inserts a source file into the folder tree - """ - if self.source_files: - #All source_files in a IarFolder must be in same directory. - dir_sources = IarFolder.get_directory(self.source_files[0]) - #Check if sources are already at their deepest level. - if not self.folder_level == dir_sources: - _reg_exp = r"^" + re.escape(self.folder_level) + r"[/\\]?([^/\\]+)" - folder_name = re.match(_reg_exp, dir_sources).group(1) - self.sub_folders[folder_name] = IarFolder(os.path.join(self.folder_level, folder_name), folder_name, self.source_files) - self.source_files = [] - - dir_input = IarFolder.get_directory(source_input) - if dir_input == self.folder_level: - self.source_files.append(source_input) - else: - _reg_exp = r"^" + re.escape(self.folder_level) + r"[/\\]?([^/\\]+)" - folder_name = re.match(_reg_exp, dir_input).group(1) - if self.sub_folders.has_key(folder_name): - self.sub_folders[folder_name].insert_file(source_input) - else: - if self.folder_level == "": - #Top level exception - self.sub_folders[folder_name] = IarFolder(folder_name, folder_name, [source_input]) - else: - self.sub_folders[folder_name] = IarFolder(os.path.join(self.folder_level, folder_name), folder_name, [source_input]) - - @staticmethod - def get_directory(file_path): - """ - Returns the directory of the file - """ - return os.path.dirname(file_path)