Brian Daniels / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
screamer
Date:
Wed Mar 30 19:28:05 2016 +0100
Revision:
2:5f044fef8f98
Parent:
0:4a2e5f0422d6
Child:
4:395a265b9cd4
Adjust all paths in python to reflect the mbed OS structure

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 0:4a2e5f0422d6 57 tempdir=None, clean=True, extra_symbols=None, 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 0:4a2e5f0422d6 114 copy(os.path.join(exporter.TEMPLATE_DIR,'.hgignore'),tempdir)
screamer 0:4a2e5f0422d6 115 zip_path = zip_working_directory_and_clean_up(tempdir, destination, project_name, clean)
screamer 0:4a2e5f0422d6 116
screamer 0:4a2e5f0422d6 117 return zip_path, report
screamer 0:4a2e5f0422d6 118
screamer 0:4a2e5f0422d6 119
screamer 0:4a2e5f0422d6 120 ###############################################################################
screamer 0:4a2e5f0422d6 121 # Generate project folders following the online conventions
screamer 0:4a2e5f0422d6 122 ###############################################################################
screamer 0:4a2e5f0422d6 123 def copy_tree(src, dst, clean=True):
screamer 0:4a2e5f0422d6 124 if exists(dst):
screamer 0:4a2e5f0422d6 125 if clean:
screamer 0:4a2e5f0422d6 126 rmtree(dst)
screamer 0:4a2e5f0422d6 127 else:
screamer 0:4a2e5f0422d6 128 return
screamer 0:4a2e5f0422d6 129
screamer 0:4a2e5f0422d6 130 copytree(src, dst)
screamer 0:4a2e5f0422d6 131
screamer 0:4a2e5f0422d6 132
screamer 0:4a2e5f0422d6 133 def setup_user_prj(user_dir, prj_path, lib_paths=None):
screamer 0:4a2e5f0422d6 134 """
screamer 0:4a2e5f0422d6 135 Setup a project with the same directory structure of the mbed online IDE
screamer 0:4a2e5f0422d6 136 """
screamer 0:4a2e5f0422d6 137 mkdir(user_dir)
screamer 0:4a2e5f0422d6 138
screamer 0:4a2e5f0422d6 139 # Project Path
screamer 0:4a2e5f0422d6 140 copy_tree(prj_path, join(user_dir, "src"))
screamer 0:4a2e5f0422d6 141
screamer 0:4a2e5f0422d6 142 # Project Libraries
screamer 0:4a2e5f0422d6 143 user_lib = join(user_dir, "lib")
screamer 0:4a2e5f0422d6 144 mkdir(user_lib)
screamer 0:4a2e5f0422d6 145
screamer 0:4a2e5f0422d6 146 if lib_paths is not None:
screamer 0:4a2e5f0422d6 147 for lib_path in lib_paths:
screamer 0:4a2e5f0422d6 148 copy_tree(lib_path, join(user_lib, basename(lib_path)))
screamer 0:4a2e5f0422d6 149
screamer 0:4a2e5f0422d6 150 def mcu_ide_matrix(verbose_html=False, platform_filter=None):
screamer 0:4a2e5f0422d6 151 """ Shows target map using prettytable """
screamer 0:4a2e5f0422d6 152 supported_ides = []
screamer 0:4a2e5f0422d6 153 for key in EXPORTERS.iterkeys():
screamer 0:4a2e5f0422d6 154 supported_ides.append(key)
screamer 0:4a2e5f0422d6 155 supported_ides.sort()
screamer 0:4a2e5f0422d6 156 from prettytable import PrettyTable, ALL # Only use it in this function so building works without extra modules
screamer 0:4a2e5f0422d6 157
screamer 0:4a2e5f0422d6 158 # All tests status table print
screamer 0:4a2e5f0422d6 159 columns = ["Platform"] + supported_ides
screamer 0:4a2e5f0422d6 160 pt = PrettyTable(columns)
screamer 0:4a2e5f0422d6 161 # Align table
screamer 0:4a2e5f0422d6 162 for col in columns:
screamer 0:4a2e5f0422d6 163 pt.align[col] = "c"
screamer 0:4a2e5f0422d6 164 pt.align["Platform"] = "l"
screamer 0:4a2e5f0422d6 165
screamer 0:4a2e5f0422d6 166 perm_counter = 0
screamer 0:4a2e5f0422d6 167 target_counter = 0
screamer 0:4a2e5f0422d6 168 for target in sorted(TARGET_NAMES):
screamer 0:4a2e5f0422d6 169 target_counter += 1
screamer 0:4a2e5f0422d6 170
screamer 0:4a2e5f0422d6 171 row = [target] # First column is platform name
screamer 0:4a2e5f0422d6 172 for ide in supported_ides:
screamer 0:4a2e5f0422d6 173 text = "-"
screamer 0:4a2e5f0422d6 174 if target in EXPORTERS[ide].TARGETS:
screamer 0:4a2e5f0422d6 175 if verbose_html:
screamer 0:4a2e5f0422d6 176 text = "&#10003;"
screamer 0:4a2e5f0422d6 177 else:
screamer 0:4a2e5f0422d6 178 text = "x"
screamer 0:4a2e5f0422d6 179 perm_counter += 1
screamer 0:4a2e5f0422d6 180 row.append(text)
screamer 0:4a2e5f0422d6 181 pt.add_row(row)
screamer 0:4a2e5f0422d6 182
screamer 0:4a2e5f0422d6 183 pt.border = True
screamer 0:4a2e5f0422d6 184 pt.vrules = ALL
screamer 0:4a2e5f0422d6 185 pt.hrules = ALL
screamer 0:4a2e5f0422d6 186 # creates a html page suitable for a browser
screamer 0:4a2e5f0422d6 187 # result = pt.get_html_string(format=True) if verbose_html else pt.get_string()
screamer 0:4a2e5f0422d6 188 # creates a html page in a shorter format suitable for readme.md
screamer 0:4a2e5f0422d6 189 result = pt.get_html_string() if verbose_html else pt.get_string()
screamer 0:4a2e5f0422d6 190 result += "\n"
screamer 0:4a2e5f0422d6 191 result += "Total IDEs: %d\n"% (len(supported_ides))
screamer 0:4a2e5f0422d6 192 if verbose_html: result += "<br>"
screamer 0:4a2e5f0422d6 193 result += "Total platforms: %d\n"% (target_counter)
screamer 0:4a2e5f0422d6 194 if verbose_html: result += "<br>"
screamer 0:4a2e5f0422d6 195 result += "Total permutations: %d"% (perm_counter)
screamer 0:4a2e5f0422d6 196 if verbose_html: result = result.replace("&amp;", "&")
screamer 0:4a2e5f0422d6 197 return result