Clone of official tools
Diff: export/__init__.py
- Revision:
- 0:66f3b5499f7f
- Child:
- 13:ab47a20b66f0
diff -r 000000000000 -r 66f3b5499f7f export/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/export/__init__.py Thu May 19 19:44:41 2016 +0100 @@ -0,0 +1,222 @@ +""" +mbed SDK +Copyright (c) 2011-2013 ARM Limited + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" +import os, tempfile +from os.path import join, exists, basename +from shutil import copytree, rmtree, copy +import yaml + +from tools.utils import mkdir +from tools.export import uvision4, codered, gccarm, ds5_5, iar, emblocks, coide, kds, zip, simplicityv3, atmelstudio, sw4stm32 +from tools.export.exporters import zip_working_directory_and_clean_up, OldLibrariesException +from tools.targets import TARGET_NAMES, EXPORT_MAP, TARGET_MAP + +from project_generator_definitions.definitions import ProGenDef + +EXPORTERS = { + 'uvision': uvision4.Uvision4, + 'lpcxpresso': codered.CodeRed, + 'gcc_arm': gccarm.GccArm, + 'ds5_5': ds5_5.DS5_5, + 'iar': iar.IAREmbeddedWorkbench, + 'emblocks' : emblocks.IntermediateFile, + 'coide' : coide.CoIDE, + 'kds' : kds.KDS, + 'simplicityv3' : simplicityv3.SimplicityV3, + 'atmelstudio' : atmelstudio.AtmelStudio, + 'sw4stm32' : sw4stm32.Sw4STM32, +} + +ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN = """ +Sorry, the target %s is not currently supported on the %s toolchain. +Please refer to <a href='/handbook/Exporting-to-offline-toolchains' target='_blank'>Exporting to offline toolchains</a> for more information. +""" + +ERROR_MESSAGE_NOT_EXPORT_LIBS = """ +To export this project please <a href='http://mbed.org/compiler/?import=http://mbed.org/users/mbed_official/code/mbed-export/k&mode=lib' target='_blank'>import the export version of the mbed library</a>. +""" + +def online_build_url_resolver(url): + # TODO: Retrieve the path and name of an online library build URL + return {'path':'', 'name':''} + + +def export(project_path, project_name, ide, target, destination='/tmp/', + tempdir=None, clean=True, extra_symbols=None, zip=True, build_url_resolver=online_build_url_resolver, relative=False): + # Convention: we are using capitals for toolchain and target names + if target is not None: + target = target.upper() + + if tempdir is None: + tempdir = tempfile.mkdtemp() + + report = {'success': False, 'errormsg':''} + if ide is None or ide == "zip": + # Simple ZIP exporter + try: + ide = "zip" + exporter = zip.ZIP(target, tempdir, project_name, build_url_resolver, extra_symbols=extra_symbols) + exporter.scan_and_copy_resources(project_path, tempdir) + exporter.generate() + report['success'] = True + except OldLibrariesException, e: + report['errormsg'] = ERROR_MESSAGE_NOT_EXPORT_LIBS + else: + if ide not in EXPORTERS: + report['errormsg'] = ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN % (target, ide) + else: + Exporter = EXPORTERS[ide] + target = EXPORT_MAP.get(target, target) + # use progen targets or mbed exporters targets, check progen attribute + use_progen = False + supported = True + try: + if Exporter.PROGEN_ACTIVE: + use_progen = True + except AttributeError: + pass + if use_progen: + if not ProGenDef(ide).is_supported(TARGET_MAP[target].progen['target']): + supported = False + else: + if target not in Exporter.TARGETS: + supported = False + + if supported: + # target checked, export + try: + exporter = Exporter(target, tempdir, project_name, build_url_resolver, extra_symbols=extra_symbols) + exporter.scan_and_copy_resources(project_path, tempdir, relative) + exporter.generate() + report['success'] = True + except OldLibrariesException, e: + report['errormsg'] = ERROR_MESSAGE_NOT_EXPORT_LIBS + else: + report['errormsg'] = ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN % (target, ide) + + zip_path = None + if report['success']: + # readme.txt to contain more exported data + exporter_yaml = { + 'project_generator': { + 'active' : False, + } + } + if use_progen: + try: + import pkg_resources + version = pkg_resources.get_distribution('project_generator').version + exporter_yaml['project_generator']['version'] = version + exporter_yaml['project_generator']['active'] = True; + exporter_yaml['project_generator_definitions'] = {} + version = pkg_resources.get_distribution('project_generator_definitions').version + exporter_yaml['project_generator_definitions']['version'] = version + except ImportError: + pass + with open(os.path.join(tempdir, 'exporter.yaml'), 'w') as outfile: + yaml.dump(exporter_yaml, outfile, default_flow_style=False) + # add readme file to every offline export. + open(os.path.join(tempdir, 'GettingStarted.htm'),'w').write('<meta http-equiv="refresh" content="0; url=http://mbed.org/handbook/Getting-Started-mbed-Exporters#%s"/>'% (ide)) + # copy .hgignore file to exported direcotry as well. + if exists(os.path.join(exporter.TEMPLATE_DIR,'.hgignore')): + copy(os.path.join(exporter.TEMPLATE_DIR,'.hgignore'),tempdir) + + if zip: + zip_path = zip_working_directory_and_clean_up(tempdir, destination, project_name, clean) + else: + zip_path = destination + + return zip_path, report + + +############################################################################### +# Generate project folders following the online conventions +############################################################################### +def copy_tree(src, dst, clean=True): + if exists(dst): + if clean: + rmtree(dst) + else: + return + + copytree(src, dst) + + +def setup_user_prj(user_dir, prj_path, lib_paths=None): + """ + Setup a project with the same directory structure of the mbed online IDE + """ + mkdir(user_dir) + + # Project Path + copy_tree(prj_path, join(user_dir, "src")) + + # Project Libraries + user_lib = join(user_dir, "lib") + mkdir(user_lib) + + if lib_paths is not None: + for lib_path in lib_paths: + copy_tree(lib_path, join(user_lib, basename(lib_path))) + +def mcu_ide_matrix(verbose_html=False, platform_filter=None): + """ Shows target map using prettytable """ + supported_ides = [] + for key in EXPORTERS.iterkeys(): + supported_ides.append(key) + supported_ides.sort() + from prettytable import PrettyTable, ALL # Only use it in this function so building works without extra modules + + # All tests status table print + columns = ["Platform"] + supported_ides + pt = PrettyTable(columns) + # Align table + for col in columns: + pt.align[col] = "c" + pt.align["Platform"] = "l" + + perm_counter = 0 + target_counter = 0 + for target in sorted(TARGET_NAMES): + target_counter += 1 + + row = [target] # First column is platform name + for ide in supported_ides: + text = "-" + if target in EXPORTERS[ide].TARGETS: + if verbose_html: + text = "✓" + else: + text = "x" + perm_counter += 1 + row.append(text) + pt.add_row(row) + + pt.border = True + pt.vrules = ALL + pt.hrules = ALL + # creates a html page suitable for a browser + # result = pt.get_html_string(format=True) if verbose_html else pt.get_string() + # creates a html page in a shorter format suitable for readme.md + result = pt.get_html_string() if verbose_html else pt.get_string() + result += "\n" + result += "Total IDEs: %d\n"% (len(supported_ides)) + if verbose_html: result += "<br>" + result += "Total platforms: %d\n"% (target_counter) + if verbose_html: result += "<br>" + result += "Total permutations: %d"% (perm_counter) + if verbose_html: result = result.replace("&", "&") + return result