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.
Diff: toolchains/gcc.py
- Revision:
- 43:2a7da56ebd24
- Parent:
- 40:7d3fa6b99b2b
--- a/toolchains/gcc.py Mon Nov 06 13:17:14 2017 -0600
+++ b/toolchains/gcc.py Tue Sep 25 13:43:09 2018 -0500
@@ -16,24 +16,27 @@
"""
import re
from os.path import join, basename, splitext, dirname, exists
+from os import getenv
from distutils.spawn import find_executable
+from distutils.version import LooseVersion
from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
from tools.hooks import hook_tool
+from tools.utils import run_cmd, NotSupportedException
class GCC(mbedToolchain):
LINKER_EXT = '.ld'
LIBRARY_EXT = '.a'
STD_LIB_NAME = "lib%s.a"
- DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(\d+:)? (?P<severity>warning|[eE]rror|fatal error): (?P<message>.+)')
- INDEX_PATTERN = re.compile('(?P<col>\s*)\^')
+ DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(?P<col>\d+):? (?P<severity>warning|[eE]rror|fatal error): (?P<message>.+)')
- def __init__(self, target, notify=None, macros=None,
- silent=False, extra_verbose=False, build_profile=None,
+ GCC_RANGE = (LooseVersion("6.0.0"), LooseVersion("7.0.0"))
+ GCC_VERSION_RE = re.compile(b"\d+\.\d+\.\d+")
+
+ def __init__(self, target, notify=None, macros=None, build_profile=None,
build_dir=None):
- mbedToolchain.__init__(self, target, notify, macros, silent,
- extra_verbose=extra_verbose,
+ mbedToolchain.__init__(self, target, notify, macros,
build_profile=build_profile, build_dir=build_dir)
tool_path=TOOLCHAIN_PATHS['GCC_ARM']
@@ -49,21 +52,20 @@
self.flags["ld"].append("--specs=nano.specs")
if target.core == "Cortex-M0+":
- cpu = "cortex-m0plus"
- elif target.core == "Cortex-M4F":
- cpu = "cortex-m4"
- elif target.core == "Cortex-M7F":
- cpu = "cortex-m7"
- elif target.core == "Cortex-M7FD":
- cpu = "cortex-m7"
- elif target.core == "Cortex-M23-NS":
- cpu = "cortex-m23"
- elif target.core == "Cortex-M33-NS":
- cpu = "cortex-m33"
+ self.cpu = ["-mcpu=cortex-m0plus"]
+ elif target.core.startswith("Cortex-M4"):
+ self.cpu = ["-mcpu=cortex-m4"]
+ elif target.core.startswith("Cortex-M7"):
+ self.cpu = ["-mcpu=cortex-m7"]
+ elif target.core.startswith("Cortex-M23"):
+ self.cpu = ["-mcpu=cortex-m23"]
+ elif target.core.startswith("Cortex-M33F"):
+ self.cpu = ["-mcpu=cortex-m33"]
+ elif target.core.startswith("Cortex-M33"):
+ self.cpu = ["-march=armv8-m.main"]
else:
- cpu = target.core.lower()
+ self.cpu = ["-mcpu={}".format(target.core.lower())]
- self.cpu = ["-mcpu=%s" % cpu]
if target.core.startswith("Cortex-M"):
self.cpu.append("-mthumb")
@@ -86,13 +88,16 @@
self.cpu.append("-mfloat-abi=hard")
self.cpu.append("-mno-unaligned-access")
- if target.core.startswith("Cortex-M23"):
- self.cpu.append("-march=armv8-m.base")
- elif target.core.startswith("Cortex-M33"):
- self.cpu.append("-march=armv8-m.main")
-
- if target.core == "Cortex-M23" or target.core == "Cortex-M33":
+ if ((target.core.startswith("Cortex-M23") or
+ target.core.startswith("Cortex-M33")) and
+ not target.core.endswith("-NS")):
self.cpu.append("-mcmse")
+ self.flags["ld"].extend([
+ "-Wl,--cmse-implib",
+ "-Wl,--out-implib=%s" % join(build_dir, "cmse_lib.o")
+ ])
+ elif target.core == "Cortex-M23-NS" or target.core == "Cortex-M33-NS":
+ self.flags["ld"].append("-D__DOMAIN_NS=1")
self.flags["common"] += self.cpu
@@ -112,6 +117,32 @@
self.ar = join(tool_path, "arm-none-eabi-ar")
self.elf2bin = join(tool_path, "arm-none-eabi-objcopy")
+ self.use_distcc = (bool(getenv("DISTCC_POTENTIAL_HOSTS", False))
+ and not getenv("MBED_DISABLE_DISTCC", False))
+
+ def version_check(self):
+ stdout, _, retcode = run_cmd([self.cc[0], "--version"], redirect=True)
+ msg = None
+ match = self.GCC_VERSION_RE.search(stdout)
+ found_version = LooseVersion(match.group(0).decode('utf-8')) if match else None
+ min_ver, max_ver = self.GCC_RANGE
+ if found_version and (found_version < min_ver or found_version >= max_ver):
+ msg = ("Compiler version mismatch: Have {}; "
+ "expected version >= {} and < {}"
+ .format(found_version, min_ver, max_ver))
+ elif not match:
+ msg = ("Compiler version mismatch: Could not detect version; "
+ "expected version >= {} and < {}"
+ .format(min_ver, max_ver))
+ if msg:
+ self.notify.cc_info({
+ "message": msg,
+ "file": "",
+ "line": "",
+ "col": "",
+ "severity": "ERROR",
+ })
+
def is_not_supported_error(self, output):
return "error: #error [NOT_SUPPORTED]" in output
@@ -122,30 +153,21 @@
match = self.DIAGNOSTIC_PATTERN.search(line)
if match is not None:
if msg is not None:
- self.cc_info(msg)
+ self.notify.cc_info(msg)
msg = None
msg = {
'severity': match.group('severity').lower(),
'file': match.group('file'),
'line': match.group('line'),
- 'col': 0,
+ 'col': match.group('col'),
'message': match.group('message'),
'text': '',
'target_name': self.target.name,
'toolchain_name': self.name
}
- elif msg is not None:
- # Determine the warning/error column by calculating the ^ position
- match = self.INDEX_PATTERN.match(line)
- if match is not None:
- msg['col'] = len(match.group('col'))
- self.cc_info(msg)
- msg = None
- else:
- msg['text'] += line+"\n"
if msg is not None:
- self.cc_info(msg)
+ self.notify.cc_info(msg)
def get_dep_option(self, object):
base, _ = splitext(object)
@@ -162,10 +184,9 @@
else:
opts += ["-I%s" % i for i in includes]
- if not for_asm:
- config_header = self.get_config_header()
- if config_header is not None:
- opts = opts + self.get_config_option(config_header)
+ config_header = self.get_config_header()
+ if config_header is not None:
+ opts = opts + self.get_config_option(config_header)
return opts
@hook_tool
@@ -190,6 +211,8 @@
# Call cmdline hook
cmd = self.hook.get_cmdline_compiler(cmd)
+ if self.use_distcc:
+ cmd = ["distcc"] + cmd
return [cmd]
@@ -212,13 +235,14 @@
preproc_output = join(dirname(output), ".link_script.ld")
cmd = (self.preproc + [mem_map] + self.ld[1:] +
[ "-o", preproc_output])
- self.cc_verbose("Preproc: %s" % ' '.join(cmd))
+ self.notify.cc_verbose("Preproc: %s" % ' '.join(cmd))
self.default_cmd(cmd)
mem_map = preproc_output
# Build linker command
map_file = splitext(output)[0] + ".map"
cmd = self.ld + ["-o", output, "-Wl,-Map=%s" % map_file] + objects + ["-Wl,--start-group"] + libs + ["-Wl,--end-group"]
+
if mem_map:
cmd.extend(['-T', mem_map])
@@ -236,7 +260,7 @@
cmd = [cmd_linker, "@%s" % link_files]
# Exec command
- self.cc_verbose("Link: %s" % ' '.join(cmd))
+ self.notify.cc_verbose("Link: %s" % ' '.join(cmd))
self.default_cmd(cmd)
@hook_tool
@@ -260,7 +284,7 @@
cmd = self.hook.get_cmdline_binary(cmd)
# Exec command
- self.cc_verbose("FromELF: %s" % ' '.join(cmd))
+ self.notify.cc_verbose("FromELF: %s" % ' '.join(cmd))
self.default_cmd(cmd)
@staticmethod
@@ -269,7 +293,7 @@
@staticmethod
def make_ld_define(name, value):
- return "-D%s=0x%x" % (name, value)
+ return "-D%s=%s" % (name, value)
@staticmethod
def redirect_symbol(source, sync, build_dir):
