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 %}
-
+
-
+
-
+
@@ -972,14 +972,14 @@
{% endfor %}
-
+
-
+
diff --git a/tools/export/emblocks.py b/tools/export/emblocks.py
index d964b3dc96b..0295775cf4b 100644
--- a/tools/export/emblocks.py
+++ b/tools/export/emblocks.py
@@ -69,9 +69,9 @@ def generate(self):
'symbols': self.get_symbols(),
'object_files': self.resources.objects,
'sys_libs': self.toolchain.sys_libs,
- 'cc_org': self.toolchain.cc[1:],
- 'ld_org': self.toolchain.ld[1:],
- 'cppc_org': self.toolchain.cppc[1:]
+ 'cc_org': self.flags['common'] + self.flags['c'],
+ 'ld_org': self.flags['common'] + self.flags['ld'],
+ 'cppc_org': self.flags['common'] + self.flags['cxx']
}
# EmBlocks intermediate file template
diff --git a/tools/export/exporters.py b/tools/export/exporters.py
index f2ff2e541be..ae46752bb66 100644
--- a/tools/export/exporters.py
+++ b/tools/export/exporters.py
@@ -39,6 +39,16 @@ def __init__(self, target, inputDir, program_name, build_url_resolver, extra_sym
def get_toolchain(self):
return self.TOOLCHAIN
+ @property
+ def flags(self):
+ return self.toolchain.flags
+
+ @property
+ def progen_flags(self):
+ if not hasattr(self, "_progen_flag_cache") :
+ self._progen_flag_cache = dict([(key + "_flags", value) for key,value in self.flags.iteritems()])
+ return self._progen_flag_cache
+
def __scan_and_copy(self, src_path, trg_path):
resources = self.toolchain.scan_resources(src_path)
diff --git a/tools/export/gcc_arm_common.tmpl b/tools/export/gcc_arm_common.tmpl
index d7a03a1c805..d775fd8720e 100644
--- a/tools/export/gcc_arm_common.tmpl
+++ b/tools/export/gcc_arm_common.tmpl
@@ -34,16 +34,12 @@ endif
{%- endblock %}
CPU = {% block cpu %}{% for cf in cpu_flags %}{{cf|replace("-mfloat-abi=softfp","-mfloat-abi=$(FLOAT_ABI)")}} {% endfor %}{% endblock %}
-CC_FLAGS = {% block cc_flags %}$(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP{% endblock %}
+CC_FLAGS = {% block cc_flags %}{{common_flags|join(" ")}} {{c_flags|join(" ")}} -MMD -MP{% endblock %}
+CPPC_FLAGS = {% block cppc_flags %}{{common_flags|join(" ")}} {{cxx_flags|join(" ")}} -MMD -MP{% endblock %}
+ASM_FLAGS = {% block asm_flags %}{{asm_flags|join(" ")}} {{common_flags|join(" ")}}{% endblock %}
CC_SYMBOLS = {% block cc_symbols %}{% for s in symbols %}-D{{s}} {% endfor %}{% endblock %}
-LD_FLAGS = {%- block ld_flags -%} $(CPU) -Wl,--gc-sections --specs=nano.specs -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref -Wl,--wrap,_malloc_r -Wl,--wrap,_free_r -Wl,--wrap,_realloc_r
-{%- if "-mcpu=cortex-m0" in cpu_flags or "-mcpu=cortex-m0plus" in cpu_flags -%}
-#LD_FLAGS += -u _printf_float -u _scanf_float
-{%- else -%}
-{{ ' ' }}-u _printf_float -u _scanf_float
-{%- endif -%}
-{% endblock %}
+LD_FLAGS = {%- block ld_flags -%} {{ld_flags|join(" ")}} {% endblock %}
LD_SYS_LIBS = {% block ld_sys_libs %}-lstdc++ -lsupc++ -lm -lc -lgcc -lnosys{% endblock %}
{% endblock %}
@@ -65,17 +61,17 @@ clean:
{% endblock %}
.asm.o:
- $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+ $(CC) $(CPU) -c $(ASM_FLAGS) -o $@ $<
.s.o:
- $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+ $(CC) $(CPU) -c $(ASM_FLAGS) -o $@ $<
.S.o:
- $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+ $(CC) $(CPU) -c $(ASM_FLAGS) -o $@ $<
.c.o:
- $(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
+ $(CC) $(CC_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
.cpp.o:
- $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
+ $(CPP) $(CPPC_FLAGS) $(CC_SYMBOLS) $(INCLUDE_PATHS) -o $@ $<
{% block target_project_elf %}
diff --git a/tools/export/gccarm.py b/tools/export/gccarm.py
index 4df3fe55023..6fd0be3bbc2 100644
--- a/tools/export/gccarm.py
+++ b/tools/export/gccarm.py
@@ -148,4 +148,5 @@ def generate(self):
'symbols': self.get_symbols(),
'cpu_flags': self.toolchain.cpu
}
+ ctx.update(self.progen_flags)
self.gen_file('gcc_arm_%s.tmpl' % self.target.lower(), ctx, 'Makefile')
diff --git a/tools/export/iar.py b/tools/export/iar.py
index 73565da47ae..f977933f512 100644
--- a/tools/export/iar.py
+++ b/tools/export/iar.py
@@ -66,7 +66,10 @@ def generate(self):
}
project_data['tool_specific'] = {}
- project_data['tool_specific'].update(tool_specific)
+ project_data['tool_specific'].setdefault("iar", {})
+ project_data['tool_specific']['iar'].setdefault("misc", {})
+ project_data['tool_specific']['iar'].update(tool_specific['iar'])
+ project_data['tool_specific']['iar']['misc'].update(self.progen_flags)
project_data['common']['build_dir'] = os.path.join(project_data['common']['build_dir'], 'iar_arm')
self.progen_gen_file('iar_arm', project_data)
diff --git a/tools/export/simplicityv3.py b/tools/export/simplicityv3.py
index 6c01dcf6160..d6d838cccaa 100644
--- a/tools/export/simplicityv3.py
+++ b/tools/export/simplicityv3.py
@@ -169,6 +169,7 @@ def generate(self):
'kit': self.KITS[self.target],
'loopcount': 0
}
+ ctx.update(self.progen_flags)
## Strip main folder from include paths because ssproj is not capable of handling it
if '.' in ctx['include_paths']:
diff --git a/tools/export/simplicityv3_slsproj.tmpl b/tools/export/simplicityv3_slsproj.tmpl
index 4324eb12d10..596226d814a 100644
--- a/tools/export/simplicityv3_slsproj.tmpl
+++ b/tools/export/simplicityv3_slsproj.tmpl
@@ -71,13 +71,13 @@
{# Make sure to wrap main in order to get clock initialization done right #}
-
-
+
+
{# For debug build, don't apply optimizations #}
-
+
-
+
@@ -128,13 +128,13 @@
{# Make sure to wrap main in order to get clock initialization done right #}
-
-
+
+
{# Use optimize for size on release build #}
-
+
-
+
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..3d0f9b5095a 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", "-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"],
+ '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..aac31bc49df 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': ["--skip_dynamic_initialization", "--threaded_lib"],
+ }
+
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")
@@ -149,7 +158,7 @@ def compile_cpp(self, source, object, includes):
def link(self, output, objects, libraries, lib_dirs, mem_map):
# Build linker command
map_file = splitext(output)[0] + ".map"
- cmd = [self.ld, "-o", output, "--skip_dynamic_initialization", "--map=%s" % map_file] + objects + libraries
+ cmd = [self.ld, "-o", output, "--map=%s" % map_file] + objects + libraries + self.flags['ld']
if mem_map:
cmd.extend(["--config", mem_map])