dhgdh

Dependencies:   MAX44000 PWM_Tone_Library nexpaq_mdk

Fork of LED_Demo by joey shelton

Revision:
1:55a6170b404f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbd_os/tools/export/iar.py	Sat Sep 17 16:32:05 2016 +0000
@@ -0,0 +1,150 @@
+"""
+mbed SDK
+Copyright (c) 2011-2016 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_arm'
+    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):
+        """ Generates the project files """
+        project_data = self.progen_get_project_data()
+        try:
+            if TARGET_MAP[self.target].progen['iar']['template']:
+                project_data['template']=TARGET_MAP[self.target].progen['iar']['template']
+        except KeyError:
+            # use default template
+            # by the mbed projects
+            project_data['template']=[os.path.join(os.path.dirname(__file__), 'iar_template.ewp.tmpl')]
+
+        project_data['misc'] = self.flags
+        # VLA is enabled via template IccAllowVLA
+        project_data['misc']['c_flags'].remove("--vla")
+        project_data['misc']['asm_flags'] = list(set(project_data['misc']['asm_flags']))
+        project_data['build_dir'] = os.path.join(project_data['build_dir'], 'iar_arm')
+        self.progen_gen_file(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)