Clone of official tools
project_api.py@26:ed5e0d4e691e, 2016-08-04 (annotated)
- Committer:
- screamer
- Date:
- Thu Aug 04 10:32:55 2016 +0100
- Revision:
- 26:ed5e0d4e691e
- Child:
- 31:8ea194f6145b
Add missing python modules
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
screamer | 26:ed5e0d4e691e | 1 | import sys |
screamer | 26:ed5e0d4e691e | 2 | from os.path import join, abspath, dirname, exists, basename |
screamer | 26:ed5e0d4e691e | 3 | ROOT = abspath(join(dirname(__file__), "..")) |
screamer | 26:ed5e0d4e691e | 4 | sys.path.insert(0, ROOT) |
screamer | 26:ed5e0d4e691e | 5 | |
screamer | 26:ed5e0d4e691e | 6 | from tools.paths import EXPORT_WORKSPACE, EXPORT_TMP |
screamer | 26:ed5e0d4e691e | 7 | from tools.paths import MBED_BASE, MBED_LIBRARIES |
screamer | 26:ed5e0d4e691e | 8 | from tools.export import export, setup_user_prj |
screamer | 26:ed5e0d4e691e | 9 | from tools.utils import mkdir |
screamer | 26:ed5e0d4e691e | 10 | from tools.tests import Test, TEST_MAP, TESTS |
screamer | 26:ed5e0d4e691e | 11 | from tools.libraries import LIBRARIES |
screamer | 26:ed5e0d4e691e | 12 | |
screamer | 26:ed5e0d4e691e | 13 | try: |
screamer | 26:ed5e0d4e691e | 14 | import tools.private_settings as ps |
screamer | 26:ed5e0d4e691e | 15 | except: |
screamer | 26:ed5e0d4e691e | 16 | ps = object() |
screamer | 26:ed5e0d4e691e | 17 | |
screamer | 26:ed5e0d4e691e | 18 | |
screamer | 26:ed5e0d4e691e | 19 | def get_program(n): |
screamer | 26:ed5e0d4e691e | 20 | p = TEST_MAP[n].n |
screamer | 26:ed5e0d4e691e | 21 | return p |
screamer | 26:ed5e0d4e691e | 22 | |
screamer | 26:ed5e0d4e691e | 23 | |
screamer | 26:ed5e0d4e691e | 24 | def get_test(p): |
screamer | 26:ed5e0d4e691e | 25 | return Test(p) |
screamer | 26:ed5e0d4e691e | 26 | |
screamer | 26:ed5e0d4e691e | 27 | |
screamer | 26:ed5e0d4e691e | 28 | def get_test_from_name(n): |
screamer | 26:ed5e0d4e691e | 29 | if not n in TEST_MAP.keys(): |
screamer | 26:ed5e0d4e691e | 30 | # Check if there is an alias for this in private_settings.py |
screamer | 26:ed5e0d4e691e | 31 | if getattr(ps, "test_alias", None) is not None: |
screamer | 26:ed5e0d4e691e | 32 | alias = ps.test_alias.get(n, "") |
screamer | 26:ed5e0d4e691e | 33 | if not alias in TEST_MAP.keys(): |
screamer | 26:ed5e0d4e691e | 34 | return None |
screamer | 26:ed5e0d4e691e | 35 | else: |
screamer | 26:ed5e0d4e691e | 36 | n = alias |
screamer | 26:ed5e0d4e691e | 37 | else: |
screamer | 26:ed5e0d4e691e | 38 | return None |
screamer | 26:ed5e0d4e691e | 39 | return get_program(n) |
screamer | 26:ed5e0d4e691e | 40 | |
screamer | 26:ed5e0d4e691e | 41 | |
screamer | 26:ed5e0d4e691e | 42 | def get_lib_symbols(macros, src, program): |
screamer | 26:ed5e0d4e691e | 43 | # Some libraries have extra macros (called by exporter symbols) to we need to pass |
screamer | 26:ed5e0d4e691e | 44 | # them to maintain compilation macros integrity between compiled library and |
screamer | 26:ed5e0d4e691e | 45 | # header files we might use with it |
screamer | 26:ed5e0d4e691e | 46 | lib_symbols = [] |
screamer | 26:ed5e0d4e691e | 47 | if macros: |
screamer | 26:ed5e0d4e691e | 48 | lib_symbols += macros |
screamer | 26:ed5e0d4e691e | 49 | if src: |
screamer | 26:ed5e0d4e691e | 50 | return lib_symbols |
screamer | 26:ed5e0d4e691e | 51 | test = get_test(program) |
screamer | 26:ed5e0d4e691e | 52 | for lib in LIBRARIES: |
screamer | 26:ed5e0d4e691e | 53 | if lib['build_dir'] in test.dependencies: |
screamer | 26:ed5e0d4e691e | 54 | lib_macros = lib.get('macros', None) |
screamer | 26:ed5e0d4e691e | 55 | if lib_macros is not None: |
screamer | 26:ed5e0d4e691e | 56 | lib_symbols.extend(lib_macros) |
screamer | 26:ed5e0d4e691e | 57 | |
screamer | 26:ed5e0d4e691e | 58 | |
screamer | 26:ed5e0d4e691e | 59 | def setup_project(mcu, ide, program=None, source_dir=None, build=None): |
screamer | 26:ed5e0d4e691e | 60 | |
screamer | 26:ed5e0d4e691e | 61 | # Some libraries have extra macros (called by exporter symbols) to we need to pass |
screamer | 26:ed5e0d4e691e | 62 | # them to maintain compilation macros integrity between compiled library and |
screamer | 26:ed5e0d4e691e | 63 | # header files we might use with it |
screamer | 26:ed5e0d4e691e | 64 | if source_dir: |
screamer | 26:ed5e0d4e691e | 65 | # --source is used to generate IDE files to toolchain directly in the source tree and doesn't generate zip file |
screamer | 26:ed5e0d4e691e | 66 | project_dir = source_dir |
screamer | 26:ed5e0d4e691e | 67 | project_name = TESTS[program] if program else "Unnamed_Project" |
screamer | 26:ed5e0d4e691e | 68 | project_temp = join(source_dir[0], 'projectfiles', '%s_%s' % (ide, mcu)) |
screamer | 26:ed5e0d4e691e | 69 | mkdir(project_temp) |
screamer | 26:ed5e0d4e691e | 70 | else: |
screamer | 26:ed5e0d4e691e | 71 | test = get_test(program) |
screamer | 26:ed5e0d4e691e | 72 | if not build: |
screamer | 26:ed5e0d4e691e | 73 | # Substitute the library builds with the sources |
screamer | 26:ed5e0d4e691e | 74 | # TODO: Substitute also the other library build paths |
screamer | 26:ed5e0d4e691e | 75 | if MBED_LIBRARIES in test.dependencies: |
screamer | 26:ed5e0d4e691e | 76 | test.dependencies.remove(MBED_LIBRARIES) |
screamer | 26:ed5e0d4e691e | 77 | test.dependencies.append(MBED_BASE) |
screamer | 26:ed5e0d4e691e | 78 | |
screamer | 26:ed5e0d4e691e | 79 | # Build the project with the same directory structure of the mbed online IDE |
screamer | 26:ed5e0d4e691e | 80 | project_name = test.id |
screamer | 26:ed5e0d4e691e | 81 | project_dir = [join(EXPORT_WORKSPACE, project_name)] |
screamer | 26:ed5e0d4e691e | 82 | project_temp = EXPORT_TMP |
screamer | 26:ed5e0d4e691e | 83 | setup_user_prj(project_dir[0], test.source_dir, test.dependencies) |
screamer | 26:ed5e0d4e691e | 84 | |
screamer | 26:ed5e0d4e691e | 85 | return project_dir, project_name, project_temp |
screamer | 26:ed5e0d4e691e | 86 | |
screamer | 26:ed5e0d4e691e | 87 | |
screamer | 26:ed5e0d4e691e | 88 | def perform_export(dir, name, ide, mcu, temp, clean=False, zip=False, lib_symbols='', |
screamer | 26:ed5e0d4e691e | 89 | sources_relative=False, progen_build=False): |
screamer | 26:ed5e0d4e691e | 90 | |
screamer | 26:ed5e0d4e691e | 91 | tmp_path, report = export(dir, name, ide, mcu, dir[0], temp, clean=clean, |
screamer | 26:ed5e0d4e691e | 92 | make_zip=zip, extra_symbols=lib_symbols, sources_relative=sources_relative, |
screamer | 26:ed5e0d4e691e | 93 | progen_build=progen_build) |
screamer | 26:ed5e0d4e691e | 94 | return tmp_path, report |
screamer | 26:ed5e0d4e691e | 95 | |
screamer | 26:ed5e0d4e691e | 96 | |
screamer | 26:ed5e0d4e691e | 97 | def print_results(successes, failures, skips = []): |
screamer | 26:ed5e0d4e691e | 98 | |
screamer | 26:ed5e0d4e691e | 99 | if len(successes) > 0: |
screamer | 26:ed5e0d4e691e | 100 | print "Successful: " |
screamer | 26:ed5e0d4e691e | 101 | for success in successes: |
screamer | 26:ed5e0d4e691e | 102 | print " * %s" % success |
screamer | 26:ed5e0d4e691e | 103 | if len(failures) > 0: |
screamer | 26:ed5e0d4e691e | 104 | print "Failed: " |
screamer | 26:ed5e0d4e691e | 105 | for failure in failures: |
screamer | 26:ed5e0d4e691e | 106 | print " * %s" % failure |
screamer | 26:ed5e0d4e691e | 107 | if len(skips) > 0: |
screamer | 26:ed5e0d4e691e | 108 | print "Skipped: " |
screamer | 26:ed5e0d4e691e | 109 | for skip in skips: |
screamer | 26:ed5e0d4e691e | 110 | print " * %s" % skip |
screamer | 26:ed5e0d4e691e | 111 |