diff --git a/tools/build_everything.py b/tools/build_everything.py new file mode 100644 index 0000000000..2685103d5e --- /dev/null +++ b/tools/build_everything.py @@ -0,0 +1,239 @@ +#! /usr/bin/env python +""" +mbed SDK +Copyright (c) 2011-2013 ARM Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" +import sys +from time import time +from os.path import join, abspath, dirname, normpath +from optparse import OptionParser +import json + +# Be sure that the tools directory is in the search path +ROOT = abspath(join(dirname(__file__), "..")) +sys.path.insert(0, ROOT) + +from tools.build_api import build_library +from tools.build_api import write_build_report +from tools.targets import TARGET_MAP, TARGET_NAMES +from tools.toolchains import TOOLCHAINS +from tools.test_exporters import ReportExporter, ResultExporterType +from tools.test_api import find_tests, build_tests, test_spec_from_test_builds +from tools.build_release import OFFICIAL_MBED_LIBRARY_BUILD + +if __name__ == '__main__': + try: + parser = OptionParser() + + parser.add_option("--source", dest="source_dir", + default=None, help="The source (input) directory (for sources other than tests). Defaults to current directory.", action="append") + + parser.add_option("--build", dest="build_dir", + default=None, help="The build (output) directory") + + parser.add_option('-c', '--clean', + dest='clean', + metavar=False, + action="store_true", + help='Clean the build directory') + + parser.add_option('-a', '--all', dest="all", default=False, action="store_true", + help="Build every target (including unofficial targets) and with each of the supported toolchains") + + parser.add_option('-o', '--official', dest="official_only", default=False, action="store_true", + help="Build using only the official toolchain for each target") + + parser.add_option("-D", "", + action="append", + dest="macros", + help="Add a macro definition") + + parser.add_option("-j", "--jobs", type="int", dest="jobs", + default=0, help="Number of concurrent jobs. Default: 0/auto (based on host machine's number of CPUs)") + + parser.add_option("-v", "--verbose", action="store_true", dest="verbose", + default=False, help="Verbose diagnostic output") + + parser.add_option("-t", "--toolchains", dest="toolchains", help="Use toolchains names separated by comma") + + parser.add_option("-p", "--platforms", dest="platforms", default="", help="Build only for the platform namesseparated by comma") + + parser.add_option("", "--config", action="store_true", dest="list_config", + default=False, help="List the platforms and toolchains in the release in JSON") + + parser.add_option("", "--test-spec", dest="test_spec", + default=None, help="Destination path for a test spec file that can be used by the Greentea automated test tool") + + parser.add_option("", "--build-report-junit", dest="build_report_junit", help="Output the build results to an junit xml file") + + parser.add_option("--continue-on-build-fail", action="store_true", dest="continue_on_build_fail", + default=False, help="Continue trying to build all tests if a build failure occurs") + + options, args = parser.parse_args() + + # Get set of valid targets + all_platforms = set(TARGET_NAMES) + bad_platforms = set() + platforms = set() + if options.platforms != "": + platforms = set(options.platforms.split(",")) + bad_platforms = platforms.difference(all_platforms) + platforms = platforms.intersection(all_platforms) + elif options.all: + platforms = all_platforms + else: + platforms = set(x[0] for x in OFFICIAL_MBED_LIBRARY_BUILD) + bad_platforms = platforms.difference(all_platforms) + platforms = platforms.intersection(all_platforms) + + for bad_platform in bad_platforms: + print "Platform '%s' is not a valid platform. Skipping." % bad_platform + + if options.platforms: + print "Limiting build to the following platforms: %s" % ",".join(platforms) + + # Get set of valid toolchains + all_toolchains = set(TOOLCHAINS) + bad_toolchains = set() + toolchains = set() + + if options.toolchains: + toolchains = set(options.toolchains.split(",")) + bad_toolchains = toolchains.difference(all_toolchains) + toolchains = toolchains.intersection(all_toolchains) + else: + toolchains = all_toolchains + + for bad_toolchain in bad_toolchains: + print "Toolchain '%s' is not a valid toolchain. Skipping." % bad_toolchain + + if options.toolchains: + print "Limiting build to the following toolchains: %s" % ",".join(toolchains) + + build_config = {} + + for platform in platforms: + target = TARGET_MAP[platform] + + if options.official_only: + default_toolchain = getattr(target, 'default_toolchain', 'ARM') + build_config[platform] = list(toolchains.intersection(set([default_toolchain]))) + else: + build_config[platform] = list(toolchains.intersection(set(target.supported_toolchains))) + + if options.list_config: + print json.dumps(build_config, indent=4) + sys.exit(0) + + # Ensure build directory is set + if not options.build_dir: + print "[ERROR] You must specify a build path" + sys.exit(1) + + # Default base source path is the current directory + base_source_paths = options.source_dir + if not base_source_paths: + base_source_paths = ['.'] + + all_tests = find_tests(base_source_paths[0]) + + start = time() + build_report = {} + build_properties = {} + test_builds = {} + total_build_success = True + + for target_name, target_toolchains in build_config.iteritems(): + target = TARGET_MAP[target_name] + + for target_toolchain in target_toolchains: + library_build_success = True + + try: + build_directory = join(options.build_dir, target_name, target_toolchain) + # Build sources + build_library(base_source_paths, build_directory, target, target_toolchain, + jobs=options.jobs, + clean=options.clean, + report=build_report, + properties=build_properties, + name="mbed-os", + macros=options.macros, + verbose=options.verbose, + archive=False) + except Exception, e: + library_build_success = False + print "Failed to build library" + print e + + if options.continue_on_build_fail or library_build_success: + # Build all the tests + test_build_success, test_build = build_tests(all_tests, [build_directory], build_directory, target, target_toolchain, + clean=options.clean, + report=build_report, + properties=build_properties, + macros=options.macros, + verbose=options.verbose, + jobs=options.jobs, + continue_on_build_fail=options.continue_on_build_fail) + + if not test_build_success: + total_build_success = False + print "Failed to build some tests, check build log for details" + + test_builds.update(test_build) + else: + total_build_success = False + break + + # If a path to a test spec is provided, write it to a file + if options.test_spec: + test_spec_data = test_spec_from_test_builds(test_builds) + + # Create the target dir for the test spec if necessary + # mkdir will not create the dir if it already exists + test_spec_dir = dirname(options.test_spec) + if test_spec_dir: + mkdir(test_spec_dir) + + try: + with open(options.test_spec, 'w') as f: + f.write(json.dumps(test_spec_data, indent=2)) + except IOError, e: + print "[ERROR] Error writing test spec to file" + print e + + # If a path to a JUnit build report spec is provided, write it to a file + if options.build_report_junit: + report_exporter = ReportExporter(ResultExporterType.JUNIT) + report_exporter.report_to_file(build_report, options.build_report_junit, test_suite_properties=build_properties) + + print "\n\nCompleted in: (%.2f)s" % (time() - start) + + print_report_exporter = ReportExporter(ResultExporterType.PRINT, package="build") + status = print_report_exporter.report(build_report) + + if status: + sys.exit(0) + else: + sys.exit(1) + + except KeyboardInterrupt, e: + print "\n[CTRL+c] exit" + except Exception,e: + import traceback + traceback.print_exc(file=sys.stdout) + print "[ERROR] %s" % str(e) + sys.exit(1) diff --git a/tools/export/gcc_arm_common.tmpl b/tools/export/gcc_arm_common.tmpl index d641b0af3d..d7a03a1c80 100644 --- a/tools/export/gcc_arm_common.tmpl +++ b/tools/export/gcc_arm_common.tmpl @@ -37,12 +37,11 @@ CPU = {% block cpu %}{% for cf in cpu_flags %}{{cf|replace("-mfloat-abi=softfp", 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_SYMBOLS = {% block cc_symbols %}{% for s in symbols %}-D{{s}} {% endfor %}{% endblock %} -LD_FLAGS = {%- block ld_flags -%} +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 -%} -{{ ' ' }}$(CPU) -Wl,--gc-sections --specs=nano.specs -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref #LD_FLAGS += -u _printf_float -u _scanf_float {%- else -%} -{{ ' ' }}$(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref +{{ ' ' }}-u _printf_float -u _scanf_float {%- endif -%} {% endblock %} LD_SYS_LIBS = {% block ld_sys_libs %}-lstdc++ -lsupc++ -lm -lc -lgcc -lnosys{% endblock %} diff --git a/tools/test/config_test/config_test.py b/tools/test/config_test/config_test.py new file mode 100644 index 0000000000..a520c2006d --- /dev/null +++ b/tools/test/config_test/config_test.py @@ -0,0 +1,94 @@ +""" +mbed SDK +Copyright (c) 2011-2016 ARM Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +from tools.build_api import get_config +from tools.config import ConfigException +import os, sys + +# Compare the output of config against a dictionary of known good results +def compare_config(cfg, expected): + try: + for k in cfg: + if cfg[k].value != expected[k]: + return "'%s': expected '%s', got '%s'" % (k, expected[k], cfg[k].value) + except KeyError: + return "Unexpected key '%s' in configuration data" % k + for k in expected: + if k != "desc" and k != "expected_macros" and not k in cfg: + return "Expected key '%s' was not found in configuration data" % k + return "" + +def test_tree(full_name, name): + failed = 0 + sys.path.append(full_name) + if "test_data" in sys.modules: + del sys.modules["test_data"] + import test_data + for target, expected in test_data.expected_results.items(): + sys.stdout.write("%s:'%s'(%s) " % (name, expected["desc"], target)) + sys.stdout.flush() + err_msg = None + try: + cfg, macros = get_config(full_name, target, "GCC_ARM") + except ConfigException as e: + err_msg = e.message + if err_msg: + if expected.has_key("exception_msg"): + if err_msg.find(expected["exception_msg"]) == -1: + print "FAILED!" + sys.stderr.write(" Unexpected error message!\n") + sys.stderr.write(" Expected: '%s'\n" % expected["exception_msg"]) + sys.stderr.write(" Got: '%s'\n" % err_msg) + failed += 1 + else: + print "OK" + else: + print "FAILED!" + sys.stderr.write(" Error while getting configuration!\n") + sys.stderr.write(" " + err_msg + "\n") + failed += 1 + else: + res = compare_config(cfg, expected) + if res: + print "FAILED!" + sys.stdout.write(" " + res + "\n") + failed += 1 + else: + expected_macros = expected.get("expected_macros", None) + if expected_macros is not None: + if sorted(expected_macros) != sorted(macros): + print "FAILED!" + sys.stderr.write(" List of macros doesn't match\n") + sys.stderr.write(" Expected: '%s'\n" % ",".join(sorted(expected_macros))) + sys.stderr.write(" Got: '%s'\n" % ",".join(sorted(expected_macros))) + failed += 1 + else: + print "OK" + else: + print "OK" + sys.path.remove(full_name) + return failed + +failed = 0 +root_dir = os.path.abspath(os.path.dirname(__file__)) +tlist = sorted(os.listdir(root_dir), key = lambda e: int(e[4:]) if e.startswith('test') else -1) +for test_name in tlist: + full_name = os.path.join(root_dir, test_name) + if os.path.isdir(full_name) and test_name.startswith('test'): + failed += test_tree(full_name, test_name) +sys.exit(failed) + diff --git a/tools/test/config_test/test01/mbed_app.json b/tools/test/config_test/test01/mbed_app.json new file mode 100644 index 0000000000..4a4246aa32 --- /dev/null +++ b/tools/test/config_test/test01/mbed_app.json @@ -0,0 +1,43 @@ +{ + "custom_targets": { + "b1": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "base1_1": "v_base1_1_b1", + "base1_2": "v_base1_2_b1", + "base1_3": "v_base1_3_b1" + } + }, + "d1": { + "inherits": ["b1"], + "config": { + "derived1": "v_derived1_d1", + "derived2": "v_derived2_d1" + }, + "overrides": { + "base1_1": "v_base1_1_d1", + "base1_2": "v_base1_2_d1" + } + }, + "b2": { + "config": { + "base2_1": "v_base2_1_b2", + "base2_2": "v_base2_2_b2" + } + }, + "f": { + "inherits": ["b2", "d1"], + "config": { + "f1_1": "v_f1_1_f", + "f1_2": "v_f1_2_f" + }, + "overrides": { + "base2_1": "v_base2_1_f", + "base1_1": "v_base1_1_f", + "derived2": "v_derived2_f", + "f1_1": "v_f1_1_f_override" + } + } + } +} diff --git a/tools/test/config_test/test01/test_data.py b/tools/test/config_test/test01/test_data.py new file mode 100644 index 0000000000..878ae93690 --- /dev/null +++ b/tools/test/config_test/test01/test_data.py @@ -0,0 +1,46 @@ +# Test for configuration data defined in targets +# A base target (B1) defines 3 configuration parameters (base1_1, base1_2 and base1_3) +# A derived target (D1) inherits drom B1 and defines one configuration parameters (derived1 and derived2) and overrides base1_1 and base1_2 +# Another base target (B2) defines its own configuration parameters (base2_1 and base2_2) +# The final target F derives from B2 and D1, defines two configuration paramaters (f1_1 and f1_2) +# and overrides base2_1, base1_1, derived2 and its own configuration parameter f1_1 (which is legal) +# Final result: +# base1_1 must have the value defined in F +# base1_2 must have the value defined in D1 +# base1_3 must have the value defined in B1 +# derived1 must have the value defined in D1 +# derived2 must have the value defined in F +# base2_1 must have the value defined in F +# base2_2 must have the value defined in B2 +# f1_1 must have the value defined and then overriden in F +# f1_2 must have the value defined in F + +expected_results = { + "f": { + "desc": "test multiple target inheritance", + "target.base1_1": "v_base1_1_f", + "target.base1_2": "v_base1_2_d1", + "target.base1_3": "v_base1_3_b1", + "target.derived1": "v_derived1_d1", + "target.derived2": "v_derived2_f", + "target.base2_1": "v_base2_1_f", + "target.base2_2": "v_base2_2_b2", + "target.f1_1": "v_f1_1_f_override", + "target.f1_2": "v_f1_2_f" + }, + "b1": { + "desc": "test with a single base target, no inheritance", + "target.base1_1": "v_base1_1_b1", + "target.base1_2": "v_base1_2_b1", + "target.base1_3": "v_base1_3_b1" + }, + "d1": { + "desc": "test single target inheritance", + "target.base1_1": "v_base1_1_d1", + "target.base1_2": "v_base1_2_d1", + "target.base1_3": "v_base1_3_b1", + "target.derived1": "v_derived1_d1", + "target.derived2": "v_derived2_d1" + } +} + diff --git a/tools/test/config_test/test02/mbed_app.json b/tools/test/config_test/test02/mbed_app.json new file mode 100644 index 0000000000..3e3f0b38d6 --- /dev/null +++ b/tools/test/config_test/test02/mbed_app.json @@ -0,0 +1,47 @@ +{ + "custom_targets": { + "b1": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "base1_1": "v_base1_1_b1", + "base1_2": "v_base1_2_b1", + "base1_3": "v_base1_3_b1" + } + }, + "d1": { + "inherits": ["b1"], + "config": { + "derived1": "v_derived1_d1", + "derived2": "v_derived2_d1" + }, + "overrides": { + "base1_1": "v_base1_1_d1", + "base1_2": "v_base1_2_d1" + } + }, + "b2": { + "inherits": ["b1"], + "config": { + "base2_1": "v_base2_1_b2", + "base2_2": "v_base2_2_b2" + }, + "overrides": { + "base1_2": "v_base1_2_b2" + } + }, + "f": { + "inherits": ["d1", "b2"], + "config": { + "f1_1": "v_f1_1_f", + "f1_2": "v_f1_2_f" + }, + "overrides": { + "base2_1": "v_base2_1_f", + "base1_1": "v_base1_1_f", + "derived2": "v_derived2_f", + "f1_1": "v_f1_1_f_override" + } + } + } +} diff --git a/tools/test/config_test/test02/test_data.py b/tools/test/config_test/test02/test_data.py new file mode 100644 index 0000000000..b915a17ed4 --- /dev/null +++ b/tools/test/config_test/test02/test_data.py @@ -0,0 +1,30 @@ +# This is similar to test1, but this time B2 also inherits from B1, which allows it to override its config data. +# B2 also overrides base1_2, like D1. +# The order of inheritace in F is also reversed ([D1, B2] instead of [B2, D1]) +# Since the last override of base1_2 in inheritance order is in B2, base1_2 must now +# have the value that was overriden in B2, not in D1. +# This test also shows that multiple inheritance works for a simple diamond shaped inheritance pattern + +expected_results = { + "f": { + "desc": "test multiple target inheritance (diamond shape)", + "target.base1_1": "v_base1_1_f", + "target.base1_2": "v_base1_2_b2", + "target.base1_3": "v_base1_3_b1", + "target.derived1": "v_derived1_d1", + "target.derived2": "v_derived2_f", + "target.base2_1": "v_base2_1_f", + "target.base2_2": "v_base2_2_b2", + "target.f1_1": "v_f1_1_f_override", + "target.f1_2": "v_f1_2_f" + }, + "b2": { + "desc": "another single inheritance test", + "target.base1_1": "v_base1_1_b1", + "target.base1_2": "v_base1_2_b2", + "target.base1_3": "v_base1_3_b1", + "target.base2_1": "v_base2_1_b2", + "target.base2_2": "v_base2_2_b2" + } +} + diff --git a/tools/test/config_test/test03/mbed_app.json b/tools/test/config_test/test03/mbed_app.json new file mode 100644 index 0000000000..28b44b866a --- /dev/null +++ b/tools/test/config_test/test03/mbed_app.json @@ -0,0 +1,46 @@ +{ + "custom_targets": { + "b1": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "base1_1": "v_base1_1_b1", + "base1_2": "v_base1_2_b1", + "base1_3": "v_base1_3_b1" + } + }, + "d1": { + "inherits": ["b1"], + "config": { + "derived1": "v_derived1_d1", + "derived2": "v_derived2_d1" + }, + "overrides": { + "base1_1": "v_base1_1_d1", + "base1_2": "v_base1_2_d1" + } + }, + "b2": { + "config": { + "base2_1": "v_base2_1_b2", + "base2_2": "v_base2_2_b2" + }, + "overrides": { + "base1_1": "v_base1_1_b2" + } + }, + "f": { + "inherits": ["b2", "d1"], + "config": { + "f1_1": "v_f1_1_f", + "f1_2": "v_f1_2_f" + }, + "overrides": { + "base2_1": "v_base2_1_f", + "base1_1": "v_base1_1_f", + "derived2": "v_derived2_f", + "f1_1": "v_f1_1_f_override" + } + } + } +} diff --git a/tools/test/config_test/test03/test_data.py b/tools/test/config_test/test03/test_data.py new file mode 100644 index 0000000000..3540131961 --- /dev/null +++ b/tools/test/config_test/test03/test_data.py @@ -0,0 +1,18 @@ +# Similar to test1, but this time B2 attempt to override base1_1. Since B2 doesn't directly inherit +# from B1, this must raise an error + +expected_results = { + "f": { + "desc": "attempt to override undefined parameter in inherited target", + "exception_msg": "Attempt to override undefined parameter 'base1_1' in 'target:b2'" + }, + "d1": { + "desc": "single target inheritance again", + "target.base1_1": "v_base1_1_d1", + "target.base1_2": "v_base1_2_d1", + "target.base1_3": "v_base1_3_b1", + "target.derived1": "v_derived1_d1", + "target.derived2": "v_derived2_d1" + } +} + diff --git a/tools/test/config_test/test04/mbed_app.json b/tools/test/config_test/test04/mbed_app.json new file mode 100644 index 0000000000..9753f36a4f --- /dev/null +++ b/tools/test/config_test/test04/mbed_app.json @@ -0,0 +1,46 @@ +{ + "custom_targets": { + "b1": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "base1_1": "v_base1_1_b1", + "base1_2": "v_base1_2_b1", + "base1_3": "v_base1_3_b1" + } + }, + "d1": { + "inherits": ["b1"], + "config": { + "derived1": "v_derived1_d1", + "derived2": "v_derived2_d1" + }, + "overrides": { + "base1_1": "v_base1_1_d1", + "base1_2": "v_base1_2_d1" + } + }, + "b2": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "base2_1": "v_base2_1_b2", + "base2_2": "v_base2_2_b2", + "base1_1": "v_base1_1_b2" + } + }, + "f": { + "inherits": ["b2", "d1"], + "config": { + "f1_1": "v_f1_1_f", + "f1_2": "v_f1_2_f" + }, + "overrides": { + "base2_1": "v_base2_1_f", + "base1_1": "v_base1_1_f", + "derived2": "v_derived2_f", + "f1_1": "v_f1_1_f_override" + } + } + } +} diff --git a/tools/test/config_test/test04/test_data.py b/tools/test/config_test/test04/test_data.py new file mode 100644 index 0000000000..50fbfcdb06 --- /dev/null +++ b/tools/test/config_test/test04/test_data.py @@ -0,0 +1,18 @@ +# Similar to test1, but this time B2 attempt to define base1_1. Since base1_1 +# is already defined in B1 and F derives from both B1 and B2, this results +# in an error. However, when building for B2 instead of F, defining base1_1 +# should be OK. + +expected_results = { + "f": { + "desc": "attempt to redefine parameter in target inheritance tree", + "exception_msg": "Parameter name 'base1_1' defined in both 'target:b2' and 'target:b1'" + }, + "b2": { + "desc": "it should be OK to define parameters with the same name in non-related targets", + "target.base2_1": "v_base2_1_b2", + "target.base2_2": "v_base2_2_b2", + "target.base1_1": "v_base1_1_b2" + } +} + diff --git a/tools/test/config_test/test05/mbed_app.json b/tools/test/config_test/test05/mbed_app.json new file mode 100644 index 0000000000..3dd12670d5 --- /dev/null +++ b/tools/test/config_test/test05/mbed_app.json @@ -0,0 +1,35 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0" + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"] + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"] + }, + "both": { + "inherits": ["b1", "b2"] + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "b1_label": { + "app1": "v_app1[b1_label]" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + }, + "dummy_label": { + "app1": "dummy.app1", + "app2": "dummy.app2" + } + } +} diff --git a/tools/test/config_test/test05/test_data.py b/tools/test/config_test/test05/test_data.py new file mode 100644 index 0000000000..65ac4cd718 --- /dev/null +++ b/tools/test/config_test/test05/test_data.py @@ -0,0 +1,29 @@ +# This tests overriding configuration values based on target labels. +# Four targets are defined: +# - "base" is the base target, it doesn't define any extra labels +# - "b1" inherits from "base" and adds the "b1_label" label +# - "b2" inherits from "base" and adds the "b2_label" label +# - "both" inherits from both "b1" and "b2", so it inherits both labels + +expected_results = { + "b1": { + "desc": "override values based on labels (first label)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2" + }, + "b2": { + "desc": "override values based on labels (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]" + }, + "both": { + "desc": "override values based on labels (both labels)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2[b2_label]" + }, + "base": { + "desc": "override values based on labels (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2" + } +} diff --git a/tools/test/config_test/test06/lib1/lib2/mbed_lib.json b/tools/test/config_test/test06/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..117a8c6ad3 --- /dev/null +++ b/tools/test/config_test/test06/lib1/lib2/mbed_lib.json @@ -0,0 +1,17 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib2[b1_label]", + "p2": "v_p2_lib2[b1_label]" + }, + "b2_label": { + "p1": "v_p1_lib2[b2_label]", + "p2": "v_p2_lib2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test06/lib1/mbed_lib.json b/tools/test/config_test/test06/lib1/mbed_lib.json new file mode 100644 index 0000000000..0481e02955 --- /dev/null +++ b/tools/test/config_test/test06/lib1/mbed_lib.json @@ -0,0 +1,16 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib1[b1_label]" + }, + "b2_label": { + "p2": "v_p2_lib1[b2_label]" + } + } +} diff --git a/tools/test/config_test/test06/mbed_app.json b/tools/test/config_test/test06/mbed_app.json new file mode 100644 index 0000000000..5025f659a8 --- /dev/null +++ b/tools/test/config_test/test06/mbed_app.json @@ -0,0 +1,31 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0" + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"] + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"] + }, + "both": { + "inherits": ["b1", "b2"] + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "b1_label": { + "app1": "v_app1[b1_label]" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test06/test_data.py b/tools/test/config_test/test06/test_data.py new file mode 100644 index 0000000000..0a91823b40 --- /dev/null +++ b/tools/test/config_test/test06/test_data.py @@ -0,0 +1,49 @@ +# This build on top of test5 by adding a few libraries with their own configurations +# and overrides. The same targets are used for building and testing (base, b1, b2, both) + +expected_results = { + "base": { + "desc": "override values based on labels with libs (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2", + "lib2.p2": "v_p2_lib2" + }, + "b1": { + "desc": "override values based on labels with libs (first label)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1[b1_label]", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2[b1_label]", + "lib2.p2": "v_p2_lib2[b1_label]" + }, + "b2": { + "desc": "override values based on labels with libs (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2[b2_label]", + "lib2.p2": "v_p2_lib2[b2_label]" + }, + # The values for lib2.p1 and lib2.p2 illustrate how overriding on multiple + # labels work. In lib2, both lib2.p1 and lib2.p2 are overriden for both + # labels (b1_label and b2_label). However, since "b2_label" is specified + # after "b1_label", it sets the final values of the overrides. + "both": { + "desc": "override values based on labels with libs (both labels)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1[b1_label]", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2[b2_label]", + "lib2.p2": "v_p2_lib2[b2_label]" + }, +} diff --git a/tools/test/config_test/test07/lib1/lib2/mbed_lib.json b/tools/test/config_test/test07/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..117a8c6ad3 --- /dev/null +++ b/tools/test/config_test/test07/lib1/lib2/mbed_lib.json @@ -0,0 +1,17 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib2[b1_label]", + "p2": "v_p2_lib2[b1_label]" + }, + "b2_label": { + "p1": "v_p1_lib2[b2_label]", + "p2": "v_p2_lib2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test07/lib1/mbed_lib.json b/tools/test/config_test/test07/lib1/mbed_lib.json new file mode 100644 index 0000000000..0481e02955 --- /dev/null +++ b/tools/test/config_test/test07/lib1/mbed_lib.json @@ -0,0 +1,16 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib1[b1_label]" + }, + "b2_label": { + "p2": "v_p2_lib1[b2_label]" + } + } +} diff --git a/tools/test/config_test/test07/mbed_app.json b/tools/test/config_test/test07/mbed_app.json new file mode 100644 index 0000000000..c56f62402d --- /dev/null +++ b/tools/test/config_test/test07/mbed_app.json @@ -0,0 +1,36 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0" + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"] + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"] + }, + "both": { + "inherits": ["b1", "b2"] + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "*": { + "lib1.p3": "v_p3_lib1_app", + "lib1.p1": "v_p1_lib1_app", + "lib2.p1": "v_p1_lib2_app" + }, + "b1_label": { + "app1": "v_app1[b1_label]" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test07/test_data.py b/tools/test/config_test/test07/test_data.py new file mode 100644 index 0000000000..e9d605acfa --- /dev/null +++ b/tools/test/config_test/test07/test_data.py @@ -0,0 +1,48 @@ +# This build on top of test6 by adding overrides for libs in the application + +expected_results = { + "base": { + "desc": "override values based on labels with libs (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2" + }, + "b1": { + "desc": "override values based on labels with libs (first label)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b1_label]" + }, + "b2": { + "desc": "override values based on labels with libs (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b2_label]" + }, + # The values for lib2.p1 and lib2.p2 illustrate how overriding on multiple + # labels work. In lib2, both lib2.p1 and lib2.p2 are overriden for both + # labels (b1_label and b2_label). However, since "b2_label" is specified + # after "b1_label", it sets the final values of the overrides. + "both": { + "desc": "override values based on labels with libs (both labels)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b2_label]" + } +} diff --git a/tools/test/config_test/test08/lib1/lib2/mbed_lib.json b/tools/test/config_test/test08/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..117a8c6ad3 --- /dev/null +++ b/tools/test/config_test/test08/lib1/lib2/mbed_lib.json @@ -0,0 +1,17 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib2[b1_label]", + "p2": "v_p2_lib2[b1_label]" + }, + "b2_label": { + "p1": "v_p1_lib2[b2_label]", + "p2": "v_p2_lib2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test08/lib1/mbed_lib.json b/tools/test/config_test/test08/lib1/mbed_lib.json new file mode 100644 index 0000000000..0481e02955 --- /dev/null +++ b/tools/test/config_test/test08/lib1/mbed_lib.json @@ -0,0 +1,16 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib1[b1_label]" + }, + "b2_label": { + "p2": "v_p2_lib1[b2_label]" + } + } +} diff --git a/tools/test/config_test/test08/mbed_app.json b/tools/test/config_test/test08/mbed_app.json new file mode 100644 index 0000000000..d4a4e87e92 --- /dev/null +++ b/tools/test/config_test/test08/mbed_app.json @@ -0,0 +1,54 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "par1": "v_par1_base", + "par2": "v_par2_base", + "par3": "v_par3_base" + } + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"], + "overrides": { + "par1": "v_par1_b1" + } + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"], + "overrides": { + "par2": "v_par2_b2" + } + }, + "both": { + "inherits": ["b1", "b2"], + "config": { + "par4": "v_par4_both" + }, + "overrides": { + "par3": "v_par3_both" + } + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "*": { + "lib1.p3": "v_p3_lib1_app", + "lib1.p1": "v_p1_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "target.par1": "v_par1_target_app" + }, + "b1_label": { + "app1": "v_app1[b1_label]" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test08/test_data.py b/tools/test/config_test/test08/test_data.py new file mode 100644 index 0000000000..141bf39725 --- /dev/null +++ b/tools/test/config_test/test08/test_data.py @@ -0,0 +1,58 @@ +# This build on top of test7 by adding some configuration values in targets +# and overriding them in the application + +expected_results = { + "base": { + "desc": "override values based on labels with libs and target params (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_base", + "target.par3": "v_par3_base" + }, + "b1": { + "desc": "override values based on labels with libs and target params (first label)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b1_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_base", + "target.par3": "v_par3_base" + }, + "b2": { + "desc": "override values based on labels with libs and target params (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b2_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_b2", + "target.par3": "v_par3_base" + }, + "both": { + "desc": "override values based on labels with libs and target params (both labels)", + "app.app1": "v_app1[b1_label]", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b2_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_b2", + "target.par3": "v_par3_both", + "target.par4": "v_par4_both" + } +} diff --git a/tools/test/config_test/test09/lib1/lib2/mbed_lib.json b/tools/test/config_test/test09/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..117a8c6ad3 --- /dev/null +++ b/tools/test/config_test/test09/lib1/lib2/mbed_lib.json @@ -0,0 +1,17 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib2[b1_label]", + "p2": "v_p2_lib2[b1_label]" + }, + "b2_label": { + "p1": "v_p1_lib2[b2_label]", + "p2": "v_p2_lib2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test09/lib1/mbed_lib.json b/tools/test/config_test/test09/lib1/mbed_lib.json new file mode 100644 index 0000000000..0481e02955 --- /dev/null +++ b/tools/test/config_test/test09/lib1/mbed_lib.json @@ -0,0 +1,16 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib1[b1_label]" + }, + "b2_label": { + "p2": "v_p2_lib1[b2_label]" + } + } +} diff --git a/tools/test/config_test/test09/mbed_app.json b/tools/test/config_test/test09/mbed_app.json new file mode 100644 index 0000000000..57b0120048 --- /dev/null +++ b/tools/test/config_test/test09/mbed_app.json @@ -0,0 +1,32 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0" + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"] + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"] + }, + "both": { + "inherits": ["b1", "b2"] + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "b1_label": { + "app1": "v_app1[b1_label]", + "app_wrong": "v_dummy" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test09/test_data.py b/tools/test/config_test/test09/test_data.py new file mode 100644 index 0000000000..04757485a9 --- /dev/null +++ b/tools/test/config_test/test09/test_data.py @@ -0,0 +1,34 @@ +# This build on top of test6 by adding an invalid override in mbed_app_override.json for b1_label. +# This will prevent the configuration for working for b1 and both, but it should still +# work for base and b2. + +expected_results = { + "base": { + "desc": "override values based on labels with libs (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2", + "lib2.p2": "v_p2_lib2" + }, + "b1": { + "desc": "override values based on labels with libs - invalid override (first label)", + "exception_msg": "Attempt to override undefined parameter 'app.app_wrong' in 'application[b1_label]" + }, + "b2": { + "desc": "override values based on labels with libs (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2[b2_label]", + "lib2.p2": "v_p2_lib2[b2_label]" + }, + "both": { + "desc": "override values based on labels with libs - invalid override (both labels)", + "exception_msg": "Attempt to override undefined parameter 'app.app_wrong' in 'application[b1_label]" + }, +} diff --git a/tools/test/config_test/test10/lib1/lib2/mbed_lib.json b/tools/test/config_test/test10/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..117a8c6ad3 --- /dev/null +++ b/tools/test/config_test/test10/lib1/lib2/mbed_lib.json @@ -0,0 +1,17 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib2[b1_label]", + "p2": "v_p2_lib2[b1_label]" + }, + "b2_label": { + "p1": "v_p1_lib2[b2_label]", + "p2": "v_p2_lib2[b2_label]" + } + } +} diff --git a/tools/test/config_test/test10/lib1/mbed_lib.json b/tools/test/config_test/test10/lib1/mbed_lib.json new file mode 100644 index 0000000000..0481e02955 --- /dev/null +++ b/tools/test/config_test/test10/lib1/mbed_lib.json @@ -0,0 +1,16 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "b1_label": { + "p1": "v_p1_lib1[b1_label]" + }, + "b2_label": { + "p2": "v_p2_lib1[b2_label]" + } + } +} diff --git a/tools/test/config_test/test10/mbed_app.json b/tools/test/config_test/test10/mbed_app.json new file mode 100644 index 0000000000..16941f2bf3 --- /dev/null +++ b/tools/test/config_test/test10/mbed_app.json @@ -0,0 +1,58 @@ +{ + "custom_targets": { + "base": { + "inherits": ["Target"], + "core": "Cortex-M0", + "config": { + "par1": "v_par1_base", + "par2": "v_par2_base", + "par3": "v_par3_base" + } + }, + "b1": { + "inherits": ["base"], + "extra_labels_add": ["b1_label"], + "overrides": { + "par1": "v_par1_b1" + } + }, + "b2": { + "inherits": ["base"], + "extra_labels_add": ["b2_label"], + "overrides": { + "par2": "v_par2_b2" + } + }, + "both": { + "inherits": ["b1", "b2"], + "config": { + "par4": "v_par4_both" + }, + "overrides": { + "par3": "v_par3_both" + } + } + }, + "config": { + "app1": "v_app1", + "app2": "v_app2" + }, + "target_overrides": { + "*": { + "lib1.p3": "v_p3_lib1_app", + "lib1.p1": "v_p1_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "target.par1": "v_par1_target_app" + }, + "b1_label": { + "app.app1": "v_app1[b1_label_label]" + }, + "b2_label": { + "app2": "v_app2[b2_label]" + }, + "both": { + "target.par4": "v_par4_app[both_label]", + "lib2.p1": "v_p1_lib2_app[both_label]" + } + } +} diff --git a/tools/test/config_test/test10/test_data.py b/tools/test/config_test/test10/test_data.py new file mode 100644 index 0000000000..7ed62e2ad9 --- /dev/null +++ b/tools/test/config_test/test10/test_data.py @@ -0,0 +1,57 @@ +# This builds on top of test8 by adding target-conditional overrides in mbed_app_config.json. + +expected_results = { + "base": { + "desc": "override values based on labels with libs, target params and target overrides (no labels)", + "app.app1": "v_app1", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_base", + "target.par3": "v_par3_base" + }, + "b1": { + "desc": "override values based on labels with libs, target params and target overrides (first label)", + "app.app1": "v_app1[b1_label_label]", + "app.app2": "v_app2", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b1_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_base", + "target.par3": "v_par3_base" + }, + "b2": { + "desc": "override values based on labels with libs, target params and target overrides (second label)", + "app.app1": "v_app1", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2[b2_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_b2", + "target.par3": "v_par3_base" + }, + "both": { + "desc": "override values based on labels with libs, target params and target overrides (both labels)", + "app.app1": "v_app1[b1_label_label]", + "app.app2": "v_app2[b2_label]", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1[b2_label]", + "lib1.p3": "v_p3_lib1_app", + "lib2.p1": "v_p1_lib2_app[both_label]", + "lib2.p2": "v_p2_lib2[b2_label]", + "target.par1": "v_par1_target_app", + "target.par2": "v_par2_b2", + "target.par3": "v_par3_both", + "target.par4": "v_par4_app[both_label]" + } +} diff --git a/tools/test/config_test/test11/lib1/lib2/mbed_lib.json b/tools/test/config_test/test11/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..110332c50a --- /dev/null +++ b/tools/test/config_test/test11/lib1/lib2/mbed_lib.json @@ -0,0 +1,7 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + } +} diff --git a/tools/test/config_test/test11/lib1/mbed_lib.json b/tools/test/config_test/test11/lib1/mbed_lib.json new file mode 100644 index 0000000000..cbdaf70180 --- /dev/null +++ b/tools/test/config_test/test11/lib1/mbed_lib.json @@ -0,0 +1,14 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + }, + "target_overrides": { + "K64F": { + "p1": "v_p1_lib1[b1_label]", + "lib2.p1": "dummy" + } + } +} diff --git a/tools/test/config_test/test11/test_data.py b/tools/test/config_test/test11/test_data.py new file mode 100644 index 0000000000..6bcaed1091 --- /dev/null +++ b/tools/test/config_test/test11/test_data.py @@ -0,0 +1,9 @@ +# Two libraries (lib1 and lib2) define their own configuration parameters +# lib1 tries to override a configuration parameter in lib2, which raises an error + +expected_results = { + "K64F": { + "desc": "lib1 trying to override a config parameter in lib2", + "exception_msg": "Invalid prefix 'lib2' for parameter name 'lib2.p1' in 'library:lib1[K64F]'" + } +} diff --git a/tools/test/config_test/test12/lib1/lib2/mbed_lib.json b/tools/test/config_test/test12/lib1/lib2/mbed_lib.json new file mode 100644 index 0000000000..110332c50a --- /dev/null +++ b/tools/test/config_test/test12/lib1/lib2/mbed_lib.json @@ -0,0 +1,7 @@ +{ + "name": "lib2", + "config": { + "p1": "v_p1_lib2", + "p2": "v_p2_lib2" + } +} diff --git a/tools/test/config_test/test12/lib1/mbed_lib.json b/tools/test/config_test/test12/lib1/mbed_lib.json new file mode 100644 index 0000000000..a85bc4ab0a --- /dev/null +++ b/tools/test/config_test/test12/lib1/mbed_lib.json @@ -0,0 +1,8 @@ +{ + "name": "lib1", + "config": { + "p1": "v_p1_lib1", + "p2": "v_p2_lib1", + "p3": "v_p3_lib1" + } +} diff --git a/tools/test/config_test/test12/mbed_app.json b/tools/test/config_test/test12/mbed_app.json new file mode 100644 index 0000000000..8caddebb07 --- /dev/null +++ b/tools/test/config_test/test12/mbed_app.json @@ -0,0 +1,8 @@ +{ + "target_overrides": { + "K64F": { + "lib1.p1": "v_p1_lib1_app", + "lib2.p1": "v_p1_lib2_app" + } + } +} diff --git a/tools/test/config_test/test12/test_data.py b/tools/test/config_test/test12/test_data.py new file mode 100644 index 0000000000..cd18cdd461 --- /dev/null +++ b/tools/test/config_test/test12/test_data.py @@ -0,0 +1,14 @@ +# Two libraries (lib1 and lib2) define their own configuration parameters +# The application config doesn't have any parameters itself, it just overrides the parameter +# named p1 from both lib1 and lib2. + +expected_results = { + "K64F": { + "desc": "app without its own parameters overrides parameters in other libs", + "lib1.p1": "v_p1_lib1_app", + "lib1.p2": "v_p2_lib1", + "lib1.p3": "v_p3_lib1", + "lib2.p1": "v_p1_lib2_app", + "lib2.p2": "v_p2_lib2" + } +} diff --git a/tools/test/config_test/test13/lib1/mbed_lib.json b/tools/test/config_test/test13/lib1/mbed_lib.json new file mode 100644 index 0000000000..579597839f --- /dev/null +++ b/tools/test/config_test/test13/lib1/mbed_lib.json @@ -0,0 +1,3 @@ +{ + "name": "lib1" +} diff --git a/tools/test/config_test/test13/lib2/mbed_lib.json b/tools/test/config_test/test13/lib2/mbed_lib.json new file mode 100644 index 0000000000..579597839f --- /dev/null +++ b/tools/test/config_test/test13/lib2/mbed_lib.json @@ -0,0 +1,3 @@ +{ + "name": "lib1" +} diff --git a/tools/test/config_test/test13/test_data.py b/tools/test/config_test/test13/test_data.py new file mode 100644 index 0000000000..7d394e84ec --- /dev/null +++ b/tools/test/config_test/test13/test_data.py @@ -0,0 +1,8 @@ +# Create two libraries named "lib1", which must raise an error + +expected_results = { + "K64F": { + "desc": "attempt to configure two libraries named 'lib1'", + "exception_msg": "Library name 'lib1' is not unique" + } +} diff --git a/tools/test/config_test/test14/mbed_app.json b/tools/test/config_test/test14/mbed_app.json new file mode 100644 index 0000000000..59cbd29e35 --- /dev/null +++ b/tools/test/config_test/test14/mbed_app.json @@ -0,0 +1,3 @@ +{ + "unknown_key": "dummy_value" +} diff --git a/tools/test/config_test/test14/test_data.py b/tools/test/config_test/test14/test_data.py new file mode 100644 index 0000000000..1db33cd6d4 --- /dev/null +++ b/tools/test/config_test/test14/test_data.py @@ -0,0 +1,8 @@ +# Put an invalid key in the application configuration + +expected_results = { + "K64F": { + "desc": "invalid key in mbed_app_config.json", + "exception_msg": "Unknown key(s)" + } +} diff --git a/tools/test/config_test/test15/lib1/mbed_lib.json b/tools/test/config_test/test15/lib1/mbed_lib.json new file mode 100644 index 0000000000..bd529cf366 --- /dev/null +++ b/tools/test/config_test/test15/lib1/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib1", + "unknown_key": "dummy_value" +} diff --git a/tools/test/config_test/test15/test_data.py b/tools/test/config_test/test15/test_data.py new file mode 100644 index 0000000000..4518f78783 --- /dev/null +++ b/tools/test/config_test/test15/test_data.py @@ -0,0 +1,8 @@ +# Put an invalid key in the library configuration + +expected_results = { + "K64F": { + "desc": "invalid key in mbed_lib_config.json", + "exception_msg": "Unknown key(s)" + } +} diff --git a/tools/test/config_test/test16/lib1/mbed_lib.json b/tools/test/config_test/test16/lib1/mbed_lib.json new file mode 100644 index 0000000000..705f737791 --- /dev/null +++ b/tools/test/config_test/test16/lib1/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib1", + "macros": ["LIB1_1=1", "LIB1_2"] +} diff --git a/tools/test/config_test/test16/lib2/mbed_lib.json b/tools/test/config_test/test16/lib2/mbed_lib.json new file mode 100644 index 0000000000..10b20f81c7 --- /dev/null +++ b/tools/test/config_test/test16/lib2/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib2", + "macros": ["LIB2_1=5", "LIB1_2"] +} diff --git a/tools/test/config_test/test16/mbed_app.json b/tools/test/config_test/test16/mbed_app.json new file mode 100644 index 0000000000..f50a39bfd1 --- /dev/null +++ b/tools/test/config_test/test16/mbed_app.json @@ -0,0 +1,3 @@ +{ + "macros": ["APP1=10", "APP2", "LIB2_1=5"] +} diff --git a/tools/test/config_test/test16/test_data.py b/tools/test/config_test/test16/test_data.py new file mode 100644 index 0000000000..0032c138ae --- /dev/null +++ b/tools/test/config_test/test16/test_data.py @@ -0,0 +1,12 @@ +# Macro test: defined macros in the top level app and 2 libs, check if they +# are reported properly. +# The app defines one macro with value the same as lib2, while lib2 defined +# the same macro without value as lib1. Since the definitions are comptabile, +# no error should be raised + +expected_results = { + "K64F": { + "desc": "test macro definitions", + "expected_macros": ["APP1=10", "APP2", "LIB1_1=1","LIB1_2", "LIB2_1=5"] + } +} diff --git a/tools/test/config_test/test17/lib1/mbed_lib.json b/tools/test/config_test/test17/lib1/mbed_lib.json new file mode 100644 index 0000000000..705f737791 --- /dev/null +++ b/tools/test/config_test/test17/lib1/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib1", + "macros": ["LIB1_1=1", "LIB1_2"] +} diff --git a/tools/test/config_test/test17/lib2/mbed_lib.json b/tools/test/config_test/test17/lib2/mbed_lib.json new file mode 100644 index 0000000000..10b20f81c7 --- /dev/null +++ b/tools/test/config_test/test17/lib2/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib2", + "macros": ["LIB2_1=5", "LIB1_2"] +} diff --git a/tools/test/config_test/test17/mbed_app.json b/tools/test/config_test/test17/mbed_app.json new file mode 100644 index 0000000000..89eb28c245 --- /dev/null +++ b/tools/test/config_test/test17/mbed_app.json @@ -0,0 +1,3 @@ +{ + "macros": ["APP1=10", "APP2", "LIB2_1=10"] +} diff --git a/tools/test/config_test/test17/test_data.py b/tools/test/config_test/test17/test_data.py new file mode 100644 index 0000000000..b55da016d1 --- /dev/null +++ b/tools/test/config_test/test17/test_data.py @@ -0,0 +1,9 @@ +# Build on top of test16 +# Adds an invalid macro redefinition in the app + +expected_results = { + "K64F": { + "desc": "test invalid macro re-definition in the app", + "exception_msg": "Macro 'LIB2_1' defined in both 'library:lib2' and 'application' with incompatible values" + } +} diff --git a/tools/test/config_test/test18/lib1/mbed_lib.json b/tools/test/config_test/test18/lib1/mbed_lib.json new file mode 100644 index 0000000000..705f737791 --- /dev/null +++ b/tools/test/config_test/test18/lib1/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib1", + "macros": ["LIB1_1=1", "LIB1_2"] +} diff --git a/tools/test/config_test/test18/lib2/mbed_lib.json b/tools/test/config_test/test18/lib2/mbed_lib.json new file mode 100644 index 0000000000..3db0d018cc --- /dev/null +++ b/tools/test/config_test/test18/lib2/mbed_lib.json @@ -0,0 +1,4 @@ +{ + "name": "lib2", + "macros": ["LIB2_1=5", "LIB1_2=3"] +} diff --git a/tools/test/config_test/test18/mbed_app.json b/tools/test/config_test/test18/mbed_app.json new file mode 100644 index 0000000000..f50a39bfd1 --- /dev/null +++ b/tools/test/config_test/test18/mbed_app.json @@ -0,0 +1,3 @@ +{ + "macros": ["APP1=10", "APP2", "LIB2_1=5"] +} diff --git a/tools/test/config_test/test18/test_data.py b/tools/test/config_test/test18/test_data.py new file mode 100644 index 0000000000..e228833381 --- /dev/null +++ b/tools/test/config_test/test18/test_data.py @@ -0,0 +1,8 @@ +# Like test17, but this time the invalid re-definition is in lib2, not in the app + +expected_results = { + "K64F": { + "desc": "test invalid macro re-definition in a library", + "exception_msg": "defined in both" + } +} diff --git a/tools/test/config_test/test19/mbed_app.json b/tools/test/config_test/test19/mbed_app.json new file mode 100644 index 0000000000..6970156cd2 --- /dev/null +++ b/tools/test/config_test/test19/mbed_app.json @@ -0,0 +1,4 @@ +{ + "macros": [], + "invalid_key": "invalid_value" +} diff --git a/tools/test/config_test/test19/test_data.py b/tools/test/config_test/test19/test_data.py new file mode 100644 index 0000000000..40e250b865 --- /dev/null +++ b/tools/test/config_test/test19/test_data.py @@ -0,0 +1,8 @@ +# Test that invalid keys in application configuration are not allowed + +expected_results = { + "K64F": { + "desc": "test invalid key in application config", + "exception_msg": "Unknown key(s) 'invalid_key'" + } +} diff --git a/tools/test/config_test/test20/lib1/mbed_lib.json b/tools/test/config_test/test20/lib1/mbed_lib.json new file mode 100644 index 0000000000..a42cdd3eba --- /dev/null +++ b/tools/test/config_test/test20/lib1/mbed_lib.json @@ -0,0 +1,5 @@ +{ + "name": "lib1", + "macros": [], + "invalid_key": "invalid_value" +} diff --git a/tools/test/config_test/test20/test_data.py b/tools/test/config_test/test20/test_data.py new file mode 100644 index 0000000000..7e9f6461b9 --- /dev/null +++ b/tools/test/config_test/test20/test_data.py @@ -0,0 +1,8 @@ +# Like test19, but this time check invalid key in a library configuration + +expected_results = { + "K64F": { + "desc": "test invalid key in lib config", + "exception_msg": "Unknown key(s) 'invalid_key'" + } +} diff --git a/tools/toolchains/gcc.py b/tools/toolchains/gcc.py index 58ed5dd4b3..2dfc03e24a 100644 --- a/tools/toolchains/gcc.py +++ b/tools/toolchains/gcc.py @@ -89,7 +89,7 @@ class GCC(mbedToolchain): 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.ld = [join(tool_path, "arm-none-eabi-gcc"), "-Wl,--gc-sections", "-Wl,--wrap,main"] + self.cpu + 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.sys_libs = ["stdc++", "supc++", "m", "c", "gcc"] self.ar = join(tool_path, "arm-none-eabi-ar") @@ -277,4 +277,3 @@ class GCC_CR(GCC): if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368"]: self.ld.extend(["-u _printf_float", "-u _scanf_float"]) self.ld += ["-nostdlib"] -