the other jimmy / mbed-sdk-tools

Fork of mbed-sdk-tools by mbed official

Committer:
screamer
Date:
Mon Aug 29 11:18:36 2016 +0100
Revision:
29:1210849dba19
Parent:
24:25bff2709c20
Child:
31:182518299918
Port the latest tools patches from https://github.com/ARMmbed/mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:66f3b5499f7f 1 import sys
screamer 0:66f3b5499f7f 2 from os.path import join, abspath, dirname, exists, basename
screamer 0:66f3b5499f7f 3 ROOT = abspath(join(dirname(__file__), ".."))
screamer 0:66f3b5499f7f 4 sys.path.insert(0, ROOT)
screamer 0:66f3b5499f7f 5
screamer 0:66f3b5499f7f 6 from shutil import move, rmtree
screamer 22:9e85236d8716 7 from argparse import ArgumentParser
screamer 0:66f3b5499f7f 8 from os import path
screamer 0:66f3b5499f7f 9
screamer 23:fbae331171fa 10 from tools.paths import EXPORT_DIR
screamer 23:fbae331171fa 11 from tools.export import export, EXPORTERS, mcu_ide_matrix
screamer 23:fbae331171fa 12 from tools.tests import TESTS, TEST_MAP
screamer 22:9e85236d8716 13 from tools.tests import test_known, test_name_known
screamer 0:66f3b5499f7f 14 from tools.targets import TARGET_NAMES
screamer 24:25bff2709c20 15 from tools.libraries import LIBRARIES
screamer 23:fbae331171fa 16 from utils import argparse_filestring_type, argparse_many
screamer 24:25bff2709c20 17 from utils import argparse_force_lowercase_type, argparse_force_uppercase_type, argparse_dir_not_parent
screamer 23:fbae331171fa 18 from project_api import setup_project, perform_export, print_results, get_lib_symbols
screamer 0:66f3b5499f7f 19
screamer 0:66f3b5499f7f 20
screamer 0:66f3b5499f7f 21
screamer 0:66f3b5499f7f 22 if __name__ == '__main__':
screamer 0:66f3b5499f7f 23 # Parse Options
screamer 22:9e85236d8716 24 parser = ArgumentParser()
screamer 0:66f3b5499f7f 25
screamer 0:66f3b5499f7f 26 targetnames = TARGET_NAMES
screamer 0:66f3b5499f7f 27 targetnames.sort()
screamer 0:66f3b5499f7f 28 toolchainlist = EXPORTERS.keys()
screamer 0:66f3b5499f7f 29 toolchainlist.sort()
screamer 0:66f3b5499f7f 30
screamer 22:9e85236d8716 31 parser.add_argument("-m", "--mcu",
screamer 0:66f3b5499f7f 32 metavar="MCU",
screamer 0:66f3b5499f7f 33 default='LPC1768',
screamer 22:9e85236d8716 34 type=argparse_many(argparse_force_uppercase_type(targetnames, "MCU")),
screamer 0:66f3b5499f7f 35 help="generate project for the given MCU (%s)"% ', '.join(targetnames))
screamer 0:66f3b5499f7f 36
screamer 22:9e85236d8716 37 parser.add_argument("-i",
screamer 0:66f3b5499f7f 38 dest="ide",
screamer 0:66f3b5499f7f 39 default='uvision',
screamer 22:9e85236d8716 40 type=argparse_force_lowercase_type(toolchainlist, "toolchain"),
screamer 0:66f3b5499f7f 41 help="The target IDE: %s"% str(toolchainlist))
screamer 0:66f3b5499f7f 42
screamer 22:9e85236d8716 43 parser.add_argument("-c", "--clean",
screamer 0:66f3b5499f7f 44 action="store_true",
screamer 0:66f3b5499f7f 45 default=False,
screamer 0:66f3b5499f7f 46 help="clean the export directory")
screamer 0:66f3b5499f7f 47
screamer 22:9e85236d8716 48 group = parser.add_mutually_exclusive_group(required=False)
screamer 22:9e85236d8716 49 group.add_argument("-p",
screamer 22:9e85236d8716 50 type=test_known,
screamer 0:66f3b5499f7f 51 dest="program",
screamer 0:66f3b5499f7f 52 help="The index of the desired test program: [0-%d]"% (len(TESTS)-1))
screamer 0:66f3b5499f7f 53
screamer 22:9e85236d8716 54 group.add_argument("-n",
screamer 22:9e85236d8716 55 type=test_name_known,
screamer 22:9e85236d8716 56 dest="program",
screamer 0:66f3b5499f7f 57 help="The name of the desired test program")
screamer 0:66f3b5499f7f 58
screamer 22:9e85236d8716 59 parser.add_argument("-b",
screamer 0:66f3b5499f7f 60 dest="build",
screamer 0:66f3b5499f7f 61 default=False,
screamer 29:1210849dba19 62 action="store_true",
screamer 0:66f3b5499f7f 63 help="use the mbed library build, instead of the sources")
screamer 0:66f3b5499f7f 64
screamer 22:9e85236d8716 65 group.add_argument("-L", "--list-tests",
screamer 0:66f3b5499f7f 66 action="store_true",
screamer 0:66f3b5499f7f 67 dest="list_tests",
screamer 0:66f3b5499f7f 68 default=False,
screamer 0:66f3b5499f7f 69 help="list available programs in order and exit")
screamer 0:66f3b5499f7f 70
screamer 22:9e85236d8716 71 group.add_argument("-S", "--list-matrix",
screamer 0:66f3b5499f7f 72 action="store_true",
screamer 0:66f3b5499f7f 73 dest="supported_ides",
screamer 0:66f3b5499f7f 74 default=False,
screamer 0:66f3b5499f7f 75 help="displays supported matrix of MCUs and IDEs")
screamer 0:66f3b5499f7f 76
screamer 22:9e85236d8716 77 parser.add_argument("-E",
screamer 0:66f3b5499f7f 78 action="store_true",
screamer 0:66f3b5499f7f 79 dest="supported_ides_html",
screamer 0:66f3b5499f7f 80 default=False,
screamer 0:66f3b5499f7f 81 help="writes tools/export/README.md")
screamer 0:66f3b5499f7f 82
screamer 22:9e85236d8716 83 parser.add_argument("--source",
screamer 13:ab47a20b66f0 84 action="append",
screamer 22:9e85236d8716 85 type=argparse_filestring_type,
screamer 0:66f3b5499f7f 86 dest="source_dir",
screamer 22:9e85236d8716 87 default=[],
screamer 0:66f3b5499f7f 88 help="The source (input) directory")
screamer 0:66f3b5499f7f 89
screamer 22:9e85236d8716 90 parser.add_argument("-D",
screamer 0:66f3b5499f7f 91 action="append",
screamer 0:66f3b5499f7f 92 dest="macros",
screamer 0:66f3b5499f7f 93 help="Add a macro definition")
screamer 0:66f3b5499f7f 94
screamer 22:9e85236d8716 95 options = parser.parse_args()
screamer 0:66f3b5499f7f 96
screamer 0:66f3b5499f7f 97 # Print available tests in order and exit
screamer 0:66f3b5499f7f 98 if options.list_tests is True:
screamer 0:66f3b5499f7f 99 print '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:66f3b5499f7f 100 sys.exit()
screamer 0:66f3b5499f7f 101
screamer 0:66f3b5499f7f 102 # Only prints matrix of supported IDEs
screamer 0:66f3b5499f7f 103 if options.supported_ides:
screamer 0:66f3b5499f7f 104 print mcu_ide_matrix()
screamer 0:66f3b5499f7f 105 exit(0)
screamer 0:66f3b5499f7f 106
screamer 0:66f3b5499f7f 107 # Only prints matrix of supported IDEs
screamer 0:66f3b5499f7f 108 if options.supported_ides_html:
screamer 0:66f3b5499f7f 109 html = mcu_ide_matrix(verbose_html=True)
screamer 0:66f3b5499f7f 110 try:
screamer 0:66f3b5499f7f 111 with open("./export/README.md","w") as f:
screamer 0:66f3b5499f7f 112 f.write("Exporter IDE/Platform Support\n")
screamer 0:66f3b5499f7f 113 f.write("-----------------------------------\n")
screamer 0:66f3b5499f7f 114 f.write("\n")
screamer 0:66f3b5499f7f 115 f.write(html)
screamer 0:66f3b5499f7f 116 except IOError as e:
screamer 0:66f3b5499f7f 117 print "I/O error({0}): {1}".format(e.errno, e.strerror)
screamer 0:66f3b5499f7f 118 except:
screamer 0:66f3b5499f7f 119 print "Unexpected error:", sys.exc_info()[0]
screamer 0:66f3b5499f7f 120 raise
screamer 0:66f3b5499f7f 121 exit(0)
screamer 0:66f3b5499f7f 122
screamer 0:66f3b5499f7f 123 # Clean Export Directory
screamer 0:66f3b5499f7f 124 if options.clean:
screamer 0:66f3b5499f7f 125 if exists(EXPORT_DIR):
screamer 0:66f3b5499f7f 126 rmtree(EXPORT_DIR)
screamer 0:66f3b5499f7f 127
screamer 0:66f3b5499f7f 128 # Export results
screamer 0:66f3b5499f7f 129 successes = []
screamer 0:66f3b5499f7f 130 failures = []
screamer 0:66f3b5499f7f 131
screamer 0:66f3b5499f7f 132 # source_dir = use relative paths, otherwise sources are copied
screamer 0:66f3b5499f7f 133 sources_relative = True if options.source_dir else False
screamer 0:66f3b5499f7f 134
screamer 22:9e85236d8716 135 for mcu in options.mcu:
screamer 0:66f3b5499f7f 136 # Program Number or name
screamer 22:9e85236d8716 137 p, src, ide = options.program, options.source_dir, options.ide
screamer 24:25bff2709c20 138 try:
screamer 24:25bff2709c20 139 project_dir, project_name, project_temp = setup_project(mcu, ide, p, src, options.build)
screamer 24:25bff2709c20 140 zip = not bool(src) # create zip when no src_dir provided
screamer 24:25bff2709c20 141 clean = not bool(src) # don't clean when source is provided, use acrual source tree for IDE files
screamer 0:66f3b5499f7f 142
screamer 24:25bff2709c20 143 # Export to selected toolchain
screamer 24:25bff2709c20 144 lib_symbols = get_lib_symbols(options.macros, src, p)
screamer 24:25bff2709c20 145 tmp_path, report = export(project_dir, project_name, ide, mcu, project_dir[0], project_temp, clean=clean, make_zip=zip, extra_symbols=lib_symbols, sources_relative=sources_relative)
screamer 24:25bff2709c20 146 except OSError as e:
screamer 24:25bff2709c20 147 if e.errno == 2:
screamer 24:25bff2709c20 148 report = dict(success=False, errormsg="Library path '%s' does not exist. Ensure that the library is built." % (e.filename))
screamer 24:25bff2709c20 149 else:
screamer 24:25bff2709c20 150 report = dict(success=False, errormsg="An OS error occured: errno #{}".format(e.errno))
screamer 0:66f3b5499f7f 151 if report['success']:
screamer 13:ab47a20b66f0 152 if not zip:
screamer 13:ab47a20b66f0 153 zip_path = join(project_temp, project_name)
screamer 13:ab47a20b66f0 154 else:
screamer 13:ab47a20b66f0 155 zip_path = join(EXPORT_DIR, "%s_%s_%s.zip" % (project_name, ide, mcu))
screamer 0:66f3b5499f7f 156 move(tmp_path, zip_path)
screamer 0:66f3b5499f7f 157 successes.append("%s::%s\t%s"% (mcu, ide, zip_path))
screamer 0:66f3b5499f7f 158 else:
screamer 0:66f3b5499f7f 159 failures.append("%s::%s\t%s"% (mcu, ide, report['errormsg']))
screamer 0:66f3b5499f7f 160
screamer 0:66f3b5499f7f 161 # Prints export results
screamer 23:fbae331171fa 162 print_results(successes, failures)