joey shelton / LED_Demo

Dependencies:   MAX44000 PWM_Tone_Library nexpaq_mdk

Fork of LED_Demo by Maxim nexpaq

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers iar.py Source File

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)