ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 """ Import and bulid a bunch of example programs
group-onsemi 0:098463de4c5d 2
group-onsemi 0:098463de4c5d 3 This library includes functions that are shared between the examples.py and
group-onsemi 0:098463de4c5d 4 the update.py modules.
group-onsemi 0:098463de4c5d 5
group-onsemi 0:098463de4c5d 6 """
group-onsemi 0:098463de4c5d 7 import os
group-onsemi 0:098463de4c5d 8 from os.path import dirname, abspath, basename
group-onsemi 0:098463de4c5d 9 import os.path
group-onsemi 0:098463de4c5d 10 import sys
group-onsemi 0:098463de4c5d 11 import subprocess
group-onsemi 0:098463de4c5d 12 from shutil import rmtree
group-onsemi 0:098463de4c5d 13 from sets import Set
group-onsemi 0:098463de4c5d 14
group-onsemi 0:098463de4c5d 15 ROOT = abspath(dirname(dirname(dirname(dirname(__file__)))))
group-onsemi 0:098463de4c5d 16 sys.path.insert(0, ROOT)
group-onsemi 0:098463de4c5d 17
group-onsemi 0:098463de4c5d 18 from tools.build_api import get_mbed_official_release
group-onsemi 0:098463de4c5d 19 from tools.targets import TARGET_MAP
group-onsemi 0:098463de4c5d 20 from tools.export import EXPORTERS
group-onsemi 0:098463de4c5d 21
group-onsemi 0:098463de4c5d 22 SUPPORTED_TOOLCHAINS = ["ARM", "IAR", "GCC_ARM"]
group-onsemi 0:098463de4c5d 23 SUPPORTED_IDES = [exp for exp in EXPORTERS.keys() if exp != "cmsis" and exp != "zip"]
group-onsemi 0:098463de4c5d 24
group-onsemi 0:098463de4c5d 25
group-onsemi 0:098463de4c5d 26 def print_list(lst):
group-onsemi 0:098463de4c5d 27 """Prints to screen the contents of a list
group-onsemi 0:098463de4c5d 28
group-onsemi 0:098463de4c5d 29 Args:
group-onsemi 0:098463de4c5d 30 lst - a list of any type, to be displayed
group-onsemi 0:098463de4c5d 31
group-onsemi 0:098463de4c5d 32 """
group-onsemi 0:098463de4c5d 33 if lst:
group-onsemi 0:098463de4c5d 34 for thing in lst:
group-onsemi 0:098463de4c5d 35 print("# %s" % thing)
group-onsemi 0:098463de4c5d 36
group-onsemi 0:098463de4c5d 37
group-onsemi 0:098463de4c5d 38 def print_category(results, index, message):
group-onsemi 0:098463de4c5d 39 summary = [example for key, summ in results.iteritems()
group-onsemi 0:098463de4c5d 40 for example in summ[index]]
group-onsemi 0:098463de4c5d 41 if all(len(s) == 0 for s in summary):
group-onsemi 0:098463de4c5d 42 return
group-onsemi 0:098463de4c5d 43 print("#")
group-onsemi 0:098463de4c5d 44 print("#" * 80)
group-onsemi 0:098463de4c5d 45 print("# %s" % message)
group-onsemi 0:098463de4c5d 46 print("#" * 80)
group-onsemi 0:098463de4c5d 47 split_summ = [s.rsplit(" ", 1) for s in summary]
group-onsemi 0:098463de4c5d 48
group-onsemi 0:098463de4c5d 49 print_list(summary)
group-onsemi 0:098463de4c5d 50
group-onsemi 0:098463de4c5d 51
group-onsemi 0:098463de4c5d 52 def print_summary(results, export=False):
group-onsemi 0:098463de4c5d 53 """Prints to screen the results of compiling/exporting combinations of example programs,
group-onsemi 0:098463de4c5d 54 targets and compile toolchains/IDEs.
group-onsemi 0:098463de4c5d 55
group-onsemi 0:098463de4c5d 56 Args:
group-onsemi 0:098463de4c5d 57 results - results of the compilation stage. See compile_repos() and export_repos()
group-onsemi 0:098463de4c5d 58 for details of the format.
group-onsemi 0:098463de4c5d 59
group-onsemi 0:098463de4c5d 60 """
group-onsemi 0:098463de4c5d 61
group-onsemi 0:098463de4c5d 62 print("#"*80)
group-onsemi 0:098463de4c5d 63 print("# Examples compilation summary")
group-onsemi 0:098463de4c5d 64 print("#"*80)
group-onsemi 0:098463de4c5d 65
group-onsemi 0:098463de4c5d 66 print_category(results, 2, "Passed example combinations")
group-onsemi 0:098463de4c5d 67
group-onsemi 0:098463de4c5d 68 second_result = "Failed example combinations" if not export else \
group-onsemi 0:098463de4c5d 69 "Failed export example combinations"
group-onsemi 0:098463de4c5d 70
group-onsemi 0:098463de4c5d 71 print_category(results, 3, second_result)
group-onsemi 0:098463de4c5d 72
group-onsemi 0:098463de4c5d 73 if export:
group-onsemi 0:098463de4c5d 74 print_category(results, 4, "Failed build combinations")
group-onsemi 0:098463de4c5d 75 print_category(results, 5, "Skipped build combinations")
group-onsemi 0:098463de4c5d 76
group-onsemi 0:098463de4c5d 77 print("#")
group-onsemi 0:098463de4c5d 78 print("#"*80)
group-onsemi 0:098463de4c5d 79
group-onsemi 0:098463de4c5d 80 def valid_choices(allowed_choices, all_choices):
group-onsemi 0:098463de4c5d 81 if len(allowed_choices) > 0:
group-onsemi 0:098463de4c5d 82 return [t for t in all_choices if t in allowed_choices]
group-onsemi 0:098463de4c5d 83 else:
group-onsemi 0:098463de4c5d 84 return all_choices
group-onsemi 0:098463de4c5d 85
group-onsemi 0:098463de4c5d 86
group-onsemi 0:098463de4c5d 87 def target_cross_toolchain(allowed_targets, allowed_toolchains, features=[]):
group-onsemi 0:098463de4c5d 88 """Generate pairs of target and toolchains
group-onsemi 0:098463de4c5d 89
group-onsemi 0:098463de4c5d 90 Args:
group-onsemi 0:098463de4c5d 91 allowed_targets - a list of all possible targets
group-onsemi 0:098463de4c5d 92 allowed_toolchains - a list of all possible toolchains
group-onsemi 0:098463de4c5d 93
group-onsemi 0:098463de4c5d 94 Kwargs:
group-onsemi 0:098463de4c5d 95 features - the features that must be in the features array of a
group-onsemi 0:098463de4c5d 96 target
group-onsemi 0:098463de4c5d 97 """
group-onsemi 0:098463de4c5d 98 for target in allowed_targets:
group-onsemi 0:098463de4c5d 99 for toolchain in allowed_toolchains:
group-onsemi 0:098463de4c5d 100 if all(feature in TARGET_MAP[target].features
group-onsemi 0:098463de4c5d 101 for feature in features):
group-onsemi 0:098463de4c5d 102 yield target, toolchain
group-onsemi 0:098463de4c5d 103
group-onsemi 0:098463de4c5d 104
group-onsemi 0:098463de4c5d 105 def target_cross_ide(allowed_targets, allowed_ides, features=[], toolchains=[]):
group-onsemi 0:098463de4c5d 106 """Generate pairs of target and ides
group-onsemi 0:098463de4c5d 107
group-onsemi 0:098463de4c5d 108 Args:
group-onsemi 0:098463de4c5d 109 allowed_targets - a list of all possible targets
group-onsemi 0:098463de4c5d 110 allowed_ides - a list of all possible IDEs
group-onsemi 0:098463de4c5d 111
group-onsemi 0:098463de4c5d 112 Kwargs:
group-onsemi 0:098463de4c5d 113 features - the features that must be in the features array of a
group-onsemi 0:098463de4c5d 114 target
group-onsemi 0:098463de4c5d 115 """
group-onsemi 0:098463de4c5d 116 for target in allowed_targets:
group-onsemi 0:098463de4c5d 117 for ide in allowed_ides:
group-onsemi 0:098463de4c5d 118 if (target in EXPORTERS[ide].TARGETS and
group-onsemi 0:098463de4c5d 119 (not toolchains or EXPORTERS[ide].TOOLCHAIN in toolchains) and
group-onsemi 0:098463de4c5d 120 all(feature in TARGET_MAP[target].features
group-onsemi 0:098463de4c5d 121 for feature in features)):
group-onsemi 0:098463de4c5d 122 yield target, ide
group-onsemi 0:098463de4c5d 123
group-onsemi 0:098463de4c5d 124
group-onsemi 0:098463de4c5d 125 def get_repo_list(example):
group-onsemi 0:098463de4c5d 126 """ Returns a list of all the repos associated with the specific example in the json
group-onsemi 0:098463de4c5d 127 config file.
group-onsemi 0:098463de4c5d 128 If there are repos listed under the mbed section then these will be returned as a
group-onsemi 0:098463de4c5d 129 list. If not then the github single repo with be returned.
group-onsemi 0:098463de4c5d 130 NOTE: This does not currently deal with multiple examples underneath a github
group-onsemi 0:098463de4c5d 131 sourced exampe repo.
group-onsemi 0:098463de4c5d 132
group-onsemi 0:098463de4c5d 133 Args:
group-onsemi 0:098463de4c5d 134 example - Example for which the repo list is requested
group-onsemi 0:098463de4c5d 135 repos - The list of repos and types contained within that example in the json file
group-onsemi 0:098463de4c5d 136
group-onsemi 0:098463de4c5d 137 """
group-onsemi 0:098463de4c5d 138 repos = []
group-onsemi 0:098463de4c5d 139 if len(example['mbed']) > 0:
group-onsemi 0:098463de4c5d 140 for repo in example['mbed']:
group-onsemi 0:098463de4c5d 141 repos.append({
group-onsemi 0:098463de4c5d 142 'repo': repo,
group-onsemi 0:098463de4c5d 143 'type': 'hg'
group-onsemi 0:098463de4c5d 144 })
group-onsemi 0:098463de4c5d 145 else:
group-onsemi 0:098463de4c5d 146 repos.append({
group-onsemi 0:098463de4c5d 147 'repo': example['github'],
group-onsemi 0:098463de4c5d 148 'type': 'git'
group-onsemi 0:098463de4c5d 149 })
group-onsemi 0:098463de4c5d 150 return repos
group-onsemi 0:098463de4c5d 151
group-onsemi 0:098463de4c5d 152
group-onsemi 0:098463de4c5d 153 def source_repos(config, examples):
group-onsemi 0:098463de4c5d 154 """ Imports each of the repos and its dependencies (.lib files) associated
group-onsemi 0:098463de4c5d 155 with the specific examples name from the json config file. Note if
group-onsemi 0:098463de4c5d 156 there is already a clone of the repo then it will first be removed to
group-onsemi 0:098463de4c5d 157 ensure a clean, up to date cloning.
group-onsemi 0:098463de4c5d 158 Args:
group-onsemi 0:098463de4c5d 159 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 160
group-onsemi 0:098463de4c5d 161 """
group-onsemi 0:098463de4c5d 162 print("\nImporting example repos....\n")
group-onsemi 0:098463de4c5d 163 for example in config['examples']:
group-onsemi 0:098463de4c5d 164 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 165 name = basename(repo_info['repo'])
group-onsemi 0:098463de4c5d 166 if name in examples:
group-onsemi 0:098463de4c5d 167 if os.path.exists(name):
group-onsemi 0:098463de4c5d 168 print("'%s' example directory already exists. Deleting..." % name)
group-onsemi 0:098463de4c5d 169 rmtree(name)
group-onsemi 0:098463de4c5d 170
group-onsemi 0:098463de4c5d 171 subprocess.call(["mbed-cli", "import", repo_info['repo']])
group-onsemi 0:098463de4c5d 172
group-onsemi 0:098463de4c5d 173 def clone_repos(config, examples):
group-onsemi 0:098463de4c5d 174 """ Clones each of the repos associated with the specific examples name from the
group-onsemi 0:098463de4c5d 175 json config file. Note if there is already a clone of the repo then it will first
group-onsemi 0:098463de4c5d 176 be removed to ensure a clean, up to date cloning.
group-onsemi 0:098463de4c5d 177 Args:
group-onsemi 0:098463de4c5d 178 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 179
group-onsemi 0:098463de4c5d 180 """
group-onsemi 0:098463de4c5d 181 print("\nCloning example repos....\n")
group-onsemi 0:098463de4c5d 182 for example in config['examples']:
group-onsemi 0:098463de4c5d 183 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 184 name = basename(repo_info['repo'])
group-onsemi 0:098463de4c5d 185 if name in examples:
group-onsemi 0:098463de4c5d 186 if os.path.exists(name):
group-onsemi 0:098463de4c5d 187 print("'%s' example directory already exists. Deleting..." % name)
group-onsemi 0:098463de4c5d 188 rmtree(name)
group-onsemi 0:098463de4c5d 189
group-onsemi 0:098463de4c5d 190 subprocess.call([repo_info['type'], "clone", repo_info['repo']])
group-onsemi 0:098463de4c5d 191
group-onsemi 0:098463de4c5d 192 def deploy_repos(config, examples):
group-onsemi 0:098463de4c5d 193 """ If the example directory exists as provided by the json config file,
group-onsemi 0:098463de4c5d 194 pull in the examples dependencies by using `mbed-cli deploy`.
group-onsemi 0:098463de4c5d 195 Args:
group-onsemi 0:098463de4c5d 196 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 197
group-onsemi 0:098463de4c5d 198 """
group-onsemi 0:098463de4c5d 199 print("\nDeploying example repos....\n")
group-onsemi 0:098463de4c5d 200 for example in config['examples']:
group-onsemi 0:098463de4c5d 201 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 202 name = basename(repo_info['repo'])
group-onsemi 0:098463de4c5d 203 if name in examples:
group-onsemi 0:098463de4c5d 204 if os.path.exists(name):
group-onsemi 0:098463de4c5d 205 os.chdir(name)
group-onsemi 0:098463de4c5d 206 subprocess.call(["mbed-cli", "deploy"])
group-onsemi 0:098463de4c5d 207 os.chdir("..")
group-onsemi 0:098463de4c5d 208 else:
group-onsemi 0:098463de4c5d 209 print("'%s' example directory doesn't exist. Skipping..." % name)
group-onsemi 0:098463de4c5d 210
group-onsemi 0:098463de4c5d 211
group-onsemi 0:098463de4c5d 212 def get_num_failures(results, export=False):
group-onsemi 0:098463de4c5d 213 """ Returns the number of failed compilations from the results summary
group-onsemi 0:098463de4c5d 214 Args:
group-onsemi 0:098463de4c5d 215 results - results summary of the compilation stage. See compile_repos() for
group-onsemi 0:098463de4c5d 216 details of the format.
group-onsemi 0:098463de4c5d 217 num_failures
group-onsemi 0:098463de4c5d 218
group-onsemi 0:098463de4c5d 219 """
group-onsemi 0:098463de4c5d 220 num_failures = 0
group-onsemi 0:098463de4c5d 221
group-onsemi 0:098463de4c5d 222 for key, val in results.iteritems():
group-onsemi 0:098463de4c5d 223 num_failures = num_failures + len(val[3])
group-onsemi 0:098463de4c5d 224 if export:
group-onsemi 0:098463de4c5d 225 num_failures += len(val[4])
group-onsemi 0:098463de4c5d 226
group-onsemi 0:098463de4c5d 227 return num_failures
group-onsemi 0:098463de4c5d 228
group-onsemi 0:098463de4c5d 229 def export_repos(config, ides, targets, examples):
group-onsemi 0:098463de4c5d 230 """Exports and builds combinations of example programs, targets and IDEs.
group-onsemi 0:098463de4c5d 231
group-onsemi 0:098463de4c5d 232 The results are returned in a [key: value] dictionary format:
group-onsemi 0:098463de4c5d 233 Where key = The example name from the json config file
group-onsemi 0:098463de4c5d 234 value = a list containing: pass_status, successes, export failures, build_failures,
group-onsemi 0:098463de4c5d 235 and build_skips
group-onsemi 0:098463de4c5d 236
group-onsemi 0:098463de4c5d 237 where pass_status = The overall pass status for the export of the full
group-onsemi 0:098463de4c5d 238 set of example programs comprising the example suite.
group-onsemi 0:098463de4c5d 239 IE they must build and export) True if all examples pass, false otherwise
group-onsemi 0:098463de4c5d 240 successes = list of examples that exported and built (if possible)
group-onsemi 0:098463de4c5d 241 If the exporter has no build functionality, then it is a pass
group-onsemi 0:098463de4c5d 242 if exported
group-onsemi 0:098463de4c5d 243 export_failures = list of examples that failed to export.
group-onsemi 0:098463de4c5d 244 build_failures = list of examples that failed to build
group-onsemi 0:098463de4c5d 245 build_skips = list of examples that cannot build
group-onsemi 0:098463de4c5d 246
group-onsemi 0:098463de4c5d 247 Both successes and failures contain the example name, target and IDE
group-onsemi 0:098463de4c5d 248
group-onsemi 0:098463de4c5d 249 Args:
group-onsemi 0:098463de4c5d 250 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 251 ides - List of IDES to export to
group-onsemi 0:098463de4c5d 252 """
group-onsemi 0:098463de4c5d 253 results = {}
group-onsemi 0:098463de4c5d 254 valid_examples = Set(examples)
group-onsemi 0:098463de4c5d 255 print("\nExporting example repos....\n")
group-onsemi 0:098463de4c5d 256 for example in config['examples']:
group-onsemi 0:098463de4c5d 257 example_names = [basename(x['repo']) for x in get_repo_list(example)]
group-onsemi 0:098463de4c5d 258 common_examples = valid_examples.intersection(Set(example_names))
group-onsemi 0:098463de4c5d 259 if not common_examples:
group-onsemi 0:098463de4c5d 260 continue
group-onsemi 0:098463de4c5d 261 export_failures = []
group-onsemi 0:098463de4c5d 262 build_failures = []
group-onsemi 0:098463de4c5d 263 build_skips = []
group-onsemi 0:098463de4c5d 264 successes = []
group-onsemi 0:098463de4c5d 265 exported = True
group-onsemi 0:098463de4c5d 266 pass_status = True
group-onsemi 0:098463de4c5d 267 if example['export']:
group-onsemi 0:098463de4c5d 268 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 269 example_project_name = basename(repo_info['repo'])
group-onsemi 0:098463de4c5d 270 os.chdir(example_project_name)
group-onsemi 0:098463de4c5d 271 # Check that the target, IDE, and features combinations are valid and return a
group-onsemi 0:098463de4c5d 272 # list of valid combinations to work through
group-onsemi 0:098463de4c5d 273 for target, ide in target_cross_ide(valid_choices(example['targets'], targets),
group-onsemi 0:098463de4c5d 274 valid_choices(example['exporters'], ides),
group-onsemi 0:098463de4c5d 275 example['features'], example['toolchains']):
group-onsemi 0:098463de4c5d 276 example_name = "{} {} {}".format(example_project_name, target,
group-onsemi 0:098463de4c5d 277 ide)
group-onsemi 0:098463de4c5d 278 def status(message):
group-onsemi 0:098463de4c5d 279 print(message + " %s" % example_name)
group-onsemi 0:098463de4c5d 280 sys.stdout.flush()
group-onsemi 0:098463de4c5d 281
group-onsemi 0:098463de4c5d 282 status("Exporting")
group-onsemi 0:098463de4c5d 283 proc = subprocess.Popen(["mbed-cli", "export", "-i", ide,
group-onsemi 0:098463de4c5d 284 "-m", target])
group-onsemi 0:098463de4c5d 285 proc.wait()
group-onsemi 0:098463de4c5d 286 if proc.returncode:
group-onsemi 0:098463de4c5d 287 export_failures.append(example_name)
group-onsemi 0:098463de4c5d 288 status("FAILURE exporting")
group-onsemi 0:098463de4c5d 289 else:
group-onsemi 0:098463de4c5d 290 status("SUCCESS exporting")
group-onsemi 0:098463de4c5d 291 status("Building")
group-onsemi 0:098463de4c5d 292 try:
group-onsemi 0:098463de4c5d 293 if EXPORTERS[ide].build(example_project_name):
group-onsemi 0:098463de4c5d 294 status("FAILURE building")
group-onsemi 0:098463de4c5d 295 build_failures.append(example_name)
group-onsemi 0:098463de4c5d 296 else:
group-onsemi 0:098463de4c5d 297 status("SUCCESS building")
group-onsemi 0:098463de4c5d 298 successes.append(example_name)
group-onsemi 0:098463de4c5d 299 except TypeError:
group-onsemi 0:098463de4c5d 300 successes.append(example_name)
group-onsemi 0:098463de4c5d 301 build_skips.append(example_name)
group-onsemi 0:098463de4c5d 302 os.chdir("..")
group-onsemi 0:098463de4c5d 303
group-onsemi 0:098463de4c5d 304 if len(build_failures+export_failures) > 0:
group-onsemi 0:098463de4c5d 305 pass_status= False
group-onsemi 0:098463de4c5d 306 else:
group-onsemi 0:098463de4c5d 307 exported = False
group-onsemi 0:098463de4c5d 308
group-onsemi 0:098463de4c5d 309 results[example['name']] = [exported, pass_status, successes,
group-onsemi 0:098463de4c5d 310 export_failures, build_failures, build_skips]
group-onsemi 0:098463de4c5d 311
group-onsemi 0:098463de4c5d 312 return results
group-onsemi 0:098463de4c5d 313
group-onsemi 0:098463de4c5d 314
group-onsemi 0:098463de4c5d 315 def compile_repos(config, toolchains, targets, examples):
group-onsemi 0:098463de4c5d 316 """Compiles combinations of example programs, targets and compile chains.
group-onsemi 0:098463de4c5d 317
group-onsemi 0:098463de4c5d 318 The results are returned in a [key: value] dictionary format:
group-onsemi 0:098463de4c5d 319 Where key = The example name from the json config file
group-onsemi 0:098463de4c5d 320 value = a list containing: pass_status, successes, and failures
group-onsemi 0:098463de4c5d 321
group-onsemi 0:098463de4c5d 322 where pass_status = The overall pass status for the compilation of the full
group-onsemi 0:098463de4c5d 323 set of example programs comprising the example suite.
group-onsemi 0:098463de4c5d 324 True if all examples pass, false otherwise
group-onsemi 0:098463de4c5d 325 successes = list of passing examples.
group-onsemi 0:098463de4c5d 326 failures = list of failing examples.
group-onsemi 0:098463de4c5d 327
group-onsemi 0:098463de4c5d 328 Both successes and failures contain the example name, target and compile chain
group-onsemi 0:098463de4c5d 329
group-onsemi 0:098463de4c5d 330 Args:
group-onsemi 0:098463de4c5d 331 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 332 toolchains - List of toolchains to compile for.
group-onsemi 0:098463de4c5d 333 results - results of the compilation stage.
group-onsemi 0:098463de4c5d 334
group-onsemi 0:098463de4c5d 335 """
group-onsemi 0:098463de4c5d 336 results = {}
group-onsemi 0:098463de4c5d 337 valid_examples = Set(examples)
group-onsemi 0:098463de4c5d 338 print("\nCompiling example repos....\n")
group-onsemi 0:098463de4c5d 339 for example in config['examples']:
group-onsemi 0:098463de4c5d 340 example_names = [basename(x['repo']) for x in get_repo_list(example)]
group-onsemi 0:098463de4c5d 341 common_examples = valid_examples.intersection(Set(example_names))
group-onsemi 0:098463de4c5d 342 if not common_examples:
group-onsemi 0:098463de4c5d 343 continue
group-onsemi 0:098463de4c5d 344 failures = []
group-onsemi 0:098463de4c5d 345 successes = []
group-onsemi 0:098463de4c5d 346 compiled = True
group-onsemi 0:098463de4c5d 347 pass_status = True
group-onsemi 0:098463de4c5d 348 if example['compile']:
group-onsemi 0:098463de4c5d 349 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 350 name = basename(repo_info['repo'])
group-onsemi 0:098463de4c5d 351 os.chdir(name)
group-onsemi 0:098463de4c5d 352
group-onsemi 0:098463de4c5d 353 # Check that the target, toolchain and features combinations are valid and return a
group-onsemi 0:098463de4c5d 354 # list of valid combinations to work through
group-onsemi 0:098463de4c5d 355 for target, toolchain in target_cross_toolchain(valid_choices(example['targets'], targets),
group-onsemi 0:098463de4c5d 356 valid_choices(example['toolchains'], toolchains),
group-onsemi 0:098463de4c5d 357 example['features']):
group-onsemi 0:098463de4c5d 358 print("Compiling %s for %s, %s" % (name, target, toolchain))
group-onsemi 0:098463de4c5d 359 proc = subprocess.Popen(["mbed-cli", "compile", "-t", toolchain,
group-onsemi 0:098463de4c5d 360 "-m", target, "--silent"])
group-onsemi 0:098463de4c5d 361 proc.wait()
group-onsemi 0:098463de4c5d 362 example_summary = "{} {} {}".format(name, target, toolchain)
group-onsemi 0:098463de4c5d 363 if proc.returncode:
group-onsemi 0:098463de4c5d 364 failures.append(example_summary)
group-onsemi 0:098463de4c5d 365 else:
group-onsemi 0:098463de4c5d 366 successes.append(example_summary)
group-onsemi 0:098463de4c5d 367 os.chdir("..")
group-onsemi 0:098463de4c5d 368
group-onsemi 0:098463de4c5d 369 # If there are any compilation failures for the example 'set' then the overall status is fail.
group-onsemi 0:098463de4c5d 370 if len(failures) > 0:
group-onsemi 0:098463de4c5d 371 pass_status = False
group-onsemi 0:098463de4c5d 372 else:
group-onsemi 0:098463de4c5d 373 compiled = False
group-onsemi 0:098463de4c5d 374
group-onsemi 0:098463de4c5d 375 results[example['name']] = [compiled, pass_status, successes, failures]
group-onsemi 0:098463de4c5d 376
group-onsemi 0:098463de4c5d 377 return results
group-onsemi 0:098463de4c5d 378
group-onsemi 0:098463de4c5d 379
group-onsemi 0:098463de4c5d 380 def update_mbedos_version(config, tag, examples):
group-onsemi 0:098463de4c5d 381 """ For each example repo identified in the config json object, update the version of
group-onsemi 0:098463de4c5d 382 mbed-os to that specified by the supplied GitHub tag. This function assumes that each
group-onsemi 0:098463de4c5d 383 example repo has already been cloned.
group-onsemi 0:098463de4c5d 384
group-onsemi 0:098463de4c5d 385 Args:
group-onsemi 0:098463de4c5d 386 config - the json object imported from the file.
group-onsemi 0:098463de4c5d 387 tag - GitHub tag corresponding to a version of mbed-os to upgrade to.
group-onsemi 0:098463de4c5d 388
group-onsemi 0:098463de4c5d 389 """
group-onsemi 0:098463de4c5d 390 print("Updating mbed-os in examples to version %s\n" % tag)
group-onsemi 0:098463de4c5d 391 for example in config['examples']:
group-onsemi 0:098463de4c5d 392 if example['name'] not in examples:
group-onsemi 0:098463de4c5d 393 continue
group-onsemi 0:098463de4c5d 394 for repo_info in get_repo_list(example):
group-onsemi 0:098463de4c5d 395 update_dir = basename(repo_info['repo']) + "/mbed-os"
group-onsemi 0:098463de4c5d 396 print("\nChanging dir to %s\n" % update_dir)
group-onsemi 0:098463de4c5d 397 os.chdir(update_dir)
group-onsemi 0:098463de4c5d 398 subprocess.call(["mbed-cli", "update", tag, "--clean"])
group-onsemi 0:098463de4c5d 399 os.chdir("../..")
group-onsemi 0:098463de4c5d 400