Alessandro Angelino / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
Kojto
Date:
Thu Mar 31 23:40:06 2016 +0100
Revision:
8:c317ab6dabc4
Parent:
4:395a265b9cd4
Added support of -D for exporters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 import sys
screamer 0:4a2e5f0422d6 2 from os.path import join, abspath, dirname, exists, basename
screamer 0:4a2e5f0422d6 3 ROOT = abspath(join(dirname(__file__), ".."))
screamer 0:4a2e5f0422d6 4 sys.path.insert(0, ROOT)
screamer 0:4a2e5f0422d6 5
screamer 0:4a2e5f0422d6 6 from shutil import move, rmtree
screamer 0:4a2e5f0422d6 7 from optparse import OptionParser
screamer 0:4a2e5f0422d6 8
screamer 2:5f044fef8f98 9 from tools.paths import EXPORT_DIR, EXPORT_WORKSPACE, EXPORT_TMP
screamer 2:5f044fef8f98 10 from tools.paths import MBED_BASE, MBED_LIBRARIES
screamer 2:5f044fef8f98 11 from tools.export import export, setup_user_prj, EXPORTERS, mcu_ide_matrix
screamer 2:5f044fef8f98 12 from tools.utils import args_error
screamer 2:5f044fef8f98 13 from tools.tests import TESTS, Test, TEST_MAP
screamer 2:5f044fef8f98 14 from tools.targets import TARGET_NAMES
screamer 2:5f044fef8f98 15 from tools.libraries import LIBRARIES
screamer 0:4a2e5f0422d6 16
screamer 0:4a2e5f0422d6 17 try:
screamer 2:5f044fef8f98 18 import tools.private_settings as ps
screamer 0:4a2e5f0422d6 19 except:
screamer 0:4a2e5f0422d6 20 ps = object()
screamer 0:4a2e5f0422d6 21
screamer 0:4a2e5f0422d6 22
screamer 0:4a2e5f0422d6 23 if __name__ == '__main__':
screamer 0:4a2e5f0422d6 24 # Parse Options
screamer 0:4a2e5f0422d6 25 parser = OptionParser()
screamer 0:4a2e5f0422d6 26
screamer 0:4a2e5f0422d6 27 targetnames = TARGET_NAMES
screamer 0:4a2e5f0422d6 28 targetnames.sort()
screamer 0:4a2e5f0422d6 29 toolchainlist = EXPORTERS.keys()
screamer 0:4a2e5f0422d6 30 toolchainlist.sort()
screamer 0:4a2e5f0422d6 31
screamer 0:4a2e5f0422d6 32 parser.add_option("-m", "--mcu",
screamer 0:4a2e5f0422d6 33 metavar="MCU",
screamer 0:4a2e5f0422d6 34 default='LPC1768',
screamer 0:4a2e5f0422d6 35 help="generate project for the given MCU (%s)"% ', '.join(targetnames))
screamer 0:4a2e5f0422d6 36
screamer 0:4a2e5f0422d6 37 parser.add_option("-i",
screamer 0:4a2e5f0422d6 38 dest="ide",
screamer 0:4a2e5f0422d6 39 default='uvision',
screamer 0:4a2e5f0422d6 40 help="The target IDE: %s"% str(toolchainlist))
screamer 0:4a2e5f0422d6 41
screamer 0:4a2e5f0422d6 42 parser.add_option("-c", "--clean",
screamer 0:4a2e5f0422d6 43 action="store_true",
screamer 0:4a2e5f0422d6 44 default=False,
screamer 0:4a2e5f0422d6 45 help="clean the export directory")
screamer 0:4a2e5f0422d6 46
screamer 0:4a2e5f0422d6 47 parser.add_option("-p",
screamer 0:4a2e5f0422d6 48 type="int",
screamer 0:4a2e5f0422d6 49 dest="program",
screamer 0:4a2e5f0422d6 50 help="The index of the desired test program: [0-%d]"% (len(TESTS)-1))
screamer 0:4a2e5f0422d6 51
screamer 0:4a2e5f0422d6 52 parser.add_option("-n",
screamer 0:4a2e5f0422d6 53 dest="program_name",
screamer 0:4a2e5f0422d6 54 help="The name of the desired test program")
screamer 0:4a2e5f0422d6 55
screamer 0:4a2e5f0422d6 56 parser.add_option("-b",
screamer 0:4a2e5f0422d6 57 dest="build",
screamer 0:4a2e5f0422d6 58 action="store_true",
screamer 0:4a2e5f0422d6 59 default=False,
screamer 0:4a2e5f0422d6 60 help="use the mbed library build, instead of the sources")
screamer 0:4a2e5f0422d6 61
screamer 0:4a2e5f0422d6 62 parser.add_option("-L", "--list-tests",
screamer 0:4a2e5f0422d6 63 action="store_true",
screamer 0:4a2e5f0422d6 64 dest="list_tests",
screamer 0:4a2e5f0422d6 65 default=False,
screamer 0:4a2e5f0422d6 66 help="list available programs in order and exit")
screamer 0:4a2e5f0422d6 67
screamer 0:4a2e5f0422d6 68 parser.add_option("-S", "--list-matrix",
screamer 0:4a2e5f0422d6 69 action="store_true",
screamer 0:4a2e5f0422d6 70 dest="supported_ides",
screamer 0:4a2e5f0422d6 71 default=False,
screamer 0:4a2e5f0422d6 72 help="displays supported matrix of MCUs and IDEs")
screamer 0:4a2e5f0422d6 73
screamer 0:4a2e5f0422d6 74 parser.add_option("-E",
screamer 0:4a2e5f0422d6 75 action="store_true",
screamer 0:4a2e5f0422d6 76 dest="supported_ides_html",
screamer 0:4a2e5f0422d6 77 default=False,
screamer 2:5f044fef8f98 78 help="writes tools/export/README.md")
screamer 0:4a2e5f0422d6 79
screamer 0:4a2e5f0422d6 80 parser.add_option("--source",
screamer 0:4a2e5f0422d6 81 dest="source_dir",
screamer 0:4a2e5f0422d6 82 default=None,
screamer 0:4a2e5f0422d6 83 help="The source (input) directory")
screamer 0:4a2e5f0422d6 84
Kojto 8:c317ab6dabc4 85 parser.add_option("-D", "",
Kojto 8:c317ab6dabc4 86 action="append",
Kojto 8:c317ab6dabc4 87 dest="macros",
Kojto 8:c317ab6dabc4 88 help="Add a macro definition")
Kojto 8:c317ab6dabc4 89
screamer 0:4a2e5f0422d6 90 (options, args) = parser.parse_args()
screamer 0:4a2e5f0422d6 91
screamer 0:4a2e5f0422d6 92 # Print available tests in order and exit
screamer 0:4a2e5f0422d6 93 if options.list_tests is True:
screamer 0:4a2e5f0422d6 94 print '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:4a2e5f0422d6 95 sys.exit()
screamer 0:4a2e5f0422d6 96
screamer 0:4a2e5f0422d6 97 # Only prints matrix of supported IDEs
screamer 0:4a2e5f0422d6 98 if options.supported_ides:
screamer 0:4a2e5f0422d6 99 print mcu_ide_matrix()
screamer 0:4a2e5f0422d6 100 exit(0)
screamer 0:4a2e5f0422d6 101
screamer 0:4a2e5f0422d6 102 # Only prints matrix of supported IDEs
screamer 0:4a2e5f0422d6 103 if options.supported_ides_html:
screamer 0:4a2e5f0422d6 104 html = mcu_ide_matrix(verbose_html=True)
screamer 0:4a2e5f0422d6 105 try:
screamer 0:4a2e5f0422d6 106 with open("./export/README.md","w") as f:
screamer 0:4a2e5f0422d6 107 f.write("Exporter IDE/Platform Support\n")
screamer 0:4a2e5f0422d6 108 f.write("-----------------------------------\n")
screamer 0:4a2e5f0422d6 109 f.write("\n")
screamer 0:4a2e5f0422d6 110 f.write(html)
screamer 0:4a2e5f0422d6 111 except IOError as e:
screamer 0:4a2e5f0422d6 112 print "I/O error({0}): {1}".format(e.errno, e.strerror)
screamer 0:4a2e5f0422d6 113 except:
screamer 0:4a2e5f0422d6 114 print "Unexpected error:", sys.exc_info()[0]
screamer 0:4a2e5f0422d6 115 raise
screamer 0:4a2e5f0422d6 116 exit(0)
screamer 0:4a2e5f0422d6 117
screamer 0:4a2e5f0422d6 118 # Clean Export Directory
screamer 0:4a2e5f0422d6 119 if options.clean:
screamer 0:4a2e5f0422d6 120 if exists(EXPORT_DIR):
screamer 0:4a2e5f0422d6 121 rmtree(EXPORT_DIR)
screamer 0:4a2e5f0422d6 122
screamer 0:4a2e5f0422d6 123 # Target
screamer 0:4a2e5f0422d6 124 if options.mcu is None :
screamer 0:4a2e5f0422d6 125 args_error(parser, "[ERROR] You should specify an MCU")
screamer 0:4a2e5f0422d6 126 mcus = options.mcu
screamer 0:4a2e5f0422d6 127
screamer 0:4a2e5f0422d6 128 # IDE
screamer 0:4a2e5f0422d6 129 if options.ide is None:
screamer 0:4a2e5f0422d6 130 args_error(parser, "[ERROR] You should specify an IDE")
screamer 0:4a2e5f0422d6 131 ide = options.ide
screamer 0:4a2e5f0422d6 132
screamer 0:4a2e5f0422d6 133 # Export results
screamer 0:4a2e5f0422d6 134 successes = []
screamer 0:4a2e5f0422d6 135 failures = []
screamer 4:395a265b9cd4 136 zip = True
screamer 4:395a265b9cd4 137 clean = True
screamer 0:4a2e5f0422d6 138
screamer 0:4a2e5f0422d6 139 for mcu in mcus.split(','):
screamer 0:4a2e5f0422d6 140 # Program Number or name
screamer 0:4a2e5f0422d6 141 p, n, src = options.program, options.program_name, options.source_dir
screamer 0:4a2e5f0422d6 142
screamer 0:4a2e5f0422d6 143 if src is not None:
screamer 4:395a265b9cd4 144 # --source is used to generate IDE files to toolchain directly in the source tree and doesn't generate zip file
screamer 0:4a2e5f0422d6 145 project_dir = options.source_dir
screamer 0:4a2e5f0422d6 146 project_name = basename(project_dir)
screamer 4:395a265b9cd4 147 project_temp = project_dir
Kojto 8:c317ab6dabc4 148 lib_symbols = [] + options.macros
screamer 4:395a265b9cd4 149 zip = False # don't create zip
screamer 4:395a265b9cd4 150 clean = False # don't cleanup because we use the actual source tree to generate IDE files
screamer 0:4a2e5f0422d6 151 else:
screamer 0:4a2e5f0422d6 152 if n is not None and p is not None:
screamer 0:4a2e5f0422d6 153 args_error(parser, "[ERROR] specify either '-n' or '-p', not both")
screamer 0:4a2e5f0422d6 154 if n:
screamer 0:4a2e5f0422d6 155 if not n in TEST_MAP.keys():
screamer 0:4a2e5f0422d6 156 # Check if there is an alias for this in private_settings.py
screamer 0:4a2e5f0422d6 157 if getattr(ps, "test_alias", None) is not None:
screamer 0:4a2e5f0422d6 158 alias = ps.test_alias.get(n, "")
screamer 0:4a2e5f0422d6 159 if not alias in TEST_MAP.keys():
screamer 0:4a2e5f0422d6 160 args_error(parser, "[ERROR] Program with name '%s' not found" % n)
screamer 0:4a2e5f0422d6 161 else:
screamer 0:4a2e5f0422d6 162 n = alias
screamer 0:4a2e5f0422d6 163 else:
screamer 0:4a2e5f0422d6 164 args_error(parser, "[ERROR] Program with name '%s' not found" % n)
screamer 0:4a2e5f0422d6 165 p = TEST_MAP[n].n
screamer 0:4a2e5f0422d6 166
screamer 0:4a2e5f0422d6 167 if p is None or (p < 0) or (p > (len(TESTS)-1)):
screamer 0:4a2e5f0422d6 168 message = "[ERROR] You have to specify one of the following tests:\n"
screamer 0:4a2e5f0422d6 169 message += '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:4a2e5f0422d6 170 args_error(parser, message)
screamer 0:4a2e5f0422d6 171
screamer 0:4a2e5f0422d6 172 # Project
screamer 0:4a2e5f0422d6 173 if p is None or (p < 0) or (p > (len(TESTS)-1)):
screamer 0:4a2e5f0422d6 174 message = "[ERROR] You have to specify one of the following tests:\n"
screamer 0:4a2e5f0422d6 175 message += '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:4a2e5f0422d6 176 args_error(parser, message)
screamer 0:4a2e5f0422d6 177 test = Test(p)
screamer 0:4a2e5f0422d6 178
screamer 0:4a2e5f0422d6 179 # Some libraries have extra macros (called by exporter symbols) to we need to pass
screamer 0:4a2e5f0422d6 180 # them to maintain compilation macros integrity between compiled library and
screamer 0:4a2e5f0422d6 181 # header files we might use with it
Kojto 8:c317ab6dabc4 182 lib_symbols = [] + options.macros
screamer 0:4a2e5f0422d6 183 for lib in LIBRARIES:
screamer 0:4a2e5f0422d6 184 if lib['build_dir'] in test.dependencies:
screamer 0:4a2e5f0422d6 185 lib_macros = lib.get('macros', None)
screamer 0:4a2e5f0422d6 186 if lib_macros is not None:
screamer 0:4a2e5f0422d6 187 lib_symbols.extend(lib_macros)
screamer 0:4a2e5f0422d6 188
screamer 0:4a2e5f0422d6 189 if not options.build:
screamer 0:4a2e5f0422d6 190 # Substitute the library builds with the sources
screamer 0:4a2e5f0422d6 191 # TODO: Substitute also the other library build paths
screamer 0:4a2e5f0422d6 192 if MBED_LIBRARIES in test.dependencies:
screamer 0:4a2e5f0422d6 193 test.dependencies.remove(MBED_LIBRARIES)
screamer 0:4a2e5f0422d6 194 test.dependencies.append(MBED_BASE)
screamer 0:4a2e5f0422d6 195
screamer 0:4a2e5f0422d6 196 # Build the project with the same directory structure of the mbed online IDE
screamer 0:4a2e5f0422d6 197 project_name = test.id
screamer 0:4a2e5f0422d6 198 project_dir = join(EXPORT_WORKSPACE, project_name)
screamer 4:395a265b9cd4 199 project_temp = EXPORT_TMP
screamer 0:4a2e5f0422d6 200 setup_user_prj(project_dir, test.source_dir, test.dependencies)
screamer 0:4a2e5f0422d6 201
screamer 0:4a2e5f0422d6 202 # Export to selected toolchain
screamer 4:395a265b9cd4 203 tmp_path, report = export(project_dir, project_name, ide, mcu, project_dir, project_temp, clean=clean, zip=zip, extra_symbols=lib_symbols)
screamer 4:395a265b9cd4 204 print tmp_path
screamer 0:4a2e5f0422d6 205 if report['success']:
screamer 4:395a265b9cd4 206 zip_path = join(EXPORT_DIR, "%s_%s_%s.zip" % (project_name, ide, mcu))
screamer 4:395a265b9cd4 207 if zip:
screamer 4:395a265b9cd4 208 move(tmp_path, zip_path)
screamer 0:4a2e5f0422d6 209 successes.append("%s::%s\t%s"% (mcu, ide, zip_path))
screamer 0:4a2e5f0422d6 210 else:
screamer 0:4a2e5f0422d6 211 failures.append("%s::%s\t%s"% (mcu, ide, report['errormsg']))
screamer 0:4a2e5f0422d6 212
screamer 0:4a2e5f0422d6 213 # Prints export results
screamer 0:4a2e5f0422d6 214 print
screamer 0:4a2e5f0422d6 215 if len(successes) > 0:
screamer 0:4a2e5f0422d6 216 print "Successful exports:"
screamer 0:4a2e5f0422d6 217 for success in successes:
screamer 0:4a2e5f0422d6 218 print " * %s"% success
screamer 0:4a2e5f0422d6 219 if len(failures) > 0:
screamer 0:4a2e5f0422d6 220 print "Failed exports:"
screamer 0:4a2e5f0422d6 221 for failure in failures:
screamer 0:4a2e5f0422d6 222 print " * %s"% failure