Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
project.py@29:1210849dba19, 2016-08-29 (annotated)
- Committer:
- screamer
- Date:
- Mon Aug 29 11:18:36 2016 +0100
- Revision:
- 29:1210849dba19
- Parent:
- 24:25bff2709c20
- Child:
- 31:8ea194f6145b
Port the latest tools patches from https://github.com/ARMmbed/mbed-os
Who changed what in which revision?
User | Revision | Line number | New 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) |