init

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:16:49 2018 -0700
Revision:
10:46a4cf51ee38
Parent:
9:d58e77ebd769
remove mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nathan Yonkee 9:d58e77ebd769 1 #! /usr/bin/env python2
Nathan Yonkee 9:d58e77ebd769 2 """
Nathan Yonkee 9:d58e77ebd769 3 mbed SDK
Nathan Yonkee 9:d58e77ebd769 4 Copyright (c) 2011-2013 ARM Limited
Nathan Yonkee 9:d58e77ebd769 5
Nathan Yonkee 9:d58e77ebd769 6 Licensed under the Apache License, Version 2.0 (the "License");
Nathan Yonkee 9:d58e77ebd769 7 you may not use this file except in compliance with the License.
Nathan Yonkee 9:d58e77ebd769 8 You may obtain a copy of the License at
Nathan Yonkee 9:d58e77ebd769 9
Nathan Yonkee 9:d58e77ebd769 10 http://www.apache.org/licenses/LICENSE-2.0
Nathan Yonkee 9:d58e77ebd769 11
Nathan Yonkee 9:d58e77ebd769 12 Unless required by applicable law or agreed to in writing, software
Nathan Yonkee 9:d58e77ebd769 13 distributed under the License is distributed on an "AS IS" BASIS,
Nathan Yonkee 9:d58e77ebd769 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Nathan Yonkee 9:d58e77ebd769 15 See the License for the specific language governing permissions and
Nathan Yonkee 9:d58e77ebd769 16 limitations under the License.
Nathan Yonkee 9:d58e77ebd769 17
Nathan Yonkee 9:d58e77ebd769 18 LIBRARIES BUILD
Nathan Yonkee 9:d58e77ebd769 19 """
Nathan Yonkee 9:d58e77ebd769 20 from __future__ import print_function, division, absolute_import
Nathan Yonkee 9:d58e77ebd769 21
Nathan Yonkee 9:d58e77ebd769 22 import sys
Nathan Yonkee 9:d58e77ebd769 23 from time import time
Nathan Yonkee 9:d58e77ebd769 24 from os.path import join, abspath, dirname
Nathan Yonkee 9:d58e77ebd769 25
Nathan Yonkee 9:d58e77ebd769 26
Nathan Yonkee 9:d58e77ebd769 27 # Be sure that the tools directory is in the search path
Nathan Yonkee 9:d58e77ebd769 28 ROOT = abspath(join(dirname(__file__), ".."))
Nathan Yonkee 9:d58e77ebd769 29 sys.path.insert(0, ROOT)
Nathan Yonkee 9:d58e77ebd769 30
Nathan Yonkee 9:d58e77ebd769 31
Nathan Yonkee 9:d58e77ebd769 32 from tools.toolchains import TOOLCHAINS, TOOLCHAIN_CLASSES, TOOLCHAIN_PATHS
Nathan Yonkee 9:d58e77ebd769 33 from tools.toolchains import mbedToolchain
Nathan Yonkee 9:d58e77ebd769 34 from tools.targets import TARGET_NAMES, TARGET_MAP
Nathan Yonkee 9:d58e77ebd769 35 from tools.options import get_default_options_parser
Nathan Yonkee 9:d58e77ebd769 36 from tools.options import extract_profile
Nathan Yonkee 9:d58e77ebd769 37 from tools.options import extract_mcus
Nathan Yonkee 9:d58e77ebd769 38 from tools.build_api import build_library, build_mbed_libs, build_lib
Nathan Yonkee 9:d58e77ebd769 39 from tools.build_api import mcu_toolchain_matrix
Nathan Yonkee 9:d58e77ebd769 40 from tools.build_api import print_build_results
Nathan Yonkee 9:d58e77ebd769 41 from tools.settings import CPPCHECK_CMD, CPPCHECK_MSG_FORMAT
Nathan Yonkee 9:d58e77ebd769 42 from utils import argparse_filestring_type, args_error
Nathan Yonkee 9:d58e77ebd769 43 from tools.settings import CPPCHECK_CMD, CPPCHECK_MSG_FORMAT, CLI_COLOR_MAP
Nathan Yonkee 9:d58e77ebd769 44 from utils import argparse_filestring_type, argparse_dir_not_parent
Nathan Yonkee 9:d58e77ebd769 45
Nathan Yonkee 9:d58e77ebd769 46 if __name__ == '__main__':
Nathan Yonkee 9:d58e77ebd769 47 start = time()
Nathan Yonkee 9:d58e77ebd769 48
Nathan Yonkee 9:d58e77ebd769 49 # Parse Options
Nathan Yonkee 9:d58e77ebd769 50 parser = get_default_options_parser()
Nathan Yonkee 9:d58e77ebd769 51
Nathan Yonkee 9:d58e77ebd769 52 parser.add_argument("--source", dest="source_dir", type=argparse_filestring_type,
Nathan Yonkee 9:d58e77ebd769 53 default=None, help="The source (input) directory", action="append")
Nathan Yonkee 9:d58e77ebd769 54
Nathan Yonkee 9:d58e77ebd769 55 parser.add_argument("--build", dest="build_dir", type=argparse_dir_not_parent(ROOT),
Nathan Yonkee 9:d58e77ebd769 56 default=None, help="The build (output) directory")
Nathan Yonkee 9:d58e77ebd769 57
Nathan Yonkee 9:d58e77ebd769 58 parser.add_argument("--no-archive", dest="no_archive", action="store_true",
Nathan Yonkee 9:d58e77ebd769 59 default=False, help="Do not produce archive (.ar) file, but rather .o")
Nathan Yonkee 9:d58e77ebd769 60
Nathan Yonkee 9:d58e77ebd769 61 # Extra libraries
Nathan Yonkee 9:d58e77ebd769 62 parser.add_argument("-r", "--rtos",
Nathan Yonkee 9:d58e77ebd769 63 action="store_true",
Nathan Yonkee 9:d58e77ebd769 64 dest="rtos",
Nathan Yonkee 9:d58e77ebd769 65 default=False,
Nathan Yonkee 9:d58e77ebd769 66 help="Compile the rtos")
Nathan Yonkee 9:d58e77ebd769 67
Nathan Yonkee 9:d58e77ebd769 68 parser.add_argument("--rpc",
Nathan Yonkee 9:d58e77ebd769 69 action="store_true",
Nathan Yonkee 9:d58e77ebd769 70 dest="rpc",
Nathan Yonkee 9:d58e77ebd769 71 default=False,
Nathan Yonkee 9:d58e77ebd769 72 help="Compile the rpc library")
Nathan Yonkee 9:d58e77ebd769 73
Nathan Yonkee 9:d58e77ebd769 74 parser.add_argument("-u", "--usb",
Nathan Yonkee 9:d58e77ebd769 75 action="store_true",
Nathan Yonkee 9:d58e77ebd769 76 dest="usb",
Nathan Yonkee 9:d58e77ebd769 77 default=False,
Nathan Yonkee 9:d58e77ebd769 78 help="Compile the USB Device library")
Nathan Yonkee 9:d58e77ebd769 79
Nathan Yonkee 9:d58e77ebd769 80 parser.add_argument("-d", "--dsp",
Nathan Yonkee 9:d58e77ebd769 81 action="store_true",
Nathan Yonkee 9:d58e77ebd769 82 dest="dsp",
Nathan Yonkee 9:d58e77ebd769 83 default=False,
Nathan Yonkee 9:d58e77ebd769 84 help="Compile the DSP library")
Nathan Yonkee 9:d58e77ebd769 85
Nathan Yonkee 9:d58e77ebd769 86 parser.add_argument( "--cpputest",
Nathan Yonkee 9:d58e77ebd769 87 action="store_true",
Nathan Yonkee 9:d58e77ebd769 88 dest="cpputest_lib",
Nathan Yonkee 9:d58e77ebd769 89 default=False,
Nathan Yonkee 9:d58e77ebd769 90 help="Compiles 'cpputest' unit test library (library should be on the same directory level as mbed repository)")
Nathan Yonkee 9:d58e77ebd769 91
Nathan Yonkee 9:d58e77ebd769 92 parser.add_argument("-D",
Nathan Yonkee 9:d58e77ebd769 93 action="append",
Nathan Yonkee 9:d58e77ebd769 94 dest="macros",
Nathan Yonkee 9:d58e77ebd769 95 help="Add a macro definition")
Nathan Yonkee 9:d58e77ebd769 96
Nathan Yonkee 9:d58e77ebd769 97 parser.add_argument("-S", "--supported-toolchains",
Nathan Yonkee 9:d58e77ebd769 98 action="store_true",
Nathan Yonkee 9:d58e77ebd769 99 dest="supported_toolchains",
Nathan Yonkee 9:d58e77ebd769 100 default=False,
Nathan Yonkee 9:d58e77ebd769 101 help="Displays supported matrix of MCUs and toolchains")
Nathan Yonkee 9:d58e77ebd769 102
Nathan Yonkee 9:d58e77ebd769 103 parser.add_argument('-f', '--filter',
Nathan Yonkee 9:d58e77ebd769 104 dest='general_filter_regex',
Nathan Yonkee 9:d58e77ebd769 105 default=None,
Nathan Yonkee 9:d58e77ebd769 106 help='For some commands you can use filter to filter out results')
Nathan Yonkee 9:d58e77ebd769 107
Nathan Yonkee 9:d58e77ebd769 108 parser.add_argument("-j", "--jobs", type=int, dest="jobs",
Nathan Yonkee 9:d58e77ebd769 109 default=0, help="Number of concurrent jobs. Default: 0/auto (based on host machine's number of CPUs)")
Nathan Yonkee 9:d58e77ebd769 110 parser.add_argument("-N", "--artifact-name", dest="artifact_name",
Nathan Yonkee 9:d58e77ebd769 111 default=None, help="The built project's name")
Nathan Yonkee 9:d58e77ebd769 112
Nathan Yonkee 9:d58e77ebd769 113 parser.add_argument("-v", "--verbose",
Nathan Yonkee 9:d58e77ebd769 114 action="store_true",
Nathan Yonkee 9:d58e77ebd769 115 dest="verbose",
Nathan Yonkee 9:d58e77ebd769 116 default=False,
Nathan Yonkee 9:d58e77ebd769 117 help="Verbose diagnostic output")
Nathan Yonkee 9:d58e77ebd769 118
Nathan Yonkee 9:d58e77ebd769 119 parser.add_argument("--silent",
Nathan Yonkee 9:d58e77ebd769 120 action="store_true",
Nathan Yonkee 9:d58e77ebd769 121 dest="silent",
Nathan Yonkee 9:d58e77ebd769 122 default=False,
Nathan Yonkee 9:d58e77ebd769 123 help="Silent diagnostic output (no copy, compile notification)")
Nathan Yonkee 9:d58e77ebd769 124
Nathan Yonkee 9:d58e77ebd769 125 parser.add_argument("-x", "--extra-verbose-notifications",
Nathan Yonkee 9:d58e77ebd769 126 action="store_true",
Nathan Yonkee 9:d58e77ebd769 127 dest="extra_verbose_notify",
Nathan Yonkee 9:d58e77ebd769 128 default=False,
Nathan Yonkee 9:d58e77ebd769 129 help="Makes compiler more verbose, CI friendly.")
Nathan Yonkee 9:d58e77ebd769 130
Nathan Yonkee 9:d58e77ebd769 131 options = parser.parse_args()
Nathan Yonkee 9:d58e77ebd769 132
Nathan Yonkee 9:d58e77ebd769 133 # Only prints matrix of supported toolchains
Nathan Yonkee 9:d58e77ebd769 134 if options.supported_toolchains:
Nathan Yonkee 9:d58e77ebd769 135 print(mcu_toolchain_matrix(platform_filter=options.general_filter_regex))
Nathan Yonkee 9:d58e77ebd769 136 exit(0)
Nathan Yonkee 9:d58e77ebd769 137
Nathan Yonkee 9:d58e77ebd769 138
Nathan Yonkee 9:d58e77ebd769 139 # Get target list
Nathan Yonkee 9:d58e77ebd769 140 targets = extract_mcus(parser, options) if options.mcu else TARGET_NAMES
Nathan Yonkee 9:d58e77ebd769 141
Nathan Yonkee 9:d58e77ebd769 142 # Get toolchains list
Nathan Yonkee 9:d58e77ebd769 143 toolchains = options.tool if options.tool else TOOLCHAINS
Nathan Yonkee 9:d58e77ebd769 144
Nathan Yonkee 9:d58e77ebd769 145 if options.source_dir and not options.build_dir:
Nathan Yonkee 9:d58e77ebd769 146 args_error(parser, "argument --build is required by argument --source")
Nathan Yonkee 9:d58e77ebd769 147
Nathan Yonkee 9:d58e77ebd769 148 if options.color:
Nathan Yonkee 9:d58e77ebd769 149 # This import happens late to prevent initializing colorization when we don't need it
Nathan Yonkee 9:d58e77ebd769 150 import colorize
Nathan Yonkee 9:d58e77ebd769 151 if options.verbose:
Nathan Yonkee 9:d58e77ebd769 152 notify = mbedToolchain.print_notify_verbose
Nathan Yonkee 9:d58e77ebd769 153 else:
Nathan Yonkee 9:d58e77ebd769 154 notify = mbedToolchain.print_notify
Nathan Yonkee 9:d58e77ebd769 155 notify = colorize.print_in_color_notifier(CLI_COLOR_MAP, notify)
Nathan Yonkee 9:d58e77ebd769 156 else:
Nathan Yonkee 9:d58e77ebd769 157 notify = None
Nathan Yonkee 9:d58e77ebd769 158
Nathan Yonkee 9:d58e77ebd769 159 # Get libraries list
Nathan Yonkee 9:d58e77ebd769 160 libraries = []
Nathan Yonkee 9:d58e77ebd769 161
Nathan Yonkee 9:d58e77ebd769 162 # Additional Libraries
Nathan Yonkee 9:d58e77ebd769 163 if options.rpc:
Nathan Yonkee 9:d58e77ebd769 164 libraries.extend(["rpc"])
Nathan Yonkee 9:d58e77ebd769 165 if options.usb:
Nathan Yonkee 9:d58e77ebd769 166 libraries.append("usb")
Nathan Yonkee 9:d58e77ebd769 167 if options.dsp:
Nathan Yonkee 9:d58e77ebd769 168 libraries.extend(["dsp"])
Nathan Yonkee 9:d58e77ebd769 169 if options.cpputest_lib:
Nathan Yonkee 9:d58e77ebd769 170 libraries.extend(["cpputest"])
Nathan Yonkee 9:d58e77ebd769 171
Nathan Yonkee 9:d58e77ebd769 172 # Build results
Nathan Yonkee 9:d58e77ebd769 173 failures = []
Nathan Yonkee 9:d58e77ebd769 174 successes = []
Nathan Yonkee 9:d58e77ebd769 175 skipped = []
Nathan Yonkee 9:d58e77ebd769 176
Nathan Yonkee 9:d58e77ebd769 177 for toolchain in toolchains:
Nathan Yonkee 9:d58e77ebd769 178 if not TOOLCHAIN_CLASSES[toolchain].check_executable():
Nathan Yonkee 9:d58e77ebd769 179 search_path = TOOLCHAIN_PATHS[toolchain] or "No path set"
Nathan Yonkee 9:d58e77ebd769 180 args_error(parser, "Could not find executable for %s.\n"
Nathan Yonkee 9:d58e77ebd769 181 "Currently set search path: %s"
Nathan Yonkee 9:d58e77ebd769 182 % (toolchain, search_path))
Nathan Yonkee 9:d58e77ebd769 183
Nathan Yonkee 9:d58e77ebd769 184 for toolchain in toolchains:
Nathan Yonkee 9:d58e77ebd769 185 for target in targets:
Nathan Yonkee 9:d58e77ebd769 186 tt_id = "%s::%s" % (toolchain, target)
Nathan Yonkee 9:d58e77ebd769 187 if toolchain not in TARGET_MAP[target].supported_toolchains:
Nathan Yonkee 9:d58e77ebd769 188 # Log this later
Nathan Yonkee 9:d58e77ebd769 189 print("%s skipped: toolchain not supported" % tt_id)
Nathan Yonkee 9:d58e77ebd769 190 skipped.append(tt_id)
Nathan Yonkee 9:d58e77ebd769 191 else:
Nathan Yonkee 9:d58e77ebd769 192 try:
Nathan Yonkee 9:d58e77ebd769 193 mcu = TARGET_MAP[target]
Nathan Yonkee 9:d58e77ebd769 194 profile = extract_profile(parser, options, toolchain)
Nathan Yonkee 9:d58e77ebd769 195 if options.source_dir:
Nathan Yonkee 9:d58e77ebd769 196 lib_build_res = build_library(options.source_dir, options.build_dir, mcu, toolchain,
Nathan Yonkee 9:d58e77ebd769 197 extra_verbose=options.extra_verbose_notify,
Nathan Yonkee 9:d58e77ebd769 198 verbose=options.verbose,
Nathan Yonkee 9:d58e77ebd769 199 silent=options.silent,
Nathan Yonkee 9:d58e77ebd769 200 jobs=options.jobs,
Nathan Yonkee 9:d58e77ebd769 201 clean=options.clean,
Nathan Yonkee 9:d58e77ebd769 202 archive=(not options.no_archive),
Nathan Yonkee 9:d58e77ebd769 203 macros=options.macros,
Nathan Yonkee 9:d58e77ebd769 204 name=options.artifact_name,
Nathan Yonkee 9:d58e77ebd769 205 build_profile=profile)
Nathan Yonkee 9:d58e77ebd769 206 else:
Nathan Yonkee 9:d58e77ebd769 207 lib_build_res = build_mbed_libs(mcu, toolchain,
Nathan Yonkee 9:d58e77ebd769 208 extra_verbose=options.extra_verbose_notify,
Nathan Yonkee 9:d58e77ebd769 209 verbose=options.verbose,
Nathan Yonkee 9:d58e77ebd769 210 silent=options.silent,
Nathan Yonkee 9:d58e77ebd769 211 jobs=options.jobs,
Nathan Yonkee 9:d58e77ebd769 212 clean=options.clean,
Nathan Yonkee 9:d58e77ebd769 213 macros=options.macros,
Nathan Yonkee 9:d58e77ebd769 214 build_profile=profile)
Nathan Yonkee 9:d58e77ebd769 215
Nathan Yonkee 9:d58e77ebd769 216 for lib_id in libraries:
Nathan Yonkee 9:d58e77ebd769 217 build_lib(lib_id, mcu, toolchain,
Nathan Yonkee 9:d58e77ebd769 218 extra_verbose=options.extra_verbose_notify,
Nathan Yonkee 9:d58e77ebd769 219 verbose=options.verbose,
Nathan Yonkee 9:d58e77ebd769 220 silent=options.silent,
Nathan Yonkee 9:d58e77ebd769 221 clean=options.clean,
Nathan Yonkee 9:d58e77ebd769 222 macros=options.macros,
Nathan Yonkee 9:d58e77ebd769 223 jobs=options.jobs,
Nathan Yonkee 9:d58e77ebd769 224 build_profile=profile)
Nathan Yonkee 9:d58e77ebd769 225 if lib_build_res:
Nathan Yonkee 9:d58e77ebd769 226 successes.append(tt_id)
Nathan Yonkee 9:d58e77ebd769 227 else:
Nathan Yonkee 9:d58e77ebd769 228 skipped.append(tt_id)
Nathan Yonkee 9:d58e77ebd769 229 except Exception as e:
Nathan Yonkee 9:d58e77ebd769 230 if options.verbose:
Nathan Yonkee 9:d58e77ebd769 231 import traceback
Nathan Yonkee 9:d58e77ebd769 232 traceback.print_exc(file=sys.stdout)
Nathan Yonkee 9:d58e77ebd769 233 sys.exit(1)
Nathan Yonkee 9:d58e77ebd769 234 failures.append(tt_id)
Nathan Yonkee 9:d58e77ebd769 235 print(e)
Nathan Yonkee 9:d58e77ebd769 236
Nathan Yonkee 9:d58e77ebd769 237
Nathan Yonkee 9:d58e77ebd769 238 # Write summary of the builds
Nathan Yonkee 9:d58e77ebd769 239 print("\nCompleted in: (%.2f)s\n" % (time() - start))
Nathan Yonkee 9:d58e77ebd769 240
Nathan Yonkee 9:d58e77ebd769 241 for report, report_name in [(successes, "Build successes:"),
Nathan Yonkee 9:d58e77ebd769 242 (skipped, "Build skipped:"),
Nathan Yonkee 9:d58e77ebd769 243 (failures, "Build failures:"),
Nathan Yonkee 9:d58e77ebd769 244 ]:
Nathan Yonkee 9:d58e77ebd769 245 if report:
Nathan Yonkee 9:d58e77ebd769 246 print(print_build_results(report, report_name))
Nathan Yonkee 9:d58e77ebd769 247
Nathan Yonkee 9:d58e77ebd769 248 if failures:
Nathan Yonkee 9:d58e77ebd769 249 sys.exit(1)