From e3b9def8cf0001395345a7a00da9a694a7e95e92 Mon Sep 17 00:00:00 2001 From: Jimmy Brisson Date: Tue, 7 Jun 2016 14:28:12 -0500 Subject: [PATCH 1/6] Refactors all toolchains to have flags api --- tools/toolchains/__init__.py | 2 ++ tools/toolchains/arm.py | 1 - tools/toolchains/gcc.py | 44 ++++++++++++++++++++----------- tools/toolchains/iar.py | 51 +++++++++++++++++++++--------------- 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 8f55af6800e..777a2cd1745 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -24,6 +24,7 @@ from shutil import copyfile from os.path import join, splitext, exists, relpath, dirname, basename, split, abspath from inspect import getmro +from copy import deepcopy from multiprocessing import Pool, cpu_count from tools.utils import run_cmd, mkdir, rel_path, ToolException, NotSupportedException, split_path @@ -242,6 +243,7 @@ def __init__(self, target, options=None, notify=None, macros=None, silent=False, if 'UVISOR_PRESENT=1' in self.macros: self.target.core = re.sub(r"F$", '', self.target.core) + self.flags = deepcopy(self.DEFAULT_FLAGS) def get_output(self): return self.output diff --git a/tools/toolchains/arm.py b/tools/toolchains/arm.py index 11b6564dfa5..c50289dc3f7 100644 --- a/tools/toolchains/arm.py +++ b/tools/toolchains/arm.py @@ -56,7 +56,6 @@ def __init__(self, target, options=None, notify=None, macros=None, silent=False, main_cc = join(ARM_BIN, "armcc") - self.flags = copy.deepcopy(self.DEFAULT_FLAGS) self.flags['common'] += ["--cpu=%s" % cpu] if "save-asm" in self.options: self.flags['common'].extend(["--asm", "--interleave"]) diff --git a/tools/toolchains/gcc.py b/tools/toolchains/gcc.py index d60409043aa..e9a89cf424f 100644 --- a/tools/toolchains/gcc.py +++ b/tools/toolchains/gcc.py @@ -29,6 +29,20 @@ class GCC(mbedToolchain): STD_LIB_NAME = "lib%s.a" DIAGNOSTIC_PATTERN = re.compile('((?P[^:]+):(?P\d+):)(\d+:)? (?Pwarning|error): (?P.+)') + DEFAULT_FLAGS = { + 'common': ["-c", "-Wall", "-Wextra", + "-Wno-unused-parameter", "-Wno-missing-field-initializers", + "-fmessage-length=0", "-fno-exceptions", "-fno-builtin", + "-ffunction-sections", "-fdata-sections", + "-MMD", "-fno-delete-null-pointer-checks", "-fomit-frame-pointer" + ], + 'asm': ["-x", "assembler-with-cpp"], + 'c': ["-std=gnu99"], + 'cxx': ["-std=gnu++98", "-fno-rtti"], + '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) @@ -63,33 +77,31 @@ def __init__(self, target, options=None, notify=None, macros=None, silent=False, # 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 = ["-c", "-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.append("-g") - common_flags.append("-O0") + self.flags["common"].append("-g") + self.flags["common"].append("-O0") else: - common_flags.append("-O2") + self.flags["common"].append("-O2") main_cc = join(tool_path, "arm-none-eabi-gcc") main_cppc = join(tool_path, "arm-none-eabi-g++") - self.asm = [main_cc, "-x", "assembler-with-cpp"] + common_flags + self.asm = [main_cc] + self.flags['asm'] + self.flags["common"] if not "analyze" in self.options: - self.cc = [main_cc, "-std=gnu99"] + common_flags - self.cppc =[main_cppc, "-std=gnu++98", "-fno-rtti"] + common_flags + self.cc = [main_cc] + self.cppc =[main_cppc] else: - self.cc = [join(GOANNA_PATH, "goannacc"), "--with-cc=" + main_cc.replace('\\', '/'), "-std=gnu99", "--dialect=gnu", '--output-format="%s"' % self.GOANNA_FORMAT] + common_flags - self.cppc= [join(GOANNA_PATH, "goannac++"), "--with-cxx=" + main_cppc.replace('\\', '/'), "-std=gnu++98", "-fno-rtti", "--dialect=gnu", '--output-format="%s"' % self.GOANNA_FORMAT] + common_flags + 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.ld = [join(tool_path, "arm-none-eabi-gcc"), "-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r"] + 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") diff --git a/tools/toolchains/iar.py b/tools/toolchains/iar.py index c3aa4a098ac..0862547f8d2 100644 --- a/tools/toolchains/iar.py +++ b/tools/toolchains/iar.py @@ -30,47 +30,56 @@ class IAR(mbedToolchain): DIAGNOSTIC_PATTERN = re.compile('"(?P[^"]+)",(?P[\d]+)\s+(?PWarning|Error)(?P.+)') + DEFAULT_FLAGS = { + 'common': [ + "--no_wrap_diagnostics", + # Pa050: No need to be notified about "non-native end of line sequence" + # Pa084: Pointless integer comparison -> checks for the values of an enum, but we use values outside of the enum to notify errors (ie: NC). + # Pa093: Implicit conversion from float to integer (ie: wait_ms(85.4) -> wait_ms(85)) + # Pa082: Operation involving two values from two registers (ie: (float)(*obj->MR)/(float)(LPC_PWM1->MR0)) + "-e", # Enable IAR language extension + "--diag_suppress=Pa050,Pa084,Pa093,Pa082"], + 'asm': [], + 'c': [], + 'cxx': ["--c++", "--no_rtti", "--no_exceptions", "--guard_calls"], + '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-M7F": cpuchoice = "Cortex-M7" else: cpuchoice = target.core - c_flags = [ + self.flags["common"] += [ "--cpu=%s" % cpuchoice, "--thumb", "--dlib_config", join(IAR_PATH, "inc", "c", "DLib_Config_Full.h"), - "-e", # Enable IAR language extension - "--no_wrap_diagnostics", - # Pa050: No need to be notified about "non-native end of line sequence" - # Pa084: Pointless integer comparison -> checks for the values of an enum, but we use values outside of the enum to notify errors (ie: NC). - # Pa093: Implicit conversion from float to integer (ie: wait_ms(85.4) -> wait_ms(85)) - # Pa082: Operation involving two values from two registers (ie: (float)(*obj->MR)/(float)(LPC_PWM1->MR0)) - "--diag_suppress=Pa050,Pa084,Pa093,Pa082", ] if target.core == "Cortex-M7F": - c_flags.append("--fpu=VFPv5_sp") - + self.flags["common"].append("--fpu=VFPv5_sp") if "debug-info" in self.options: - c_flags.append("-r") - c_flags.append("-On") + self.flags["common"].append("-r") + self.flags["common"].append("-On") else: - c_flags.append("-Oh") + self.flags["common"].append("-Oh") IAR_BIN = join(IAR_PATH, "bin") main_cc = join(IAR_BIN, "iccarm") - + + self.flags["asm"] += ["--cpu", cpuchoice] if target.core == "Cortex-M7F": - self.asm = [join(IAR_BIN, "iasmarm")] + ["--cpu", cpuchoice] + ["--fpu", "VFPv5_sp"] - else: - self.asm = [join(IAR_BIN, "iasmarm")] + ["--cpu", cpuchoice] + self.flags["asm"] += ["--fpu", "VFPv5_sp"] + self.asm = [join(IAR_BIN, "iasmarm")] + self.flags["asm"] if not "analyze" in self.options: - self.cc = [main_cc, "--vla"] + c_flags - self.cppc = [main_cc, "--c++", "--no_rtti", "--no_exceptions"] + c_flags + self.cc = [main_cc] + self.cppc = [main_cc] else: - self.cc = [join(GOANNA_PATH, "goannacc"), '--with-cc="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT, "--vla"] + c_flags - self.cppc = [join(GOANNA_PATH, "goannac++"), '--with-cxx="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT] + ["--c++", "--no_rtti", "--no_exceptions"] + c_flags + self.cc = [join(GOANNA_PATH, "goannacc"), '--with-cc="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT] + self.cppc = [join(GOANNA_PATH, "goannac++"), '--with-cxx="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT] + self.cc += self.flags["common"] + self.flags["c"] + self.cppc += self.flags["common"] + self.flags["cxx"] self.ld = join(IAR_BIN, "ilinkarm") self.ar = join(IAR_BIN, "iarchive") self.elf2bin = join(IAR_BIN, "ielftool") From c6fc70e461d118204dfe67dfe041d82d8fdfd2d0 Mon Sep 17 00:00:00 2001 From: Jimmy Brisson Date: Tue, 7 Jun 2016 15:15:35 -0500 Subject: [PATCH 2/6] Updates exportes to use flags from toolchains Affects the following exporters: - amtelstudio - codered - emblocks - gcc_arm - iar - simplicityv3 --- tools/export/atmelstudio.py | 1 + tools/export/atmelstudio6_2.cppproj.tmpl | 14 +++++++------- tools/export/codered.py | 1 + tools/export/codered_cproject_common.tmpl | 12 ++++++------ tools/export/emblocks.py | 6 +++--- tools/export/exporters.py | 10 ++++++++++ tools/export/gcc_arm_common.tmpl | 22 +++++++++------------- tools/export/gccarm.py | 1 + tools/export/iar.py | 2 ++ tools/export/simplicityv3.py | 1 + tools/export/simplicityv3_slsproj.tmpl | 16 ++++++++-------- 11 files changed, 49 insertions(+), 37 deletions(-) diff --git a/tools/export/atmelstudio.py b/tools/export/atmelstudio.py index 7b69d201184..96e713a9cec 100644 --- a/tools/export/atmelstudio.py +++ b/tools/export/atmelstudio.py @@ -71,6 +71,7 @@ def generate(self): 'solution_uuid': solution_uuid.upper(), 'project_uuid': project_uuid.upper() } + ctx.update(self.progen_flags) target = self.target.lower() self.gen_file('atmelstudio6_2.atsln.tmpl', ctx, '%s.atsln' % self.program_name) self.gen_file('atmelstudio6_2.cppproj.tmpl', ctx, '%s.cppproj' % self.program_name) diff --git a/tools/export/atmelstudio6_2.cppproj.tmpl b/tools/export/atmelstudio6_2.cppproj.tmpl index 98696b30b58..8af32129936 100644 --- a/tools/export/atmelstudio6_2.cppproj.tmpl +++ b/tools/export/atmelstudio6_2.cppproj.tmpl @@ -60,7 +60,7 @@ Optimize for size (-Os) True True - -std=gnu99 -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP + {{c_flags|join(" ")}} {{common_flags|join(" ")}} -MMD -MP NDEBUG @@ -77,7 +77,7 @@ Optimize for size (-Os) True True - -std=gnu++98 -fno-rtti -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP + {{cxx_flags|join(" ")}} {{common_flags|join(" ")}} -MMD -MP libm @@ -88,7 +88,7 @@ True - {% for p in library_paths %}-L../{{p}} {% endfor %} {% for f in object_files %}../{{f}} {% endfor %} {% for lib in libraries %}-l{{lib}} {% endfor %} -T../{{linker_script}} -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,--cref -lstdc++ -lsupc++ -lm -lgcc -Wl,--start-group -lc -lc -lnosys -Wl,--end-group + {% for p in library_paths %}-L../{{p}} {% endfor %} {% for f in object_files %}../{{f}} {% endfor %} {% for lib in libraries %}-l{{lib}} {% endfor %} -T../{{linker_script}} {{ld_flags|join(" ")}} {{common_flags|join(" ")}} {% for i in include_paths %}../{{i}} @@ -123,7 +123,7 @@ True Maximum (-g3) True - -std=gnu99 -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP + {{c_flags|join(" ")}} {{common_flags|join(" ")}} -MMD -MP DEBUG @@ -141,7 +141,7 @@ True Maximum (-g3) True - -std=gnu++98 -fno-rtti -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP + {{cxx_flags|join(" ")}} {{common_flags|join(" ")}} -MMD -MP libm @@ -152,7 +152,7 @@ True - {% for p in library_paths %}-L../{{p}} {% endfor %} {% for f in object_files %}../{{f}} {% endfor %} {% for lib in libraries %}-l{{lib}} {% endfor %} -T../{{linker_script}} -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,--cref -lstdc++ -lsupc++ -lm -lgcc -Wl,--start-group -lc -lc -lnosys -Wl,--end-group + {% for p in library_paths %}-L../{{p}} {% endfor %} {% for f in object_files %}../{{f}} {% endfor %} {% for lib in libraries %}-l{{lib}} {% endfor %} -T../{{linker_script}} {{ld_flags|join(" ")}} {{common_flags|join(" ")}} Default (-g) @@ -173,4 +173,4 @@ {% endfor %} - \ No newline at end of file + diff --git a/tools/export/codered.py b/tools/export/codered.py index c502096fe30..6685dadc609 100644 --- a/tools/export/codered.py +++ b/tools/export/codered.py @@ -53,5 +53,6 @@ def generate(self): 'libraries': libraries, 'symbols': self.get_symbols() } + ctx.update(self.progen_flags) self.gen_file('codered_%s_project.tmpl' % self.target.lower(), ctx, '.project') self.gen_file('codered_%s_cproject.tmpl' % self.target.lower(), ctx, '.cproject') diff --git a/tools/export/codered_cproject_common.tmpl b/tools/export/codered_cproject_common.tmpl index b71f1315560..344782ff34f 100644 --- a/tools/export/codered_cproject_common.tmpl +++ b/tools/export/codered_cproject_common.tmpl @@ -34,7 +34,7 @@ {% endfor %} - - - -