Clone of official tools

Revision:
31:8ea194f6145b
Parent:
30:f12ce67666d0
Child:
35:da9c89f8be7d
--- a/toolchains/gcc.py	Mon Aug 29 11:56:59 2016 +0100
+++ b/toolchains/gcc.py	Wed Jan 04 11:58:24 2017 -0600
@@ -15,7 +15,7 @@
 limitations under the License.
 """
 import re
-from os.path import join, basename, splitext, dirname, exists
+from os.path import join, basename, splitext
 
 from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
 from tools.hooks import hook_tool
@@ -28,22 +28,23 @@
     DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(\d+:)? (?P<severity>warning|error): (?P<message>.+)')
     INDEX_PATTERN  = re.compile('(?P<col>\s*)\^')
 
-    DEFAULT_FLAGS = {
-        'common': ["-c", "-Wall", "-Wextra",
-            "-Wno-unused-parameter", "-Wno-missing-field-initializers",
-            "-fmessage-length=0", "-fno-exceptions", "-fno-builtin",
-            "-ffunction-sections", "-fdata-sections", "-funsigned-char",
-            "-MMD", "-fno-delete-null-pointer-checks", "-fomit-frame-pointer"
-            ],
-        'asm': ["-x", "assembler-with-cpp"],
-        'c': ["-std=gnu99"],
-        'cxx': ["-std=gnu++98", "-fno-rtti", "-Wvla"],
-        'ld': ["-Wl,--gc-sections", "-Wl,--wrap,main",
-            "-Wl,--wrap,_malloc_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r"],
-    }
+    def __init__(self, target,  notify=None, macros=None,
+                 silent=False, tool_path="", extra_verbose=False,
+                 build_profile=None):
+        mbedToolchain.__init__(self, target, notify, macros, silent,
+                               extra_verbose=extra_verbose,
+                               build_profile=build_profile)
 
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, tool_path="", extra_verbose=False):
-        mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
+        # Add flags for current size setting
+        default_lib = "std"
+        if hasattr(target, "default_lib"):
+            default_lib = target.default_lib
+        elif hasattr(target, "default_build"): # Legacy
+            default_lib = target.default_build
+
+        if default_lib == "small":
+            self.flags["common"].append("-DMBED_RTOS_SINGLE_THREAD")
+            self.flags["ld"].append("--specs=nano.specs")
 
         if target.core == "Cortex-M0+":
             cpu = "cortex-m0plus"
@@ -71,8 +72,6 @@
             self.cpu.append("-mfpu=fpv5-d16")
             self.cpu.append("-mfloat-abi=softfp")
 
-
-
         if target.core == "Cortex-A9":
             self.cpu.append("-mthumb-interwork")
             self.cpu.append("-marm")
@@ -81,20 +80,8 @@
             self.cpu.append("-mfloat-abi=hard")
             self.cpu.append("-mno-unaligned-access")
 
-
-        # Note: We are using "-O2" instead of "-Os" to avoid this known GCC bug:
-        # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46762
         self.flags["common"] += self.cpu
 
-        if "save-asm" in self.options:
-            self.flags["common"].append("-save-temps")
-
-        if "debug-info" in self.options:
-            self.flags["common"].append("-g")
-            self.flags["common"].append("-O0")
-        else:
-            self.flags["common"].append("-Os")
-
         main_cc = join(tool_path, "arm-none-eabi-gcc")
         main_cppc = join(tool_path, "arm-none-eabi-g++")
         self.asm = [main_cc] + self.flags['asm'] + self.flags["common"]
@@ -138,10 +125,11 @@
         # The warning/error notification is multiline
         msg = None
         for line in output.splitlines():
-            match = GCC.DIAGNOSTIC_PATTERN.match(line)
+            match = GCC.DIAGNOSTIC_PATTERN.search(line)
             if match is not None:
                 if msg is not None:
                     self.cc_info(msg)
+                    msg = None
                 msg = {
                     'severity': match.group('severity').lower(),
                     'file': match.group('file'),
@@ -162,6 +150,9 @@
                 else:
                     msg['text'] += line+"\n"
 
+        if msg is not None:
+            self.cc_info(msg)
+
     def get_dep_option(self, object):
         base, _ = splitext(object)
         dep_path = base + '.d'
@@ -269,33 +260,35 @@
 
 
 class GCC_ARM(GCC):
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
-        GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose)
+    @staticmethod
+    def check_executable():
+        """Returns True if the executable (arm-none-eabi-gcc) location
+        specified by the user exists OR the executable can be found on the PATH.
+        Returns False otherwise."""
+        return mbedToolchain.generic_check_executable("GCC_ARM", 'arm-none-eabi-gcc', 1)
 
-        # Use latest gcc nanolib
-        if "big-build" in self.options:
-            use_nano = False
-        elif "small-build" in self.options:
-            use_nano = True
-        elif target.default_build == "standard":
-            use_nano = False
-        elif target.default_build == "small":
-            use_nano = True
-        else:
-            use_nano = False
+    def __init__(self, target, notify=None, macros=None,
+                 silent=False, extra_verbose=False, build_profile=None):
+        GCC.__init__(self, target, notify, macros, silent,
+                     TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose,
+                     build_profile=build_profile)
 
-        if use_nano:
-            self.ld.append("--specs=nano.specs")
-            self.flags['ld'].append("--specs=nano.specs")
-            self.cc += ["-DMBED_RTOS_SINGLE_THREAD"]
-            self.cppc += ["-DMBED_RTOS_SINGLE_THREAD"]
-            self.macros.extend(["MBED_RTOS_SINGLE_THREAD"])
         self.sys_libs.append("nosys")
 
 
 class GCC_CR(GCC):
-    def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
-        GCC.__init__(self, target, options, notify, macros, silent, TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose)
+    @staticmethod
+    def check_executable():
+        """Returns True if the executable (arm-none-eabi-gcc) location
+        specified by the user exists OR the executable can be found on the PATH.
+        Returns False otherwise."""
+        return mbedToolchain.generic_check_executable("GCC_CR", 'arm-none-eabi-gcc', 1)
+
+    def __init__(self, target, notify=None, macros=None,
+                 silent=False, extra_verbose=False, build_profile=None):
+        GCC.__init__(self, target, notify, macros, silent,
+                     TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose,
+                     build_profile=build_profile)
 
         additional_compiler_flags = [
             "-D__NEWLIB__", "-D__CODE_RED", "-D__USE_CMSIS", "-DCPP_USE_HEAP",