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.
__init__.py
00001 import os 00002 from os.path import sep, join, exists 00003 from collections import namedtuple 00004 from subprocess import Popen, PIPE 00005 from distutils.spawn import find_executable 00006 import re 00007 import sys 00008 00009 from tools.targets import TARGET_MAP 00010 from tools.export.exporters import Exporter, FailedBuildException 00011 import json 00012 from tools.export.cmsis import DeviceCMSIS 00013 00014 class IAR(Exporter): 00015 NAME = 'iar' 00016 TOOLCHAIN = 'IAR' 00017 00018 #iar_definitions.json location 00019 def_loc = os.path.join( 00020 os.path.dirname(os.path.abspath(__file__)), '..', '..', '..', 00021 'tools','export', 'iar', 'iar_definitions.json') 00022 00023 #create a dictionary of the definitions 00024 with open(def_loc, 'r') as f: 00025 IAR_DEFS = json.load(f) 00026 00027 #supported targets have a device name and corresponding definition in 00028 #iar_definitions.json 00029 TARGETS = [target for target, obj in TARGET_MAP.iteritems() 00030 if hasattr(obj, 'device_name') and 00031 obj.device_name in IAR_DEFS.keys()] 00032 00033 SPECIAL_TEMPLATES = { 00034 'rz_a1h' : 'iar/iar_rz_a1h.ewp.tmpl', 00035 'nucleo_f746zg' : 'iar/iar_nucleo_f746zg.ewp.tmpl' 00036 } 00037 00038 def iar_groups(self, grouped_src): 00039 """Return a namedtuple of group info 00040 Positional Arguments: 00041 grouped_src: dictionary mapping a group(str) to sources 00042 within it (list of file names) 00043 Relevant part of IAR template 00044 {% for group in groups %} 00045 <group> 00046 <name>group.name</name> 00047 {% for file in group.files %} 00048 <file> 00049 <name>$PROJ_DIR${{file}}</name> 00050 </file> 00051 {% endfor %} 00052 </group> 00053 {% endfor %} 00054 """ 00055 IARgroup = namedtuple('IARgroup', ['name','files']) 00056 groups = [] 00057 for name, files in grouped_src.items(): 00058 groups.append(IARgroup(name,files)) 00059 return groups 00060 00061 def iar_device(self): 00062 """Retrieve info from iar_definitions.json""" 00063 device_name = TARGET_MAP[self.target].device_name 00064 device_info = self.IAR_DEFS[device_name] 00065 iar_defaults ={ 00066 "OGChipSelectEditMenu": "", 00067 "CoreVariant": '', 00068 "GFPUCoreSlave": '', 00069 "GFPUCoreSlave2": 40, 00070 "GBECoreSlave": 35 00071 } 00072 00073 iar_defaults.update(device_info) 00074 IARdevice = namedtuple('IARdevice', iar_defaults.keys()) 00075 return IARdevice(**iar_defaults) 00076 00077 def format_file(self, file): 00078 """Make IAR compatible path""" 00079 return join('$PROJ_DIR$',file) 00080 00081 def format_src(self, srcs): 00082 """Group source files""" 00083 grouped = self.group_project_files(srcs) 00084 for group, files in grouped.items(): 00085 grouped[group] = [self.format_file(src) for src in files] 00086 return grouped 00087 00088 def get_ewp_template(self): 00089 return self.SPECIAL_TEMPLATES.get(self.target.lower(), 'iar/ewp.tmpl') 00090 00091 def generate(self): 00092 """Generate the .eww, .ewd, and .ewp files""" 00093 srcs = self.resources.headers + self.resources.s_sources + \ 00094 self.resources.c_sources + self.resources.cpp_sources + \ 00095 self.resources.objects + self.resources.libraries 00096 flags = self.flags 00097 flags['c_flags'] = list(set(flags['common_flags'] 00098 + flags['c_flags'] 00099 + flags['cxx_flags'])) 00100 if '--vla' in flags['c_flags']: 00101 flags['c_flags'].remove('--vla') 00102 if '--no_static_destruction' in flags['c_flags']: 00103 flags['c_flags'].remove('--no_static_destruction') 00104 #Optimizations 00105 if '-Oh' in flags['c_flags']: 00106 flags['c_flags'].remove('-Oh') 00107 ctx = { 00108 'name': self.project_name, 00109 'groups': self.iar_groups(self.format_src(srcs)), 00110 'linker_script': self.format_file(self.resources.linker_script), 00111 'include_paths': [self.format_file(src) for src in self.resources.inc_dirs], 00112 'device': self.iar_device(), 00113 'ewp': sep+self.project_name + ".ewp", 00114 'debugger': DeviceCMSIS(self.target).debug.replace('-','').upper() 00115 } 00116 ctx.update(flags) 00117 00118 self.gen_file('iar/eww.tmpl', ctx, self.project_name+".eww") 00119 self.gen_file('iar/ewd.tmpl', ctx, self.project_name + ".ewd") 00120 self.gen_file(self.get_ewp_template(), ctx, self.project_name + ".ewp") 00121 00122 def build(self): 00123 """ Build IAR project """ 00124 # > IarBuild [project_path] -build [project_name] 00125 proj_file = join(self.export_dir, self.project_name + ".ewp") 00126 00127 if find_executable("IarBuild"): 00128 iar_exe = "IarBuild.exe" 00129 else: 00130 iar_exe = join('C:', sep, 00131 'Program Files (x86)', 'IAR Systems', 00132 'Embedded Workbench 7.5', 'common', 'bin', 00133 'IarBuild.exe') 00134 if not exists(iar_exe): 00135 raise Exception("IarBuild.exe not found. Add to path.") 00136 00137 cmd = [iar_exe, proj_file, '-build', self.project_name] 00138 p = Popen(cmd, stdout=PIPE, stderr=PIPE) 00139 num_errors = 0 00140 #Parse the output for printing and errors 00141 for line in p.stdout.readlines(): 00142 sys.stdout.write(line) 00143 error_re = '\s*Total number of errors:\s*(\d+)\s*' 00144 m = re.match(error_re, line) 00145 if m is not None: 00146 num_errors = int(m.group(1)) 00147 if num_errors !=0: 00148 # Seems like something went wrong. 00149 raise FailedBuildException("Project: %s build failed with %s erros" % ( 00150 proj_file, num_errors))
Generated on Tue Jul 12 2022 17:34:33 by
1.7.2