Clone of official tools

Committer:
Screamer@Y5070-M.virtuoso
Date:
Tue Jun 14 11:07:30 2016 +0100
Revision:
9:2d27d77ada5c
Parent:
0:66f3b5499f7f
Child:
13:ab47a20b66f0
Updated tools based on latest live tools code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:66f3b5499f7f 1 #! /usr/bin/env python2
screamer 0:66f3b5499f7f 2 """
screamer 0:66f3b5499f7f 3 mbed SDK
screamer 0:66f3b5499f7f 4 Copyright (c) 2011-2013 ARM Limited
screamer 0:66f3b5499f7f 5
screamer 0:66f3b5499f7f 6 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:66f3b5499f7f 7 you may not use this file except in compliance with the License.
screamer 0:66f3b5499f7f 8 You may obtain a copy of the License at
screamer 0:66f3b5499f7f 9
screamer 0:66f3b5499f7f 10 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:66f3b5499f7f 11
screamer 0:66f3b5499f7f 12 Unless required by applicable law or agreed to in writing, software
screamer 0:66f3b5499f7f 13 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:66f3b5499f7f 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:66f3b5499f7f 15 See the License for the specific language governing permissions and
screamer 0:66f3b5499f7f 16 limitations under the License.
screamer 0:66f3b5499f7f 17
screamer 0:66f3b5499f7f 18
screamer 0:66f3b5499f7f 19 TEST BUILD & RUN
screamer 0:66f3b5499f7f 20 """
screamer 0:66f3b5499f7f 21 import sys
screamer 0:66f3b5499f7f 22 from time import sleep
screamer 0:66f3b5499f7f 23 from shutil import copy
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 24 from os.path import join, abspath, dirname, isfile, isdir
screamer 0:66f3b5499f7f 25
screamer 0:66f3b5499f7f 26 # Be sure that the tools directory is in the search path
screamer 0:66f3b5499f7f 27 ROOT = abspath(join(dirname(__file__), ".."))
screamer 0:66f3b5499f7f 28 sys.path.insert(0, ROOT)
screamer 0:66f3b5499f7f 29
screamer 0:66f3b5499f7f 30 from tools.utils import args_error
screamer 0:66f3b5499f7f 31 from tools.paths import BUILD_DIR
screamer 0:66f3b5499f7f 32 from tools.paths import RTOS_LIBRARIES
screamer 0:66f3b5499f7f 33 from tools.paths import RPC_LIBRARY
screamer 0:66f3b5499f7f 34 from tools.paths import ETH_LIBRARY
screamer 0:66f3b5499f7f 35 from tools.paths import USB_HOST_LIBRARIES, USB_LIBRARIES
screamer 0:66f3b5499f7f 36 from tools.paths import DSP_LIBRARIES
screamer 0:66f3b5499f7f 37 from tools.paths import FS_LIBRARY
screamer 0:66f3b5499f7f 38 from tools.paths import UBLOX_LIBRARY
screamer 0:66f3b5499f7f 39 from tools.tests import TESTS, Test, TEST_MAP
screamer 0:66f3b5499f7f 40 from tools.tests import TEST_MBED_LIB
screamer 0:66f3b5499f7f 41 from tools.targets import TARGET_MAP
screamer 0:66f3b5499f7f 42 from tools.options import get_default_options_parser
screamer 0:66f3b5499f7f 43 from tools.build_api import build_project
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 44 from tools.build_api import mcu_toolchain_matrix
screamer 0:66f3b5499f7f 45 try:
screamer 0:66f3b5499f7f 46 import tools.private_settings as ps
screamer 0:66f3b5499f7f 47 except:
screamer 0:66f3b5499f7f 48 ps = object()
screamer 0:66f3b5499f7f 49
screamer 0:66f3b5499f7f 50 if __name__ == '__main__':
screamer 0:66f3b5499f7f 51 # Parse Options
screamer 0:66f3b5499f7f 52 parser = get_default_options_parser()
screamer 0:66f3b5499f7f 53 parser.add_option("-p",
screamer 0:66f3b5499f7f 54 type="int",
screamer 0:66f3b5499f7f 55 dest="program",
screamer 0:66f3b5499f7f 56 help="The index of the desired test program: [0-%d]" % (len(TESTS)-1))
screamer 0:66f3b5499f7f 57
screamer 0:66f3b5499f7f 58 parser.add_option("-n",
screamer 0:66f3b5499f7f 59 dest="program_name",
screamer 0:66f3b5499f7f 60 help="The name of the desired test program")
screamer 0:66f3b5499f7f 61
screamer 0:66f3b5499f7f 62 parser.add_option("-j", "--jobs",
screamer 0:66f3b5499f7f 63 type="int",
screamer 0:66f3b5499f7f 64 dest="jobs",
screamer 0:66f3b5499f7f 65 default=0,
screamer 0:66f3b5499f7f 66 help="Number of concurrent jobs. Default: 0/auto (based on host machine's number of CPUs)")
screamer 0:66f3b5499f7f 67
screamer 0:66f3b5499f7f 68 parser.add_option("-v", "--verbose",
screamer 0:66f3b5499f7f 69 action="store_true",
screamer 0:66f3b5499f7f 70 dest="verbose",
screamer 0:66f3b5499f7f 71 default=False,
screamer 0:66f3b5499f7f 72 help="Verbose diagnostic output")
screamer 0:66f3b5499f7f 73
screamer 0:66f3b5499f7f 74 parser.add_option("--silent",
screamer 0:66f3b5499f7f 75 action="store_true",
screamer 0:66f3b5499f7f 76 dest="silent",
screamer 0:66f3b5499f7f 77 default=False,
screamer 0:66f3b5499f7f 78 help="Silent diagnostic output (no copy, compile notification)")
screamer 0:66f3b5499f7f 79
screamer 0:66f3b5499f7f 80 parser.add_option("-D", "",
screamer 0:66f3b5499f7f 81 action="append",
screamer 0:66f3b5499f7f 82 dest="macros",
screamer 0:66f3b5499f7f 83 help="Add a macro definition")
screamer 0:66f3b5499f7f 84
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 85 parser.add_option("-S", "--supported-toolchains",
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 86 action="store_true",
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 87 dest="supported_toolchains",
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 88 default=False,
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 89 help="Displays supported matrix of MCUs and toolchains")
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 90
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 91 parser.add_option('-f', '--filter',
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 92 dest='general_filter_regex',
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 93 default=None,
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 94 help='For some commands you can use filter to filter out results')
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 95
screamer 0:66f3b5499f7f 96 # Local run
screamer 0:66f3b5499f7f 97 parser.add_option("--automated", action="store_true", dest="automated",
screamer 0:66f3b5499f7f 98 default=False, help="Automated test")
screamer 0:66f3b5499f7f 99 parser.add_option("--host", dest="host_test",
screamer 0:66f3b5499f7f 100 default=None, help="Host test")
screamer 0:66f3b5499f7f 101 parser.add_option("--extra", dest="extra",
screamer 0:66f3b5499f7f 102 default=None, help="Extra files")
screamer 0:66f3b5499f7f 103 parser.add_option("--peripherals", dest="peripherals",
screamer 0:66f3b5499f7f 104 default=None, help="Required peripherals")
screamer 0:66f3b5499f7f 105 parser.add_option("--dep", dest="dependencies",
screamer 0:66f3b5499f7f 106 default=None, help="Dependencies")
screamer 0:66f3b5499f7f 107 parser.add_option("--source", dest="source_dir",
screamer 0:66f3b5499f7f 108 default=None, help="The source (input) directory", action="append")
screamer 0:66f3b5499f7f 109 parser.add_option("--duration", type="int", dest="duration",
screamer 0:66f3b5499f7f 110 default=None, help="Duration of the test")
screamer 0:66f3b5499f7f 111 parser.add_option("--build", dest="build_dir",
screamer 0:66f3b5499f7f 112 default=None, help="The build (output) directory")
screamer 0:66f3b5499f7f 113 parser.add_option("-N", "--artifact-name", dest="artifact_name",
screamer 0:66f3b5499f7f 114 default=None, help="The built project's name")
screamer 0:66f3b5499f7f 115 parser.add_option("-d", "--disk", dest="disk",
screamer 0:66f3b5499f7f 116 default=None, help="The mbed disk")
screamer 0:66f3b5499f7f 117 parser.add_option("-s", "--serial", dest="serial",
screamer 0:66f3b5499f7f 118 default=None, help="The mbed serial port")
screamer 0:66f3b5499f7f 119 parser.add_option("-b", "--baud", type="int", dest="baud",
screamer 0:66f3b5499f7f 120 default=None, help="The mbed serial baud rate")
screamer 0:66f3b5499f7f 121 parser.add_option("-L", "--list-tests", action="store_true", dest="list_tests",
screamer 0:66f3b5499f7f 122 default=False, help="List available tests in order and exit")
screamer 0:66f3b5499f7f 123
screamer 0:66f3b5499f7f 124 # Ideally, all the tests with a single "main" thread can be run with, or
screamer 0:66f3b5499f7f 125 # without the rtos, eth, usb_host, usb, dsp, fat, ublox
screamer 0:66f3b5499f7f 126 parser.add_option("--rtos",
screamer 0:66f3b5499f7f 127 action="store_true", dest="rtos",
screamer 0:66f3b5499f7f 128 default=False, help="Link with RTOS library")
screamer 0:66f3b5499f7f 129
screamer 0:66f3b5499f7f 130 parser.add_option("--rpc",
screamer 0:66f3b5499f7f 131 action="store_true", dest="rpc",
screamer 0:66f3b5499f7f 132 default=False, help="Link with RPC library")
screamer 0:66f3b5499f7f 133
screamer 0:66f3b5499f7f 134 parser.add_option("--eth",
screamer 0:66f3b5499f7f 135 action="store_true", dest="eth",
screamer 0:66f3b5499f7f 136 default=False,
screamer 0:66f3b5499f7f 137 help="Link with Ethernet library")
screamer 0:66f3b5499f7f 138
screamer 0:66f3b5499f7f 139 parser.add_option("--usb_host",
screamer 0:66f3b5499f7f 140 action="store_true",
screamer 0:66f3b5499f7f 141 dest="usb_host",
screamer 0:66f3b5499f7f 142 default=False,
screamer 0:66f3b5499f7f 143 help="Link with USB Host library")
screamer 0:66f3b5499f7f 144
screamer 0:66f3b5499f7f 145 parser.add_option("--usb",
screamer 0:66f3b5499f7f 146 action="store_true",
screamer 0:66f3b5499f7f 147 dest="usb",
screamer 0:66f3b5499f7f 148 default=False,
screamer 0:66f3b5499f7f 149 help="Link with USB Device library")
screamer 0:66f3b5499f7f 150
screamer 0:66f3b5499f7f 151 parser.add_option("--dsp",
screamer 0:66f3b5499f7f 152 action="store_true",
screamer 0:66f3b5499f7f 153 dest="dsp",
screamer 0:66f3b5499f7f 154 default=False,
screamer 0:66f3b5499f7f 155 help="Link with DSP library")
screamer 0:66f3b5499f7f 156
screamer 0:66f3b5499f7f 157 parser.add_option("--fat",
screamer 0:66f3b5499f7f 158 action="store_true",
screamer 0:66f3b5499f7f 159 dest="fat",
screamer 0:66f3b5499f7f 160 default=False,
screamer 0:66f3b5499f7f 161 help="Link with FS ad SD card file system library")
screamer 0:66f3b5499f7f 162
screamer 0:66f3b5499f7f 163 parser.add_option("--ublox",
screamer 0:66f3b5499f7f 164 action="store_true",
screamer 0:66f3b5499f7f 165 dest="ublox",
screamer 0:66f3b5499f7f 166 default=False,
screamer 0:66f3b5499f7f 167 help="Link with U-Blox library")
screamer 0:66f3b5499f7f 168
screamer 0:66f3b5499f7f 169 parser.add_option("--testlib",
screamer 0:66f3b5499f7f 170 action="store_true",
screamer 0:66f3b5499f7f 171 dest="testlib",
screamer 0:66f3b5499f7f 172 default=False,
screamer 0:66f3b5499f7f 173 help="Link with mbed test library")
screamer 0:66f3b5499f7f 174
screamer 0:66f3b5499f7f 175 # Specify a different linker script
screamer 0:66f3b5499f7f 176 parser.add_option("-l", "--linker", dest="linker_script",
screamer 0:66f3b5499f7f 177 default=None, help="use the specified linker script")
screamer 0:66f3b5499f7f 178
screamer 0:66f3b5499f7f 179 (options, args) = parser.parse_args()
screamer 0:66f3b5499f7f 180
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 181 # Only prints matrix of supported toolchains
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 182 if options.supported_toolchains:
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 183 print mcu_toolchain_matrix(platform_filter=options.general_filter_regex)
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 184 exit(0)
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 185
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 186 if options.source_dir:
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 187 for path in options.source_dir :
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 188 if not isfile(path) and not isdir(path) :
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 189 args_error(parser, "[ERROR] you passed \"{}\" to --source, which does not exist".
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 190 format(path))
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 191
screamer 0:66f3b5499f7f 192 # Print available tests in order and exit
screamer 0:66f3b5499f7f 193 if options.list_tests is True:
screamer 0:66f3b5499f7f 194 print '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:66f3b5499f7f 195 sys.exit()
screamer 0:66f3b5499f7f 196
screamer 0:66f3b5499f7f 197 # force program to "0" if a source dir is specified
screamer 0:66f3b5499f7f 198 if options.source_dir is not None:
screamer 0:66f3b5499f7f 199 p = 0
screamer 0:66f3b5499f7f 200 n = None
screamer 0:66f3b5499f7f 201 else:
screamer 0:66f3b5499f7f 202 # Program Number or name
screamer 0:66f3b5499f7f 203 p, n = options.program, options.program_name
screamer 0:66f3b5499f7f 204
screamer 0:66f3b5499f7f 205 if n is not None and p is not None:
screamer 0:66f3b5499f7f 206 args_error(parser, "[ERROR] specify either '-n' or '-p', not both")
screamer 0:66f3b5499f7f 207 if n:
screamer 0:66f3b5499f7f 208 # We will transform 'n' to list of 'p' (integers which are test numbers)
screamer 0:66f3b5499f7f 209 nlist = n.split(',')
screamer 0:66f3b5499f7f 210 for test_id in nlist:
screamer 0:66f3b5499f7f 211 if test_id not in TEST_MAP.keys():
screamer 0:66f3b5499f7f 212 args_error(parser, "[ERROR] Program with name '%s' not found"% test_id)
screamer 0:66f3b5499f7f 213
screamer 0:66f3b5499f7f 214 p = [TEST_MAP[n].n for n in nlist]
screamer 0:66f3b5499f7f 215 elif p is None or (p < 0) or (p > (len(TESTS)-1)):
screamer 0:66f3b5499f7f 216 message = "[ERROR] You have to specify one of the following tests:\n"
screamer 0:66f3b5499f7f 217 message += '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:66f3b5499f7f 218 args_error(parser, message)
screamer 0:66f3b5499f7f 219
screamer 0:66f3b5499f7f 220 # If 'p' was set via -n to list of numbers make this a single element integer list
screamer 0:66f3b5499f7f 221 if type(p) != type([]):
screamer 0:66f3b5499f7f 222 p = [p]
screamer 0:66f3b5499f7f 223
screamer 0:66f3b5499f7f 224 # Target
screamer 0:66f3b5499f7f 225 if options.mcu is None :
screamer 0:66f3b5499f7f 226 args_error(parser, "[ERROR] You should specify an MCU")
screamer 0:66f3b5499f7f 227 mcu = options.mcu
screamer 0:66f3b5499f7f 228
screamer 0:66f3b5499f7f 229 # Toolchain
screamer 0:66f3b5499f7f 230 if options.tool is None:
screamer 0:66f3b5499f7f 231 args_error(parser, "[ERROR] You should specify a TOOLCHAIN")
screamer 0:66f3b5499f7f 232 toolchain = options.tool
screamer 0:66f3b5499f7f 233
screamer 0:66f3b5499f7f 234 # Test
screamer 0:66f3b5499f7f 235 for test_no in p:
screamer 0:66f3b5499f7f 236 test = Test(test_no)
screamer 0:66f3b5499f7f 237 if options.automated is not None: test.automated = options.automated
screamer 0:66f3b5499f7f 238 if options.dependencies is not None: test.dependencies = options.dependencies
screamer 0:66f3b5499f7f 239 if options.host_test is not None: test.host_test = options.host_test;
screamer 0:66f3b5499f7f 240 if options.peripherals is not None: test.peripherals = options.peripherals;
screamer 0:66f3b5499f7f 241 if options.duration is not None: test.duration = options.duration;
screamer 0:66f3b5499f7f 242 if options.extra is not None: test.extra_files = options.extra
screamer 0:66f3b5499f7f 243
screamer 0:66f3b5499f7f 244 if not test.is_supported(mcu, toolchain):
screamer 0:66f3b5499f7f 245 print 'The selected test is not supported on target %s with toolchain %s' % (mcu, toolchain)
screamer 0:66f3b5499f7f 246 sys.exit()
screamer 0:66f3b5499f7f 247
screamer 0:66f3b5499f7f 248 # Linking with extra libraries
screamer 0:66f3b5499f7f 249 if options.rtos: test.dependencies.append(RTOS_LIBRARIES)
screamer 0:66f3b5499f7f 250 if options.rpc: test.dependencies.append(RPC_LIBRARY)
screamer 0:66f3b5499f7f 251 if options.eth: test.dependencies.append(ETH_LIBRARY)
screamer 0:66f3b5499f7f 252 if options.usb_host: test.dependencies.append(USB_HOST_LIBRARIES)
screamer 0:66f3b5499f7f 253 if options.usb: test.dependencies.append(USB_LIBRARIES)
screamer 0:66f3b5499f7f 254 if options.dsp: test.dependencies.append(DSP_LIBRARIES)
screamer 0:66f3b5499f7f 255 if options.fat: test.dependencies.append(FS_LIBRARY)
screamer 0:66f3b5499f7f 256 if options.ublox: test.dependencies.append(UBLOX_LIBRARY)
screamer 0:66f3b5499f7f 257 if options.testlib: test.dependencies.append(TEST_MBED_LIB)
screamer 0:66f3b5499f7f 258
screamer 0:66f3b5499f7f 259 build_dir = join(BUILD_DIR, "test", mcu, toolchain, test.id)
screamer 0:66f3b5499f7f 260 if options.source_dir is not None:
screamer 0:66f3b5499f7f 261 test.source_dir = options.source_dir
screamer 0:66f3b5499f7f 262 build_dir = options.source_dir
screamer 0:66f3b5499f7f 263
screamer 0:66f3b5499f7f 264 if options.build_dir is not None:
screamer 0:66f3b5499f7f 265 build_dir = options.build_dir
screamer 0:66f3b5499f7f 266
screamer 0:66f3b5499f7f 267 try:
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 268 bin_file = build_project(test.source_dir, build_dir, mcu, toolchain, test.dependencies, options.options,
screamer 0:66f3b5499f7f 269 linker_script=options.linker_script,
screamer 0:66f3b5499f7f 270 clean=options.clean,
screamer 0:66f3b5499f7f 271 verbose=options.verbose,
screamer 0:66f3b5499f7f 272 silent=options.silent,
screamer 0:66f3b5499f7f 273 macros=options.macros,
screamer 0:66f3b5499f7f 274 jobs=options.jobs,
screamer 0:66f3b5499f7f 275 name=options.artifact_name)
screamer 0:66f3b5499f7f 276 print 'Image: %s'% bin_file
screamer 0:66f3b5499f7f 277
screamer 0:66f3b5499f7f 278 if options.disk:
screamer 0:66f3b5499f7f 279 # Simple copy to the mbed disk
screamer 0:66f3b5499f7f 280 copy(bin_file, options.disk)
screamer 0:66f3b5499f7f 281
screamer 0:66f3b5499f7f 282 if options.serial:
screamer 0:66f3b5499f7f 283 # Import pyserial: https://pypi.python.org/pypi/pyserial
screamer 0:66f3b5499f7f 284 from serial import Serial
screamer 0:66f3b5499f7f 285
Screamer@Y5070-M.virtuoso 9:2d27d77ada5c 286 sleep(TARGET_MAP[mcu].program_cycle_s())
screamer 0:66f3b5499f7f 287
screamer 0:66f3b5499f7f 288 serial = Serial(options.serial, timeout = 1)
screamer 0:66f3b5499f7f 289 if options.baud:
screamer 0:66f3b5499f7f 290 serial.setBaudrate(options.baud)
screamer 0:66f3b5499f7f 291
screamer 0:66f3b5499f7f 292 serial.flushInput()
screamer 0:66f3b5499f7f 293 serial.flushOutput()
screamer 0:66f3b5499f7f 294
screamer 0:66f3b5499f7f 295 try:
screamer 0:66f3b5499f7f 296 serial.sendBreak()
screamer 0:66f3b5499f7f 297 except:
screamer 0:66f3b5499f7f 298 # In linux a termios.error is raised in sendBreak and in setBreak.
screamer 0:66f3b5499f7f 299 # The following setBreak() is needed to release the reset signal on the target mcu.
screamer 0:66f3b5499f7f 300 try:
screamer 0:66f3b5499f7f 301 serial.setBreak(False)
screamer 0:66f3b5499f7f 302 except:
screamer 0:66f3b5499f7f 303 pass
screamer 0:66f3b5499f7f 304
screamer 0:66f3b5499f7f 305 while True:
screamer 0:66f3b5499f7f 306 c = serial.read(512)
screamer 0:66f3b5499f7f 307 sys.stdout.write(c)
screamer 0:66f3b5499f7f 308 sys.stdout.flush()
screamer 0:66f3b5499f7f 309
screamer 0:66f3b5499f7f 310 except KeyboardInterrupt, e:
screamer 0:66f3b5499f7f 311 print "\n[CTRL+c] exit"
screamer 0:66f3b5499f7f 312 except Exception,e:
screamer 0:66f3b5499f7f 313 if options.verbose:
screamer 0:66f3b5499f7f 314 import traceback
screamer 0:66f3b5499f7f 315 traceback.print_exc(file=sys.stdout)
screamer 0:66f3b5499f7f 316 else:
screamer 0:66f3b5499f7f 317 print "[ERROR] %s" % str(e)
screamer 0:66f3b5499f7f 318
screamer 0:66f3b5499f7f 319 sys.exit(1)