Clone of official tools
Diff: toolchains/gcc.py
- Revision:
- 13:ab47a20b66f0
- Parent:
- 7:5af61d55adbe
- Child:
- 20:835f6355470d
--- a/toolchains/gcc.py Tue Jun 14 11:33:06 2016 +0100 +++ b/toolchains/gcc.py Thu Jul 14 20:21:19 2016 +0100 @@ -23,16 +23,28 @@ from tools.hooks import hook_tool class GCC(mbedToolchain): - PROFILE = {} LINKER_EXT = '.ld' LIBRARY_EXT = '.a' STD_LIB_NAME = "lib%s.a" - CIRCULAR_DEPENDENCIES = True - DIAGNOSTIC_PATTERN = re.compile('((?P<line>\d+):)(\d+:)? (?P<severity>warning|error): (?P<message>.+)') + DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(\d+:)? (?P<severity>warning|error): (?P<message>.+)') - def __init__(self, target, options=None, notify=None, macros=None, silent=False, tool_path="", extra_verbose=False, profile=None): - mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose, profile=profile) + 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, 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) if target.core == "Cortex-M0+": cpu = "cortex-m0plus" @@ -40,6 +52,8 @@ cpu = "cortex-m4" elif target.core == "Cortex-M7F": cpu = "cortex-m7" + elif target.core == "Cortex-M7FD": + cpu = "cortex-m7" else: cpu = target.core.lower() @@ -47,13 +61,19 @@ if target.core.startswith("Cortex"): self.cpu.append("-mthumb") + # FPU handling, M7 possibly to have double FPU if target.core == "Cortex-M4F": self.cpu.append("-mfpu=fpv4-sp-d16") self.cpu.append("-mfloat-abi=softfp") elif target.core == "Cortex-M7F": + self.cpu.append("-mfpu=fpv5-sp-d16") + self.cpu.append("-mfloat-abi=softfp") + elif target.core == "Cortex-M7FD": 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") @@ -62,31 +82,34 @@ 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 - common_flags = self.PROFILE.get('COMMON_FLAGS', ["-c", "-O2", - "-Wall", "-Wextra", "-Wno-unused-parameter", "-Wno-missing-field-initializers", - "-fmessage-length=0", "-fno-exceptions", "-fno-builtin", - "-ffunction-sections", "-fdata-sections", - "-fno-delete-null-pointer-checks", "-fomit-frame-pointer" - ]) + self.cpu + self.flags["common"] += self.cpu if "save-asm" in self.options: - common_flags.append("-save-temps") + self.flags["common"].append("-save-temps") + if "debug-info" in self.options: - common_flags.remove("-O3") - common_flags.remove("-O2") - common_flags.remove("-O1") - common_flags.append("-O0") + self.flags["common"].append("-g") + self.flags["common"].append("-O0") + else: + self.flags["common"].append("-O2") - # add debug symbols for all builds - common_flags.append("-g") + 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"] + if not "analyze" in self.options: + self.cc = [main_cc] + self.cppc =[main_cppc] + else: + self.cc = [join(GOANNA_PATH, "goannacc"), "--with-cc=" + main_cc.replace('\\', '/'), "--dialect=gnu", '--output-format="%s"' % self.GOANNA_FORMAT] + self.cppc= [join(GOANNA_PATH, "goannac++"), "--with-cxx=" + main_cppc.replace('\\', '/'), "--dialect=gnu", '--output-format="%s"' % self.GOANNA_FORMAT] + self.cc += self.flags['c'] + self.flags['common'] + self.cppc += self.flags['cxx'] + self.flags['common'] - self.asm = [join(tool_path, "arm-none-eabi-gcc")] + self.PROFILE.get('COMMON_ASM_FLAGS', ["-x", "assembler-with-cpp"]) + common_flags - self.cc = [join(tool_path, "arm-none-eabi-gcc")] + self.PROFILE.get('COMMON_CC_FLAGS', ["-std=gnu99"]) + common_flags - self.cppc =[join(tool_path, "arm-none-eabi-g++")] + self.PROFILE.get('COMMON_CPP_FLAGS', ["-std=gnu++98", "-fno-rtti"]) + common_flags - self.ld = [join(tool_path, "arm-none-eabi-gcc")] + self.PROFILE.get('COMMON_LD_FLAGS', ["-Wl,--gc-sections", "-Wl,--wrap,main"]) + self.cpu - + self.flags['ld'] += self.cpu + self.ld = [join(tool_path, "arm-none-eabi-gcc")] + self.flags['ld'] self.sys_libs = ["stdc++", "supc++", "m", "c", "gcc"] self.ar = join(tool_path, "arm-none-eabi-ar") @@ -133,27 +156,16 @@ ) continue - # Each line should start with the file information: "filepath: ..." - # i should point past the file path ^ - # avoid the first column in Windows (C:\) - i = line.find(':', 2) - if i == -1: continue - if state == WHERE: - file = line[:i] - message = line[i+1:].strip() + ' ' - state = WHAT - - elif state == WHAT: - match = GCC.DIAGNOSTIC_PATTERN.match(line[i+1:]) - if match is None: - state = WHERE - continue - + match = GCC.DIAGNOSTIC_PATTERN.match(line) + if match is not None: self.cc_info( - match.group('severity'), - file, match.group('line'), - message + match.group('message') + match.group('severity').lower(), + match.group('file'), + match.group('line'), + match.group('message'), + target_name=self.target.name, + toolchain_name=self.name ) def get_dep_option(self, object): @@ -161,8 +173,15 @@ dep_path = base + '.d' return ["-MD", "-MF", dep_path] + def get_config_option(self, config_header): + return ['-include', config_header] + def get_compile_options(self, defines, includes): - return ['-D%s' % d for d in defines] + ['@%s' % self.get_inc_file(includes)] + opts = ['-D%s' % d for d in defines] + ['@%s' % 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): @@ -183,7 +202,7 @@ cmd.extend(self.get_dep_option(object)) cmd.extend(["-o", object, source]) - + # Call cmdline hook cmd = self.hook.get_cmdline_compiler(cmd) @@ -203,20 +222,12 @@ libs.append("-l%s" % name[3:]) libs.extend(["-l%s" % l for l in self.sys_libs]) - # NOTE: There is a circular dependency between the mbed library and the clib - # We could define a set of week symbols to satisfy the clib dependencies in "sys.o", - # but if an application uses only clib symbols and not mbed symbols, then the final - # image is not correctly retargeted - if self.CIRCULAR_DEPENDENCIES: - libs.extend(libs) - # Build linker command map_file = splitext(output)[0] + ".map" - cmd = self.ld + ["-o", output, "-Wl,-Map=%s" % map_file] + objects - + 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]) - + for L in lib_dirs: cmd.extend(['-L', L]) cmd.extend(libs) @@ -231,7 +242,7 @@ cmd_list = [] for c in cmd[1:]: if c: - cmd_list.append(('"%s"' % c) if not c.startswith('-') else c) + cmd_list.append(('"%s"' % c) if not c.startswith('-') else c) string = " ".join(cmd_list).replace("\\", "/") f.write(string) @@ -244,7 +255,7 @@ with open(archive_files, "wb") as f: o_list = [] for o in objects: - o_list.append('"%s"' % o) + o_list.append('"%s"' % o) string = " ".join(o_list).replace("\\", "/") f.write(string) @@ -264,22 +275,41 @@ class GCC_ARM(GCC): - def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False, profile=None): - GCC.__init__(self, target, options, notify, macros, silent, GCC_ARM_PATH, extra_verbose=extra_verbose, profile=profile) + def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False): + GCC.__init__(self, target, options, notify, macros, silent, GCC_ARM_PATH, extra_verbose=extra_verbose) # Use latest gcc nanolib - self.ld.append("--specs=nano.specs") - if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368"]: + 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 + + 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"]) + + if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368", "ARM_BEETLE_SOC"]: self.ld.extend(["-u _printf_float", "-u _scanf_float"]) - elif target.name in ["RZ_A1H", "ARCH_MAX", "DISCO_F407VG", "DISCO_F429ZI", "DISCO_F469NI", "NUCLEO_F401RE", "NUCLEO_F410RB", "NUCLEO_F411RE", "NUCLEO_F446RE", "ELMO_F411RE", "MTS_MDOT_F411RE", "MTS_DRAGONFLY_F411RE", "DISCO_F746NG"]: + self.flags['ld'].extend(["-u _printf_float", "-u _scanf_float"]) + elif target.name in ["RZ_A1H", "VK_RZ_A1H", "ARCH_MAX", "DISCO_F407VG", "DISCO_F429ZI", "DISCO_F469NI", "NUCLEO_F401RE", "NUCLEO_F410RB", "NUCLEO_F411RE", "NUCLEO_F429ZI", "NUCLEO_F446RE", "NUCLEO_F446ZE", "ELMO_F411RE", "MTS_MDOT_F411RE", "MTS_DRAGONFLY_F411RE", "DISCO_F746NG"]: self.ld.extend(["-u_printf_float", "-u_scanf_float"]) + self.flags['ld'].extend(["-u_printf_float", "-u_scanf_float"]) self.sys_libs.append("nosys") class GCC_CR(GCC): - def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False, profile=None): - GCC.__init__(self, target, options, notify, macros, silent, GCC_CR_PATH, extra_verbose=extra_verbose, profile=profile) + def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False): + GCC.__init__(self, target, options, notify, macros, silent, GCC_CR_PATH, extra_verbose=extra_verbose) additional_compiler_flags = [ "-D__NEWLIB__", "-D__CODE_RED", "-D__USE_CMSIS", "-DCPP_USE_HEAP", @@ -292,4 +322,3 @@ if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368"]: self.ld.extend(["-u _printf_float", "-u _scanf_float"]) self.ld += ["-nostdlib"] -