diff options
| author | Jun Wako <wakojun@gmail.com> | 2015-04-24 16:26:14 +0900 | 
|---|---|---|
| committer | Jun Wako <wakojun@gmail.com> | 2015-04-24 16:26:14 +0900 | 
| commit | 1fe4406f374291ab2e86e95a97341fd9c475fcb8 (patch) | |
| tree | 1be0e16b4b07b5a31ea97ec50a9eb13a288c3d27 /tool/mbed/mbed-sdk/workspace_tools/project.py | |
| parent | a20ef7052c6e937d2f7672dd59456e55a5c08296 (diff) | |
Squashed 'tmk_core/' changes from 7967731..b9e0ea0
b9e0ea0 Merge commit '7fa9d8bdea3773d1195b04d98fcf27cf48ddd81d' as 'tool/mbed/mbed-sdk'
7fa9d8b Squashed 'tool/mbed/mbed-sdk/' content from commit 7c21ce5
git-subtree-dir: tmk_core
git-subtree-split: b9e0ea08cb940de20b3610ecdda18e9d8cd7c552
Diffstat (limited to 'tool/mbed/mbed-sdk/workspace_tools/project.py')
| -rw-r--r-- | tool/mbed/mbed-sdk/workspace_tools/project.py | 196 | 
1 files changed, 196 insertions, 0 deletions
diff --git a/tool/mbed/mbed-sdk/workspace_tools/project.py b/tool/mbed/mbed-sdk/workspace_tools/project.py new file mode 100644 index 0000000000..7bf165b0bd --- /dev/null +++ b/tool/mbed/mbed-sdk/workspace_tools/project.py @@ -0,0 +1,196 @@ +import sys +from os.path import join, abspath, dirname, exists +ROOT = abspath(join(dirname(__file__), "..")) +sys.path.insert(0, ROOT) + +from shutil import move, rmtree +from optparse import OptionParser + +from workspace_tools.paths import EXPORT_DIR, EXPORT_WORKSPACE, EXPORT_TMP +from workspace_tools.paths import MBED_BASE, MBED_LIBRARIES +from workspace_tools.export import export, setup_user_prj, EXPORTERS, mcu_ide_matrix +from workspace_tools.utils import args_error +from workspace_tools.tests import TESTS, Test, TEST_MAP +from workspace_tools.targets import TARGET_NAMES +from workspace_tools.libraries import LIBRARIES + +try: +    import workspace_tools.private_settings as ps +except: +    ps = object() + + +if __name__ == '__main__': +    # Parse Options +    parser = OptionParser() + +    targetnames = TARGET_NAMES +    targetnames.sort() +    toolchainlist = EXPORTERS.keys() +    toolchainlist.sort() + +    parser.add_option("-m", "--mcu", +                      metavar="MCU", +                      default='LPC1768', +                      help="generate project for the given MCU (%s)"% ', '.join(targetnames)) + +    parser.add_option("-i", +                      dest="ide", +                      default='uvision', +                      help="The target IDE: %s"% str(toolchainlist)) + +    parser.add_option("-c", "--clean", +                      action="store_true", +                      default=False, +                      help="clean the export directory") + +    parser.add_option("-p", +                      type="int", +                      dest="program", +                      help="The index of the desired test program: [0-%d]"% (len(TESTS)-1)) + +    parser.add_option("-n", +                      dest="program_name", +                      help="The name of the desired test program") + +    parser.add_option("-b", +                      dest="build", +                      action="store_true", +                      default=False, +                      help="use the mbed library build, instead of the sources") + +    parser.add_option("-L", "--list-tests", +                      action="store_true", +                      dest="list_tests", +                      default=False, +                      help="list available programs in order and exit") + +    parser.add_option("-S", "--list-matrix", +                      action="store_true", +                      dest="supported_ides", +                      default=False, +                      help="displays supported matrix of MCUs and IDEs") + +    parser.add_option("-E", +                      action="store_true", +                      dest="supported_ides_html", +                      default=False, +                      help="writes workspace_tools/export/README.md") + +    (options, args) = parser.parse_args() + +    # Print available tests in order and exit +    if options.list_tests is True: +        print '\n'.join(map(str, sorted(TEST_MAP.values()))) +        sys.exit() + +    # Only prints matrix of supported IDEs +    if options.supported_ides: +        print mcu_ide_matrix() +        exit(0) + +    # Only prints matrix of supported IDEs +    if options.supported_ides_html: +        html = mcu_ide_matrix(verbose_html=True) +        try: +            with open("./export/README.md","w") as f: +                f.write("Exporter IDE/Platform Support\n") +                f.write("-----------------------------------\n") +                f.write("\n") +                f.write(html) +        except IOError as e: +            print "I/O error({0}): {1}".format(e.errno, e.strerror) +        except: +            print "Unexpected error:", sys.exc_info()[0] +            raise +        exit(0) + +    # Clean Export Directory +    if options.clean: +        if exists(EXPORT_DIR): +            rmtree(EXPORT_DIR) + +    # Target +    if options.mcu is None : +        args_error(parser, "[ERROR] You should specify an MCU") +    mcus = options.mcu + +    # IDE +    if options.ide is None: +        args_error(parser, "[ERROR] You should specify an IDE") +    ide = options.ide + +    # Export results +    successes = [] +    failures = [] + +    for mcu in mcus.split(','): +        # Program Number or name +        p, n = options.program, options.program_name + +        if n is not None and p is not None: +            args_error(parser, "[ERROR] specify either '-n' or '-p', not both") +        if n: +            if not n in TEST_MAP.keys(): +                # Check if there is an alias for this in private_settings.py +                if getattr(ps, "test_alias", None) is not None: +                    alias = ps.test_alias.get(n, "") +                    if not alias in TEST_MAP.keys(): +                        args_error(parser, "[ERROR] Program with name '%s' not found" % n) +                    else: +                        n = alias +                else: +                    args_error(parser, "[ERROR] Program with name '%s' not found" % n) +            p = TEST_MAP[n].n +        if p is None or (p < 0) or (p > (len(TESTS)-1)): +            message = "[ERROR] You have to specify one of the following tests:\n" +            message += '\n'.join(map(str, sorted(TEST_MAP.values()))) +            args_error(parser, message) + +        # Project +        if p is None or (p < 0) or (p > (len(TESTS)-1)): +            message = "[ERROR] You have to specify one of the following tests:\n" +            message += '\n'.join(map(str, sorted(TEST_MAP.values()))) +            args_error(parser, message) +        test = Test(p) + +        # Some libraries have extra macros (called by exporter symbols) to we need to pass +        # them to maintain compilation macros integrity between compiled library and +        # header files we might use with it +        lib_symbols = [] +        for lib in LIBRARIES: +            if lib['build_dir'] in test.dependencies: +                lib_macros = lib.get('macros', None) +                if lib_macros is not None: +                    lib_symbols.extend(lib_macros) + +        if not options.build: +            # Substitute the library builds with the sources +            # TODO: Substitute also the other library build paths +            if MBED_LIBRARIES in test.dependencies: +                test.dependencies.remove(MBED_LIBRARIES) +                test.dependencies.append(MBED_BASE) + +        # Build the project with the same directory structure of the mbed online IDE +        project_dir = join(EXPORT_WORKSPACE, test.id) +        setup_user_prj(project_dir, test.source_dir, test.dependencies) + +        # Export to selected toolchain +        tmp_path, report = export(project_dir, test.id, ide, mcu, EXPORT_WORKSPACE, EXPORT_TMP, extra_symbols=lib_symbols) +        if report['success']: +            zip_path = join(EXPORT_DIR, "%s_%s_%s.zip" % (test.id, ide, mcu)) +            move(tmp_path, zip_path) +            successes.append("%s::%s\t%s"% (mcu, ide, zip_path)) +        else: +            failures.append("%s::%s\t%s"% (mcu, ide, report['errormsg'])) + +    # Prints export results +    print +    if len(successes) > 0: +        print "Successful exports:" +        for success in successes: +            print "  * %s"% success +    if len(failures) > 0: +        print "Failed exports:" +        for failure in failures: +            print "  * %s"% failure  | 
