diff options
Diffstat (limited to 'tool/mbed/mbed-sdk/workspace_tools/build.py')
-rwxr-xr-x | tool/mbed/mbed-sdk/workspace_tools/build.py | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/tool/mbed/mbed-sdk/workspace_tools/build.py b/tool/mbed/mbed-sdk/workspace_tools/build.py new file mode 100755 index 0000000000..f402cb0222 --- /dev/null +++ b/tool/mbed/mbed-sdk/workspace_tools/build.py @@ -0,0 +1,262 @@ +#! /usr/bin/env python2 +""" +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. + +LIBRARIES BUILD +""" +import sys +from time import time +from os.path import join, abspath, dirname + + +# Be sure that the tools directory is in the search path +ROOT = abspath(join(dirname(__file__), "..")) +sys.path.insert(0, ROOT) + + +from workspace_tools.toolchains import TOOLCHAINS +from workspace_tools.toolchains import print_notify_verbose +from workspace_tools.targets import TARGET_NAMES, TARGET_MAP +from workspace_tools.options import get_default_options_parser +from workspace_tools.build_api import build_mbed_libs, build_lib +from workspace_tools.build_api import mcu_toolchain_matrix +from workspace_tools.build_api import static_analysis_scan, static_analysis_scan_lib, static_analysis_scan_library +from workspace_tools.build_api import print_build_results +from workspace_tools.settings import CPPCHECK_CMD, CPPCHECK_MSG_FORMAT + +if __name__ == '__main__': + start = time() + + # Parse Options + parser = get_default_options_parser() + + # Extra libraries + parser.add_option("-r", "--rtos", + action="store_true", + dest="rtos", + default=False, + help="Compile the rtos") + + parser.add_option("-e", "--eth", + action="store_true", dest="eth", + default=False, + help="Compile the ethernet library") + + parser.add_option("-U", "--usb_host", + action="store_true", + dest="usb_host", + default=False, + help="Compile the USB Host library") + + parser.add_option("-u", "--usb", + action="store_true", + dest="usb", + default=False, + help="Compile the USB Device library") + + parser.add_option("-d", "--dsp", + action="store_true", + dest="dsp", + default=False, + help="Compile the DSP library") + + parser.add_option("-F", "--fat", + action="store_true", + dest="fat", + default=False, + help="Compile FS ad SD card file system library") + + parser.add_option("-b", "--ublox", + action="store_true", + dest="ublox", + default=False, + help="Compile the u-blox library") + + parser.add_option("", "--cpputest", + action="store_true", + dest="cpputest_lib", + default=False, + help="Compiles 'cpputest' unit test library (library should be on the same directory level as mbed repository)") + + parser.add_option("-D", "", + action="append", + dest="macros", + help="Add a macro definition") + + parser.add_option("-S", "--supported-toolchains", + action="store_true", + dest="supported_toolchains", + default=False, + help="Displays supported matrix of MCUs and toolchains") + + parser.add_option("", "--cppcheck", + action="store_true", + dest="cppcheck_validation", + default=False, + help="Forces 'cppcheck' static code analysis") + + parser.add_option('-f', '--filter', + dest='general_filter_regex', + default=None, + help='For some commands you can use filter to filter out results') + + parser.add_option("-j", "--jobs", type="int", dest="jobs", + default=1, help="Number of concurrent jobs (default 1). Use 0 for 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("--silent", + action="store_true", + dest="silent", + default=False, + help="Silent diagnostic output (no copy, compile notification)") + + parser.add_option("-x", "--extra-verbose-notifications", + action="store_true", + dest="extra_verbose_notify", + default=False, + help="Makes compiler more verbose, CI friendly.") + + (options, args) = parser.parse_args() + + # Only prints matrix of supported toolchains + if options.supported_toolchains: + print mcu_toolchain_matrix(platform_filter=options.general_filter_regex) + exit(0) + + # Get target list + if options.mcu: + mcu_list = (options.mcu).split(",") + for mcu in mcu_list: + if mcu not in TARGET_NAMES: + print "Given MCU '%s' not into the supported list:\n%s" % (mcu, TARGET_NAMES) + sys.exit(1) + targets = mcu_list + else: + targets = TARGET_NAMES + + # Get toolchains list + if options.tool: + toolchain_list = (options.tool).split(",") + for tc in toolchain_list: + if tc not in TOOLCHAINS: + print "Given toolchain '%s' not into the supported list:\n%s" % (tc, TOOLCHAINS) + sys.exit(1) + toolchains = toolchain_list + else: + toolchains = TOOLCHAINS + + # Get libraries list + libraries = [] + + # Additional Libraries + if options.rtos: + libraries.extend(["rtx", "rtos"]) + if options.eth: + libraries.append("eth") + if options.usb: + libraries.append("usb") + if options.usb_host: + libraries.append("usb_host") + if options.dsp: + libraries.extend(["cmsis_dsp", "dsp"]) + if options.fat: + libraries.extend(["fat"]) + if options.ublox: + libraries.extend(["rtx", "rtos", "usb_host", "ublox"]) + if options.cpputest_lib: + libraries.extend(["cpputest"]) + + notify = print_notify_verbose if options.extra_verbose_notify else None # Special notify for CI (more verbose) + + # Build results + failures = [] + successes = [] + skipped = [] + + # CPPCHECK code validation + if options.cppcheck_validation: + for toolchain in toolchains: + for target in targets: + try: + mcu = TARGET_MAP[target] + # CMSIS and MBED libs analysis + static_analysis_scan(mcu, toolchain, CPPCHECK_CMD, CPPCHECK_MSG_FORMAT, verbose=options.verbose, jobs=options.jobs) + for lib_id in libraries: + # Static check for library + static_analysis_scan_lib(lib_id, mcu, toolchain, CPPCHECK_CMD, CPPCHECK_MSG_FORMAT, + options=options.options, + notify=notify, verbose=options.verbose, jobs=options.jobs, clean=options.clean, + macros=options.macros) + pass + except Exception, e: + if options.verbose: + import traceback + traceback.print_exc(file=sys.stdout) + sys.exit(1) + print e + else: + # Build + for toolchain in toolchains: + for target in targets: + tt_id = "%s::%s" % (toolchain, target) + try: + mcu = TARGET_MAP[target] + lib_build_res = build_mbed_libs(mcu, toolchain, + options=options.options, + notify=notify, + verbose=options.verbose, + silent=options.silent, + jobs=options.jobs, + clean=options.clean, + macros=options.macros) + for lib_id in libraries: + notify = print_notify_verbose if options.extra_verbose_notify else None # Special notify for CI (more verbose) + build_lib(lib_id, mcu, toolchain, + options=options.options, + notify=notify, + verbose=options.verbose, + silent=options.silent, + clean=options.clean, + macros=options.macros, + jobs=options.jobs) + if lib_build_res: + successes.append(tt_id) + else: + skipped.append(tt_id) + except Exception, e: + if options.verbose: + import traceback + traceback.print_exc(file=sys.stdout) + sys.exit(1) + failures.append(tt_id) + print e + + # Write summary of the builds + print + print "Completed in: (%.2f)s" % (time() - start) + print + + print print_build_results(successes, "Build successes:"), + print print_build_results(skipped, "Build skipped:"), + print print_build_results(failures, "Build failures:"), + + if failures: + sys.exit(1) |