Clone of official tools

Revision:
13:ab47a20b66f0
Parent:
7:5af61d55adbe
Child:
20:835f6355470d
--- a/toolchains/arm.py	Tue Jun 14 11:33:06 2016 +0100
+++ b/toolchains/arm.py	Thu Jul 14 20:21:19 2016 +0100
@@ -21,9 +21,9 @@
 from tools.settings import ARM_BIN, ARM_INC, ARM_LIB, MY_ARM_CLIB, ARM_CPPLIB, GOANNA_PATH
 from tools.hooks import hook_tool
 from tools.utils import mkdir
+import copy
 
 class ARM(mbedToolchain):
-    PROFILE = {}
     LINKER_EXT = '.sct'
     LIBRARY_EXT = '.ar'
 
@@ -31,42 +31,52 @@
     DIAGNOSTIC_PATTERN  = re.compile('"(?P<file>[^"]+)", line (?P<line>\d+)( \(column (?P<column>\d+)\)|): (?P<severity>Warning|Error): (?P<message>.+)')
     DEP_PATTERN = re.compile('\S+:\s(?P<file>.+)\n')
 
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False, profile=None):
-        mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose, profile=profile)
+
+    DEFAULT_FLAGS = {
+        'common': ["-c", "--gnu",
+            "-Otime", "--split_sections", "--apcs=interwork",
+            "--brief_diagnostics", "--restrict", "--multibyte_chars", "-I \""+ARM_INC+"\""],
+        'asm': [],
+        'c': ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"],
+        'cxx': ["--cpp", "--no_rtti", "--no_vla"],
+        'ld': [],
+    }
+
+    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
+        mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
 
         if target.core == "Cortex-M0+":
             cpu = "Cortex-M0"
         elif target.core == "Cortex-M4F":
             cpu = "Cortex-M4.fp"
+        elif target.core == "Cortex-M7FD":
+            cpu = "Cortex-M7.fp.dp"
         elif target.core == "Cortex-M7F":
             cpu = "Cortex-M7.fp.sp"
         else:
             cpu = target.core
 
         main_cc = join(ARM_BIN, "armcc")
-        common = self.PROFILE.get('COMMON_FLAGS', ["-c", "--gnu", "-O3",
-            "-Otime", "--split_sections", "--apcs=interwork",
-        ])
-        common.extend(["--cpu=%s" % cpu, "--brief_diagnostics", "--restrict", "--multibyte_chars"])
-        common.extend(['-I%s' % ARM_INC])
 
+        self.flags['common'] += ["--cpu=%s" % cpu]
         if "save-asm" in self.options:
-            common.extend(["--asm", "--interleave"])
+            self.flags['common'].extend(["--asm", "--interleave"])
 
         if "debug-info" in self.options:
-            common.append("-O0")
+            self.flags['common'].append("-g")
+            self.flags['c'].append("-O0")
         else:
-            common.append("-O3")
-
-        # add debug symbols for all builds
-        common.append("-g")
+            self.flags['c'].append("-O3")
 
-        common_c = self.PROFILE.get('COMMON_C_FLAGS', ["--no_depend_system_headers"]) + ['--md']
+        self.asm = [main_cc] + self.flags['common'] + self.flags['asm']
+        if not "analyze" in self.options:
+            self.cc = [main_cc] + self.flags['common'] + self.flags['c']
+            self.cppc = [main_cc] + self.flags['common'] + self.flags['c'] + self.flags['cxx']
+        else:
+            self.cc  = [join(GOANNA_PATH, "goannacc"), "--with-cc=" + main_cc.replace('\\', '/'), "--dialect=armcc", '--output-format="%s"' % self.GOANNA_FORMAT] + self.flags['common'] + self.flags['c'] 
+            self.cppc= [join(GOANNA_PATH, "goannac++"), "--with-cxx=" + main_cc.replace('\\', '/'), "--dialect=armcc", '--output-format="%s"' % self.GOANNA_FORMAT] + self.flags['common'] + self.flags['c'] + self.flags['cxx']
 
-        self.asm =  [main_cc] + common
-        self.cc =   [main_cc] + common + common_c + self.PROFILE.get('COMMON_CC_FLAGS', ["--c99"])
-        self.cppc = [main_cc] + common + common_c + self.PROFILE.get('COMMON_CPP_FLAGS', ["--cpp", "--no_rtti"])
-        self.ld =   [join(ARM_BIN, "armlink")] + self.PROFILE.get('COMMON_LD_FLAGS', [])
+        self.ld = [join(ARM_BIN, "armlink")]
         self.sys_libs = []
 
         self.ar = join(ARM_BIN, "armar")
@@ -106,8 +116,15 @@
         dep_path = base + '.d'
         return ["--depend", dep_path]
 
+    def get_config_option(self, config_header) :
+        return ['--preinclude=' + config_header]
+
     def get_compile_options(self, defines, includes):        
-        return ['-D%s' % d for d in defines] + ['--via', self.get_inc_file(includes)]
+        opts = ['-D%s' % d for d in defines] + ['--via', self.get_inc_file(includes)]
+        config_header = self.get_config_header()
+        if config_header is not None:
+            opts = opts + self.get_config_option(config_header)
+        return opts
 
     @hook_tool
     def assemble(self, source, object, includes):
@@ -206,31 +223,41 @@
 
 
 class ARM_STD(ARM):
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False, profile=None):
-        ARM.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose, profile=profile)
-        self.cc   += ["-D__ASSERT_MSG"]
-        self.cppc += ["-D__ASSERT_MSG"]
-        self.ld.extend(["--libpath", ARM_LIB])
+    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
+        ARM.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
+
+        # Run-time values
+        self.ld.extend(["--libpath \"%s\"" % ARM_LIB])
 
 
 class ARM_MICRO(ARM):
     PATCHED_LIBRARY = False
 
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False, profile=None):
-        ARM.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose, profile=profile)
+    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
+        ARM.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
 
-        # Compiler
+        # Extend flags
+        self.flags['common'].extend(["-D__MICROLIB"])
+        self.flags['c'].extend(["--library_type=microlib"])
+        self.flags['ld'].extend(["--library_type=microlib"])
+
+        # Run-time values
         self.asm  += ["-D__MICROLIB"]
-        self.cc   += ["--library_type=microlib", "-D__MICROLIB", "-D__ASSERT_MSG"]
-        self.cppc += ["--library_type=microlib", "-D__MICROLIB", "-D__ASSERT_MSG"]
+        self.cc   += ["-D__MICROLIB", "--library_type=microlib"]
+        self.cppc += ["-D__MICROLIB", "--library_type=microlib"]
+        self.ld   += ["--library_type=microlib"]
 
-        # Linker
-        self.ld.append("--library_type=microlib")
+        # Only allow a single thread
+        self.cc += ["-DMBED_RTOS_SINGLE_THREAD"]
+        self.cppc += ["-DMBED_RTOS_SINGLE_THREAD"]
 
         # We had to patch microlib to add C++ support
         # In later releases this patch should have entered mainline
         if ARM_MICRO.PATCHED_LIBRARY:
-            self.ld.append("--noscanlib")
+            # Run-time values
+            self.flags['ld'].extend(["--noscanlib"])
+            # Run-time values
+            self.ld   += ["--noscanlib"]
 
             # System Libraries
             self.sys_libs.extend([join(MY_ARM_CLIB, lib+".l") for lib in ["mc_p", "mf_p", "m_ps"]])
@@ -241,4 +268,5 @@
             elif target.core in ["Cortex-M0", "Cortex-M0+"]:
                 self.sys_libs.extend([join(ARM_CPPLIB, lib+".l") for lib in ["cpp_ps", "cpprt_p"]])
         else:
-            self.ld.extend(["--libpath", ARM_LIB])
+            # Run-time values
+            self.ld.extend(["--libpath \"%s\"" % ARM_LIB])