Brian Daniels / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
screamer
Date:
Thu Mar 31 00:18:15 2016 +0100
Revision:
4:395a265b9cd4
Parent:
2:5f044fef8f98
Add support for --source for exporters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 """
screamer 0:4a2e5f0422d6 2 mbed SDK
screamer 0:4a2e5f0422d6 3 Copyright (c) 2011-2013 ARM Limited
screamer 0:4a2e5f0422d6 4
screamer 0:4a2e5f0422d6 5 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:4a2e5f0422d6 6 you may not use this file except in compliance with the License.
screamer 0:4a2e5f0422d6 7 You may obtain a copy of the License at
screamer 0:4a2e5f0422d6 8
screamer 0:4a2e5f0422d6 9 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:4a2e5f0422d6 10
screamer 0:4a2e5f0422d6 11 Unless required by applicable law or agreed to in writing, software
screamer 0:4a2e5f0422d6 12 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:4a2e5f0422d6 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:4a2e5f0422d6 14 See the License for the specific language governing permissions and
screamer 0:4a2e5f0422d6 15 limitations under the License.
screamer 0:4a2e5f0422d6 16 """
screamer 0:4a2e5f0422d6 17 import os, tempfile
screamer 0:4a2e5f0422d6 18 from os.path import join, exists, basename
screamer 0:4a2e5f0422d6 19 from shutil import copytree, rmtree, copy
screamer 0:4a2e5f0422d6 20
screamer 2:5f044fef8f98 21 from tools.utils import mkdir
screamer 2:5f044fef8f98 22 from tools.export import uvision4, codered, gccarm, ds5_5, iar, emblocks, coide, kds, zip, simplicityv3, atmelstudio, sw4stm32
screamer 2:5f044fef8f98 23 from tools.export.exporters import zip_working_directory_and_clean_up, OldLibrariesException
screamer 2:5f044fef8f98 24 from tools.targets import TARGET_NAMES, EXPORT_MAP, TARGET_MAP
screamer 0:4a2e5f0422d6 25
screamer 0:4a2e5f0422d6 26 from project_generator_definitions.definitions import ProGenDef
screamer 0:4a2e5f0422d6 27
screamer 0:4a2e5f0422d6 28 EXPORTERS = {
screamer 0:4a2e5f0422d6 29 'uvision': uvision4.Uvision4,
screamer 0:4a2e5f0422d6 30 'lpcxpresso': codered.CodeRed,
screamer 0:4a2e5f0422d6 31 'gcc_arm': gccarm.GccArm,
screamer 0:4a2e5f0422d6 32 'ds5_5': ds5_5.DS5_5,
screamer 0:4a2e5f0422d6 33 'iar': iar.IAREmbeddedWorkbench,
screamer 0:4a2e5f0422d6 34 'emblocks' : emblocks.IntermediateFile,
screamer 0:4a2e5f0422d6 35 'coide' : coide.CoIDE,
screamer 0:4a2e5f0422d6 36 'kds' : kds.KDS,
screamer 0:4a2e5f0422d6 37 'simplicityv3' : simplicityv3.SimplicityV3,
screamer 0:4a2e5f0422d6 38 'atmelstudio' : atmelstudio.AtmelStudio,
screamer 0:4a2e5f0422d6 39 'sw4stm32' : sw4stm32.Sw4STM32,
screamer 0:4a2e5f0422d6 40 }
screamer 0:4a2e5f0422d6 41
screamer 0:4a2e5f0422d6 42 ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN = """
screamer 0:4a2e5f0422d6 43 Sorry, the target %s is not currently supported on the %s toolchain.
screamer 0:4a2e5f0422d6 44 Please refer to <a href='/handbook/Exporting-to-offline-toolchains' target='_blank'>Exporting to offline toolchains</a> for more information.
screamer 0:4a2e5f0422d6 45 """
screamer 0:4a2e5f0422d6 46
screamer 0:4a2e5f0422d6 47 ERROR_MESSAGE_NOT_EXPORT_LIBS = """
screamer 0:4a2e5f0422d6 48 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>.
screamer 0:4a2e5f0422d6 49 """
screamer 0:4a2e5f0422d6 50
screamer 0:4a2e5f0422d6 51 def online_build_url_resolver(url):
screamer 0:4a2e5f0422d6 52 # TODO: Retrieve the path and name of an online library build URL
screamer 0:4a2e5f0422d6 53 return {'path':'', 'name':''}
screamer 0:4a2e5f0422d6 54
screamer 0:4a2e5f0422d6 55
screamer 0:4a2e5f0422d6 56 def export(project_path, project_name, ide, target, destination='/tmp/',
screamer 4:395a265b9cd4 57 tempdir=None, clean=True, extra_symbols=None, zip=True, build_url_resolver=online_build_url_resolver):
screamer 0:4a2e5f0422d6 58 # Convention: we are using capitals for toolchain and target names
screamer 0:4a2e5f0422d6 59 if target is not None:
screamer 0:4a2e5f0422d6 60 target = target.upper()
screamer 0:4a2e5f0422d6 61
screamer 0:4a2e5f0422d6 62 if tempdir is None:
screamer 0:4a2e5f0422d6 63 tempdir = tempfile.mkdtemp()
screamer 0:4a2e5f0422d6 64
screamer 0:4a2e5f0422d6 65 report = {'success': False, 'errormsg':''}
screamer 0:4a2e5f0422d6 66 if ide is None or ide == "zip":
screamer 0:4a2e5f0422d6 67 # Simple ZIP exporter
screamer 0:4a2e5f0422d6 68 try:
screamer 0:4a2e5f0422d6 69 ide = "zip"
screamer 0:4a2e5f0422d6 70 exporter = zip.ZIP(target, tempdir, project_name, build_url_resolver, extra_symbols=extra_symbols)
screamer 0:4a2e5f0422d6 71 exporter.scan_and_copy_resources(project_path, tempdir)
screamer 0:4a2e5f0422d6 72 exporter.generate()
screamer 0:4a2e5f0422d6 73 report['success'] = True
screamer 0:4a2e5f0422d6 74 except OldLibrariesException, e:
screamer 0:4a2e5f0422d6 75 report['errormsg'] = ERROR_MESSAGE_NOT_EXPORT_LIBS
screamer 0:4a2e5f0422d6 76 else:
screamer 0:4a2e5f0422d6 77 if ide not in EXPORTERS:
screamer 0:4a2e5f0422d6 78 report['errormsg'] = ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN % (target, ide)
screamer 0:4a2e5f0422d6 79 else:
screamer 0:4a2e5f0422d6 80 Exporter = EXPORTERS[ide]
screamer 0:4a2e5f0422d6 81 target = EXPORT_MAP.get(target, target)
screamer 0:4a2e5f0422d6 82 # use progen targets or mbed exporters targets, check progen attribute
screamer 0:4a2e5f0422d6 83 use_progen = False
screamer 0:4a2e5f0422d6 84 supported = True
screamer 0:4a2e5f0422d6 85 try:
screamer 0:4a2e5f0422d6 86 if Exporter.PROGEN_ACTIVE:
screamer 0:4a2e5f0422d6 87 use_progen = True
screamer 0:4a2e5f0422d6 88 except AttributeError:
screamer 0:4a2e5f0422d6 89 pass
screamer 0:4a2e5f0422d6 90 if use_progen:
screamer 0:4a2e5f0422d6 91 if not ProGenDef(ide).is_supported(TARGET_MAP[target].progen['target']):
screamer 0:4a2e5f0422d6 92 supported = False
screamer 0:4a2e5f0422d6 93 else:
screamer 0:4a2e5f0422d6 94 if target not in Exporter.TARGETS:
screamer 0:4a2e5f0422d6 95 supported = False
screamer 0:4a2e5f0422d6 96
screamer 0:4a2e5f0422d6 97 if supported:
screamer 0:4a2e5f0422d6 98 # target checked, export
screamer 0:4a2e5f0422d6 99 try:
screamer 0:4a2e5f0422d6 100 exporter = Exporter(target, tempdir, project_name, build_url_resolver, extra_symbols=extra_symbols)
screamer 0:4a2e5f0422d6 101 exporter.scan_and_copy_resources(project_path, tempdir)
screamer 0:4a2e5f0422d6 102 exporter.generate()
screamer 0:4a2e5f0422d6 103 report['success'] = True
screamer 0:4a2e5f0422d6 104 except OldLibrariesException, e:
screamer 0:4a2e5f0422d6 105 report['errormsg'] = ERROR_MESSAGE_NOT_EXPORT_LIBS
screamer 0:4a2e5f0422d6 106 else:
screamer 0:4a2e5f0422d6 107 report['errormsg'] = ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN % (target, ide)
screamer 0:4a2e5f0422d6 108
screamer 0:4a2e5f0422d6 109 zip_path = None
screamer 0:4a2e5f0422d6 110 if report['success']:
screamer 0:4a2e5f0422d6 111 # add readme file to every offline export.
screamer 0:4a2e5f0422d6 112 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))
screamer 0:4a2e5f0422d6 113 # copy .hgignore file to exported direcotry as well.
screamer 4:395a265b9cd4 114 if exists(os.path.join(exporter.TEMPLATE_DIR,'.hgignore')):
screamer 4:395a265b9cd4 115 copy(os.path.join(exporter.TEMPLATE_DIR,'.hgignore'),tempdir)
screamer 4:395a265b9cd4 116
screamer 4:395a265b9cd4 117 if zip:
screamer 4:395a265b9cd4 118 zip_path = zip_working_directory_and_clean_up(tempdir, destination, project_name, clean)
screamer 4:395a265b9cd4 119 else:
screamer 4:395a265b9cd4 120 zip_path = destination
screamer 0:4a2e5f0422d6 121
screamer 0:4a2e5f0422d6 122 return zip_path, report
screamer 0:4a2e5f0422d6 123
screamer 0:4a2e5f0422d6 124
screamer 0:4a2e5f0422d6 125 ###############################################################################
screamer 0:4a2e5f0422d6 126 # Generate project folders following the online conventions
screamer 0:4a2e5f0422d6 127 ###############################################################################
screamer 0:4a2e5f0422d6 128 def copy_tree(src, dst, clean=True):
screamer 0:4a2e5f0422d6 129 if exists(dst):
screamer 0:4a2e5f0422d6 130 if clean:
screamer 0:4a2e5f0422d6 131 rmtree(dst)
screamer 0:4a2e5f0422d6 132 else:
screamer 0:4a2e5f0422d6 133 return
screamer 0:4a2e5f0422d6 134
screamer 0:4a2e5f0422d6 135 copytree(src, dst)
screamer 0:4a2e5f0422d6 136
screamer 0:4a2e5f0422d6 137
screamer 0:4a2e5f0422d6 138 def setup_user_prj(user_dir, prj_path, lib_paths=None):
screamer 0:4a2e5f0422d6 139 """
screamer 0:4a2e5f0422d6 140 Setup a project with the same directory structure of the mbed online IDE
screamer 0:4a2e5f0422d6 141 """
screamer 0:4a2e5f0422d6 142 mkdir(user_dir)
screamer 0:4a2e5f0422d6 143
screamer 0:4a2e5f0422d6 144 # Project Path
screamer 0:4a2e5f0422d6 145 copy_tree(prj_path, join(user_dir, "src"))
screamer 0:4a2e5f0422d6 146
screamer 0:4a2e5f0422d6 147 # Project Libraries
screamer 0:4a2e5f0422d6 148 user_lib = join(user_dir, "lib")
screamer 0:4a2e5f0422d6 149 mkdir(user_lib)
screamer 0:4a2e5f0422d6 150
screamer 0:4a2e5f0422d6 151 if lib_paths is not None:
screamer 0:4a2e5f0422d6 152 for lib_path in lib_paths:
screamer 0:4a2e5f0422d6 153 copy_tree(lib_path, join(user_lib, basename(lib_path)))
screamer 0:4a2e5f0422d6 154
screamer 0:4a2e5f0422d6 155 def mcu_ide_matrix(verbose_html=False, platform_filter=None):
screamer 0:4a2e5f0422d6 156 """ Shows target map using prettytable """
screamer 0:4a2e5f0422d6 157 supported_ides = []
screamer 0:4a2e5f0422d6 158 for key in EXPORTERS.iterkeys():
screamer 0:4a2e5f0422d6 159 supported_ides.append(key)
screamer 0:4a2e5f0422d6 160 supported_ides.sort()
screamer 0:4a2e5f0422d6 161 from prettytable import PrettyTable, ALL # Only use it in this function so building works without extra modules
screamer 0:4a2e5f0422d6 162
screamer 0:4a2e5f0422d6 163 # All tests status table print
screamer 0:4a2e5f0422d6 164 columns = ["Platform"] + supported_ides
screamer 0:4a2e5f0422d6 165 pt = PrettyTable(columns)
screamer 0:4a2e5f0422d6 166 # Align table
screamer 0:4a2e5f0422d6 167 for col in columns:
screamer 0:4a2e5f0422d6 168 pt.align[col] = "c"
screamer 0:4a2e5f0422d6 169 pt.align["Platform"] = "l"
screamer 0:4a2e5f0422d6 170
screamer 0:4a2e5f0422d6 171 perm_counter = 0
screamer 0:4a2e5f0422d6 172 target_counter = 0
screamer 0:4a2e5f0422d6 173 for target in sorted(TARGET_NAMES):
screamer 0:4a2e5f0422d6 174 target_counter += 1
screamer 0:4a2e5f0422d6 175
screamer 0:4a2e5f0422d6 176 row = [target] # First column is platform name
screamer 0:4a2e5f0422d6 177 for ide in supported_ides:
screamer 0:4a2e5f0422d6 178 text = "-"
screamer 0:4a2e5f0422d6 179 if target in EXPORTERS[ide].TARGETS:
screamer 0:4a2e5f0422d6 180 if verbose_html:
screamer 0:4a2e5f0422d6 181 text = "&#10003;"
screamer 0:4a2e5f0422d6 182 else:
screamer 0:4a2e5f0422d6 183 text = "x"
screamer 0:4a2e5f0422d6 184 perm_counter += 1
screamer 0:4a2e5f0422d6 185 row.append(text)
screamer 0:4a2e5f0422d6 186 pt.add_row(row)
screamer 0:4a2e5f0422d6 187
screamer 0:4a2e5f0422d6 188 pt.border = True
screamer 0:4a2e5f0422d6 189 pt.vrules = ALL
screamer 0:4a2e5f0422d6 190 pt.hrules = ALL
screamer 0:4a2e5f0422d6 191 # creates a html page suitable for a browser
screamer 0:4a2e5f0422d6 192 # result = pt.get_html_string(format=True) if verbose_html else pt.get_string()
screamer 0:4a2e5f0422d6 193 # creates a html page in a shorter format suitable for readme.md
screamer 0:4a2e5f0422d6 194 result = pt.get_html_string() if verbose_html else pt.get_string()
screamer 0:4a2e5f0422d6 195 result += "\n"
screamer 0:4a2e5f0422d6 196 result += "Total IDEs: %d\n"% (len(supported_ides))
screamer 0:4a2e5f0422d6 197 if verbose_html: result += "<br>"
screamer 0:4a2e5f0422d6 198 result += "Total platforms: %d\n"% (target_counter)
screamer 0:4a2e5f0422d6 199 if verbose_html: result += "<br>"
screamer 0:4a2e5f0422d6 200 result += "Total permutations: %d"% (perm_counter)
screamer 0:4a2e5f0422d6 201 if verbose_html: result = result.replace("&amp;", "&")
screamer 0:4a2e5f0422d6 202 return result