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.
export/iar.py@13:ab47a20b66f0, 2016-07-14 (annotated)
- Committer:
- screamer
- Date:
- Thu Jul 14 20:21:19 2016 +0100
- Revision:
- 13:ab47a20b66f0
- Parent:
- 0:66f3b5499f7f
- Child:
- 23:fbae331171fa
Apply latest tools
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| screamer | 0:66f3b5499f7f | 1 | """ |
| screamer | 0:66f3b5499f7f | 2 | mbed SDK |
| screamer | 0:66f3b5499f7f | 3 | Copyright (c) 2011-2015 ARM Limited |
| screamer | 0:66f3b5499f7f | 4 | |
| screamer | 0:66f3b5499f7f | 5 | Licensed under the Apache License, Version 2.0 (the "License"); |
| screamer | 0:66f3b5499f7f | 6 | you may not use this file except in compliance with the License. |
| screamer | 0:66f3b5499f7f | 7 | You may obtain a copy of the License at |
| screamer | 0:66f3b5499f7f | 8 | |
| screamer | 0:66f3b5499f7f | 9 | http://www.apache.org/licenses/LICENSE-2.0 |
| screamer | 0:66f3b5499f7f | 10 | |
| screamer | 0:66f3b5499f7f | 11 | Unless required by applicable law or agreed to in writing, software |
| screamer | 0:66f3b5499f7f | 12 | distributed under the License is distributed on an "AS IS" BASIS, |
| screamer | 0:66f3b5499f7f | 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| screamer | 0:66f3b5499f7f | 14 | See the License for the specific language governing permissions and |
| screamer | 0:66f3b5499f7f | 15 | limitations under the License. |
| screamer | 0:66f3b5499f7f | 16 | """ |
| screamer | 0:66f3b5499f7f | 17 | import re |
| screamer | 0:66f3b5499f7f | 18 | import os |
| screamer | 0:66f3b5499f7f | 19 | from project_generator_definitions.definitions import ProGenDef |
| screamer | 0:66f3b5499f7f | 20 | |
| screamer | 0:66f3b5499f7f | 21 | from tools.export.exporters import Exporter |
| screamer | 0:66f3b5499f7f | 22 | from tools.targets import TARGET_MAP, TARGET_NAMES |
| screamer | 0:66f3b5499f7f | 23 | |
| screamer | 0:66f3b5499f7f | 24 | # If you wish to add a new target, add it to project_generator_definitions, and then |
| screamer | 0:66f3b5499f7f | 25 | # define progen_target name in the target class (`` self.progen_target = 'my_target_name' ``) |
| screamer | 0:66f3b5499f7f | 26 | class IAREmbeddedWorkbench(Exporter): |
| screamer | 0:66f3b5499f7f | 27 | """ |
| screamer | 0:66f3b5499f7f | 28 | Exporter class for IAR Systems. This class uses project generator. |
| screamer | 0:66f3b5499f7f | 29 | """ |
| screamer | 0:66f3b5499f7f | 30 | # These 2 are currently for exporters backward compatiblity |
| screamer | 0:66f3b5499f7f | 31 | NAME = 'IAR' |
| screamer | 0:66f3b5499f7f | 32 | TOOLCHAIN = 'IAR' |
| screamer | 0:66f3b5499f7f | 33 | # PROGEN_ACTIVE contains information for exporter scripts that this is using progen |
| screamer | 0:66f3b5499f7f | 34 | PROGEN_ACTIVE = True |
| screamer | 0:66f3b5499f7f | 35 | |
| screamer | 13:ab47a20b66f0 | 36 | MBED_CONFIG_HEADER_SUPPORTED = True |
| screamer | 13:ab47a20b66f0 | 37 | |
| screamer | 0:66f3b5499f7f | 38 | # backward compatibility with our scripts |
| screamer | 0:66f3b5499f7f | 39 | TARGETS = [] |
| screamer | 0:66f3b5499f7f | 40 | for target in TARGET_NAMES: |
| screamer | 0:66f3b5499f7f | 41 | try: |
| screamer | 0:66f3b5499f7f | 42 | if (ProGenDef('iar').is_supported(str(TARGET_MAP[target])) or |
| screamer | 0:66f3b5499f7f | 43 | ProGenDef('iar').is_supported(TARGET_MAP[target].progen['target'])): |
| screamer | 0:66f3b5499f7f | 44 | TARGETS.append(target) |
| screamer | 0:66f3b5499f7f | 45 | except AttributeError: |
| screamer | 0:66f3b5499f7f | 46 | # target is not supported yet |
| screamer | 0:66f3b5499f7f | 47 | continue |
| screamer | 0:66f3b5499f7f | 48 | |
| screamer | 0:66f3b5499f7f | 49 | def generate(self): |
| screamer | 0:66f3b5499f7f | 50 | """ Generates the project files """ |
| screamer | 0:66f3b5499f7f | 51 | project_data = self.progen_get_project_data() |
| screamer | 0:66f3b5499f7f | 52 | tool_specific = {} |
| screamer | 0:66f3b5499f7f | 53 | # Expand tool specific settings by IAR specific settings which are required |
| screamer | 0:66f3b5499f7f | 54 | try: |
| screamer | 0:66f3b5499f7f | 55 | if TARGET_MAP[self.target].progen['iar']['template']: |
| screamer | 0:66f3b5499f7f | 56 | tool_specific['iar'] = TARGET_MAP[self.target].progen['iar'] |
| screamer | 0:66f3b5499f7f | 57 | except KeyError: |
| screamer | 0:66f3b5499f7f | 58 | # use default template |
| screamer | 0:66f3b5499f7f | 59 | # by the mbed projects |
| screamer | 0:66f3b5499f7f | 60 | tool_specific['iar'] = { |
| screamer | 0:66f3b5499f7f | 61 | # We currently don't use misc, template sets those for us |
| screamer | 0:66f3b5499f7f | 62 | # 'misc': { |
| screamer | 0:66f3b5499f7f | 63 | # 'cxx_flags': ['--no_rtti', '--no_exceptions'], |
| screamer | 0:66f3b5499f7f | 64 | # 'c_flags': ['--diag_suppress=Pa050,Pa084,Pa093,Pa082'], |
| screamer | 0:66f3b5499f7f | 65 | # 'ld_flags': ['--skip_dynamic_initialization'], |
| screamer | 0:66f3b5499f7f | 66 | # }, |
| screamer | 0:66f3b5499f7f | 67 | 'template': [os.path.join(os.path.dirname(__file__), 'iar_template.ewp.tmpl')], |
| screamer | 0:66f3b5499f7f | 68 | } |
| screamer | 0:66f3b5499f7f | 69 | |
| screamer | 0:66f3b5499f7f | 70 | project_data['tool_specific'] = {} |
| screamer | 13:ab47a20b66f0 | 71 | project_data['tool_specific'].setdefault("iar", {}) |
| screamer | 13:ab47a20b66f0 | 72 | project_data['tool_specific']['iar'].setdefault("misc", {}) |
| screamer | 13:ab47a20b66f0 | 73 | project_data['tool_specific']['iar'].update(tool_specific['iar']) |
| screamer | 13:ab47a20b66f0 | 74 | project_data['tool_specific']['iar']['misc'].update(self.progen_flags) |
| screamer | 13:ab47a20b66f0 | 75 | # VLA is enabled via template IccAllowVLA |
| screamer | 13:ab47a20b66f0 | 76 | project_data['tool_specific']['iar']['misc']['c_flags'].remove("--vla") |
| screamer | 0:66f3b5499f7f | 77 | project_data['common']['build_dir'] = os.path.join(project_data['common']['build_dir'], 'iar_arm') |
| screamer | 0:66f3b5499f7f | 78 | self.progen_gen_file('iar_arm', project_data) |
| screamer | 0:66f3b5499f7f | 79 | |
| screamer | 0:66f3b5499f7f | 80 | # Currently not used, we should reuse folder_name to create virtual folders |
| screamer | 0:66f3b5499f7f | 81 | class IarFolder(): |
| screamer | 0:66f3b5499f7f | 82 | """ |
| screamer | 0:66f3b5499f7f | 83 | This is a recursive folder object. |
| screamer | 0:66f3b5499f7f | 84 | To present the folder structure in the IDE as it is presented on the disk. |
| screamer | 0:66f3b5499f7f | 85 | This can be used for uvision as well if you replace the __str__ method. |
| screamer | 0:66f3b5499f7f | 86 | Example: |
| screamer | 0:66f3b5499f7f | 87 | files: ./main.cpp, ./apis/I2C.h, ./mbed/common/I2C.cpp |
| screamer | 0:66f3b5499f7f | 88 | in the project this would look like: |
| screamer | 0:66f3b5499f7f | 89 | main.cpp |
| screamer | 0:66f3b5499f7f | 90 | common/I2C.cpp |
| screamer | 0:66f3b5499f7f | 91 | input: |
| screamer | 0:66f3b5499f7f | 92 | folder_level : folder path to current folder |
| screamer | 0:66f3b5499f7f | 93 | folder_name : name of current folder |
| screamer | 0:66f3b5499f7f | 94 | source_files : list of source_files (all must be in same directory) |
| screamer | 0:66f3b5499f7f | 95 | """ |
| screamer | 0:66f3b5499f7f | 96 | def __init__(self, folder_level, folder_name, source_files): |
| screamer | 0:66f3b5499f7f | 97 | self.folder_level = folder_level |
| screamer | 0:66f3b5499f7f | 98 | self.folder_name = folder_name |
| screamer | 0:66f3b5499f7f | 99 | self.source_files = source_files |
| screamer | 0:66f3b5499f7f | 100 | self.sub_folders = {} |
| screamer | 0:66f3b5499f7f | 101 | |
| screamer | 0:66f3b5499f7f | 102 | def __str__(self): |
| screamer | 0:66f3b5499f7f | 103 | """ |
| screamer | 0:66f3b5499f7f | 104 | converts the folder structue to IAR project format. |
| screamer | 0:66f3b5499f7f | 105 | """ |
| screamer | 0:66f3b5499f7f | 106 | group_start = "" |
| screamer | 0:66f3b5499f7f | 107 | group_end = "" |
| screamer | 0:66f3b5499f7f | 108 | if self.folder_name != "": |
| screamer | 0:66f3b5499f7f | 109 | group_start = "<group>\n<name>%s</name>\n" %(self.folder_name) |
| screamer | 0:66f3b5499f7f | 110 | group_end = "</group>\n" |
| screamer | 0:66f3b5499f7f | 111 | |
| screamer | 0:66f3b5499f7f | 112 | str_content = group_start |
| screamer | 0:66f3b5499f7f | 113 | #Add files in current folder |
| screamer | 0:66f3b5499f7f | 114 | if self.source_files: |
| screamer | 0:66f3b5499f7f | 115 | for src in self.source_files: |
| screamer | 0:66f3b5499f7f | 116 | str_content += "<file>\n<name>$PROJ_DIR$/%s</name>\n</file>\n" % src |
| screamer | 0:66f3b5499f7f | 117 | #Add sub folders |
| screamer | 0:66f3b5499f7f | 118 | if self.sub_folders: |
| screamer | 0:66f3b5499f7f | 119 | for folder_name in self.sub_folders.iterkeys(): |
| screamer | 0:66f3b5499f7f | 120 | str_content += self.sub_folders[folder_name].__str__() |
| screamer | 0:66f3b5499f7f | 121 | |
| screamer | 0:66f3b5499f7f | 122 | str_content += group_end |
| screamer | 0:66f3b5499f7f | 123 | return str_content |
| screamer | 0:66f3b5499f7f | 124 | |
| screamer | 0:66f3b5499f7f | 125 | def insert_file(self, source_input): |
| screamer | 0:66f3b5499f7f | 126 | """ |
| screamer | 0:66f3b5499f7f | 127 | Inserts a source file into the folder tree |
| screamer | 0:66f3b5499f7f | 128 | """ |
| screamer | 0:66f3b5499f7f | 129 | if self.source_files: |
| screamer | 0:66f3b5499f7f | 130 | #All source_files in a IarFolder must be in same directory. |
| screamer | 0:66f3b5499f7f | 131 | dir_sources = IarFolder.get_directory(self.source_files[0]) |
| screamer | 0:66f3b5499f7f | 132 | #Check if sources are already at their deepest level. |
| screamer | 0:66f3b5499f7f | 133 | if not self.folder_level == dir_sources: |
| screamer | 0:66f3b5499f7f | 134 | _reg_exp = r"^" + re.escape(self.folder_level) + r"[/\\]?([^/\\]+)" |
| screamer | 0:66f3b5499f7f | 135 | folder_name = re.match(_reg_exp, dir_sources).group(1) |
| screamer | 0:66f3b5499f7f | 136 | self.sub_folders[folder_name] = IarFolder(os.path.join(self.folder_level, folder_name), folder_name, self.source_files) |
| screamer | 0:66f3b5499f7f | 137 | self.source_files = [] |
| screamer | 0:66f3b5499f7f | 138 | |
| screamer | 0:66f3b5499f7f | 139 | dir_input = IarFolder.get_directory(source_input) |
| screamer | 0:66f3b5499f7f | 140 | if dir_input == self.folder_level: |
| screamer | 0:66f3b5499f7f | 141 | self.source_files.append(source_input) |
| screamer | 0:66f3b5499f7f | 142 | else: |
| screamer | 0:66f3b5499f7f | 143 | _reg_exp = r"^" + re.escape(self.folder_level) + r"[/\\]?([^/\\]+)" |
| screamer | 0:66f3b5499f7f | 144 | folder_name = re.match(_reg_exp, dir_input).group(1) |
| screamer | 0:66f3b5499f7f | 145 | if self.sub_folders.has_key(folder_name): |
| screamer | 0:66f3b5499f7f | 146 | self.sub_folders[folder_name].insert_file(source_input) |
| screamer | 0:66f3b5499f7f | 147 | else: |
| screamer | 0:66f3b5499f7f | 148 | if self.folder_level == "": |
| screamer | 0:66f3b5499f7f | 149 | #Top level exception |
| screamer | 0:66f3b5499f7f | 150 | self.sub_folders[folder_name] = IarFolder(folder_name, folder_name, [source_input]) |
| screamer | 0:66f3b5499f7f | 151 | else: |
| screamer | 0:66f3b5499f7f | 152 | self.sub_folders[folder_name] = IarFolder(os.path.join(self.folder_level, folder_name), folder_name, [source_input]) |
| screamer | 0:66f3b5499f7f | 153 | |
| screamer | 0:66f3b5499f7f | 154 | @staticmethod |
| screamer | 0:66f3b5499f7f | 155 | def get_directory(file_path): |
| screamer | 0:66f3b5499f7f | 156 | """ |
| screamer | 0:66f3b5499f7f | 157 | Returns the directory of the file |
| screamer | 0:66f3b5499f7f | 158 | """ |
| screamer | 0:66f3b5499f7f | 159 | return os.path.dirname(file_path) |