Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MAX44000 PWM_Tone_Library nexpaq_mdk
Fork of LED_Demo by
iar.py
00001 """ 00002 mbed SDK 00003 Copyright (c) 2011-2016 ARM Limited 00004 00005 Licensed under the Apache License, Version 2.0 (the "License"); 00006 you may not use this file except in compliance with the License. 00007 You may obtain a copy of the License at 00008 00009 http://www.apache.org/licenses/LICENSE-2.0 00010 00011 Unless required by applicable law or agreed to in writing, software 00012 distributed under the License is distributed on an "AS IS" BASIS, 00013 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 See the License for the specific language governing permissions and 00015 limitations under the License. 00016 """ 00017 import re 00018 import os 00019 from project_generator_definitions.definitions import ProGenDef 00020 00021 from tools.export.exporters import Exporter, ExporterTargetsProperty 00022 from tools.targets import TARGET_MAP, TARGET_NAMES 00023 00024 # If you wish to add a new target, add it to project_generator_definitions, and then 00025 # define progen_target name in the target class (`` self.progen_target = 'my_target_name' ``) 00026 class IAREmbeddedWorkbench (Exporter ): 00027 """ 00028 Exporter class for IAR Systems. This class uses project generator. 00029 """ 00030 # These 2 are currently for exporters backward compatiblity 00031 NAME = 'iar_arm' 00032 TOOLCHAIN = 'IAR' 00033 # PROGEN_ACTIVE contains information for exporter scripts that this is using progen 00034 PROGEN_ACTIVE = True 00035 00036 MBED_CONFIG_HEADER_SUPPORTED = True 00037 00038 @ExporterTargetsProperty 00039 def TARGETS(cls): 00040 if not hasattr(cls, "_targets_supported"): 00041 cls._targets_supported = [] 00042 progendef = ProGenDef('iar') 00043 for target in TARGET_NAMES: 00044 try: 00045 if (progendef.is_supported(str(TARGET_MAP[target])) or 00046 progendef.is_supported(TARGET_MAP[target].progen['target'])): 00047 cls._targets_supported.append(target) 00048 except AttributeError: 00049 # target is not supported yet 00050 continue 00051 return cls._targets_supported 00052 00053 def generate (self): 00054 """ Generates the project files """ 00055 project_data = self.progen_get_project_data() 00056 try: 00057 if TARGET_MAP[self.target].progen['iar']['template']: 00058 project_data['template']=TARGET_MAP[self.target].progen['iar']['template'] 00059 except KeyError: 00060 # use default template 00061 # by the mbed projects 00062 project_data['template']=[os.path.join(os.path.dirname(__file__), 'iar_template.ewp.tmpl')] 00063 00064 project_data['misc'] = self.flags 00065 # VLA is enabled via template IccAllowVLA 00066 project_data['misc']['c_flags'].remove("--vla") 00067 project_data['misc']['asm_flags'] = list(set(project_data['misc']['asm_flags'])) 00068 project_data['build_dir'] = os.path.join(project_data['build_dir'], 'iar_arm') 00069 self.progen_gen_file(project_data) 00070 00071 # Currently not used, we should reuse folder_name to create virtual folders 00072 class IarFolder (): 00073 """ 00074 This is a recursive folder object. 00075 To present the folder structure in the IDE as it is presented on the disk. 00076 This can be used for uvision as well if you replace the __str__ method. 00077 Example: 00078 files: ./main.cpp, ./apis/I2C.h, ./mbed/common/I2C.cpp 00079 in the project this would look like: 00080 main.cpp 00081 common/I2C.cpp 00082 input: 00083 folder_level : folder path to current folder 00084 folder_name : name of current folder 00085 source_files : list of source_files (all must be in same directory) 00086 """ 00087 def __init__(self, folder_level, folder_name, source_files): 00088 self.folder_level = folder_level 00089 self.folder_name = folder_name 00090 self.source_files = source_files 00091 self.sub_folders = {} 00092 00093 def __str__ (self): 00094 """ 00095 converts the folder structue to IAR project format. 00096 """ 00097 group_start = "" 00098 group_end = "" 00099 if self.folder_name != "": 00100 group_start = "<group>\n<name>%s</name>\n" %(self.folder_name ) 00101 group_end = "</group>\n" 00102 00103 str_content = group_start 00104 #Add files in current folder 00105 if self.source_files : 00106 for src in self.source_files : 00107 str_content += "<file>\n<name>$PROJ_DIR$/%s</name>\n</file>\n" % src 00108 #Add sub folders 00109 if self.sub_folders : 00110 for folder_name in self.sub_folders .iterkeys(): 00111 str_content += self.sub_folders [folder_name].__str__() 00112 00113 str_content += group_end 00114 return str_content 00115 00116 def insert_file (self, source_input): 00117 """ 00118 Inserts a source file into the folder tree 00119 """ 00120 if self.source_files : 00121 #All source_files in a IarFolder must be in same directory. 00122 dir_sources = IarFolder.get_directory(self.source_files [0]) 00123 #Check if sources are already at their deepest level. 00124 if not self.folder_level == dir_sources: 00125 _reg_exp = r"^" + re.escape(self.folder_level ) + r"[/\\]?([^/\\]+)" 00126 folder_name = re.match(_reg_exp, dir_sources).group(1) 00127 self.sub_folders [folder_name] = IarFolder(os.path.join(self.folder_level , folder_name), folder_name, self.source_files ) 00128 self.source_files = [] 00129 00130 dir_input = IarFolder.get_directory(source_input) 00131 if dir_input == self.folder_level : 00132 self.source_files .append(source_input) 00133 else: 00134 _reg_exp = r"^" + re.escape(self.folder_level ) + r"[/\\]?([^/\\]+)" 00135 folder_name = re.match(_reg_exp, dir_input).group(1) 00136 if self.sub_folders .has_key(folder_name): 00137 self.sub_folders [folder_name].insert_file(source_input) 00138 else: 00139 if self.folder_level == "": 00140 #Top level exception 00141 self.sub_folders [folder_name] = IarFolder(folder_name, folder_name, [source_input]) 00142 else: 00143 self.sub_folders [folder_name] = IarFolder(os.path.join(self.folder_level , folder_name), folder_name, [source_input]) 00144 00145 @staticmethod 00146 def get_directory (file_path): 00147 """ 00148 Returns the directory of the file 00149 """ 00150 return os.path.dirname(file_path)
Generated on Tue Jul 12 2022 12:28:32 by
1.7.2
