diff options
Diffstat (limited to 'bitbake/lib/bb/parse/ast.py')
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 70a69b8d14..59aa44bee0 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -22,9 +22,11 @@ | |||
| 22 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 22 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 23 | 23 | ||
| 24 | import bb, re, string | 24 | import bb, re, string |
| 25 | from itertools import chain | ||
| 25 | 26 | ||
| 26 | __word__ = re.compile(r"\S+") | 27 | __word__ = re.compile(r"\S+") |
| 27 | __parsed_methods__ = bb.methodpool.get_parsed_dict() | 28 | __parsed_methods__ = bb.methodpool.get_parsed_dict() |
| 29 | _bbversions_re = re.compile(r"\[(?P<from>[0-9]+)-(?P<to>[0-9]+)\]") | ||
| 28 | 30 | ||
| 29 | class StatementGroup(list): | 31 | class StatementGroup(list): |
| 30 | def eval(self, data): | 32 | def eval(self, data): |
| @@ -335,3 +337,115 @@ def finalise(fn, d): | |||
| 335 | 337 | ||
| 336 | bb.event.fire(bb.event.RecipeParsed(fn), d) | 338 | bb.event.fire(bb.event.RecipeParsed(fn), d) |
| 337 | 339 | ||
| 340 | def _create_variants(datastores, names, function): | ||
| 341 | def create_variant(name, orig_d, arg = None): | ||
| 342 | new_d = bb.data.createCopy(orig_d) | ||
| 343 | function(arg or name, new_d) | ||
| 344 | datastores[name] = new_d | ||
| 345 | |||
| 346 | for variant, variant_d in datastores.items(): | ||
| 347 | for name in names: | ||
| 348 | if not variant: | ||
| 349 | # Based on main recipe | ||
| 350 | create_variant(name, variant_d) | ||
| 351 | else: | ||
| 352 | create_variant("%s-%s" % (variant, name), variant_d, name) | ||
| 353 | |||
| 354 | def _expand_versions(versions): | ||
| 355 | def expand_one(version, start, end): | ||
| 356 | for i in xrange(start, end + 1): | ||
| 357 | ver = _bbversions_re.sub(str(i), version, 1) | ||
| 358 | yield ver | ||
| 359 | |||
| 360 | versions = iter(versions) | ||
| 361 | while True: | ||
| 362 | try: | ||
| 363 | version = versions.next() | ||
| 364 | except StopIteration: | ||
| 365 | break | ||
| 366 | |||
| 367 | range_ver = _bbversions_re.search(version) | ||
| 368 | if not range_ver: | ||
| 369 | yield version | ||
| 370 | else: | ||
| 371 | newversions = expand_one(version, int(range_ver.group("from")), | ||
| 372 | int(range_ver.group("to"))) | ||
| 373 | versions = chain(newversions, versions) | ||
| 374 | |||
| 375 | def multi_finalize(fn, d): | ||
| 376 | safe_d = d | ||
| 377 | |||
| 378 | d = bb.data.createCopy(safe_d) | ||
| 379 | try: | ||
| 380 | finalise(fn, d) | ||
| 381 | except bb.parse.SkipPackage: | ||
| 382 | bb.data.setVar("__SKIPPED", True, d) | ||
| 383 | datastores = {"": safe_d} | ||
| 384 | |||
| 385 | versions = (d.getVar("BBVERSIONS", True) or "").split() | ||
| 386 | if versions: | ||
| 387 | pv = orig_pv = d.getVar("PV", True) | ||
| 388 | baseversions = {} | ||
| 389 | |||
| 390 | def verfunc(ver, d, pv_d = None): | ||
| 391 | if pv_d is None: | ||
| 392 | pv_d = d | ||
| 393 | |||
| 394 | overrides = d.getVar("OVERRIDES", True).split(":") | ||
| 395 | pv_d.setVar("PV", ver) | ||
| 396 | overrides.append(ver) | ||
| 397 | bpv = baseversions.get(ver) or orig_pv | ||
| 398 | pv_d.setVar("BPV", bpv) | ||
| 399 | overrides.append(bpv) | ||
| 400 | d.setVar("OVERRIDES", ":".join(overrides)) | ||
| 401 | |||
| 402 | versions = list(_expand_versions(versions)) | ||
| 403 | for pos, version in enumerate(list(versions)): | ||
| 404 | try: | ||
| 405 | pv, bpv = version.split(":", 2) | ||
| 406 | except ValueError: | ||
| 407 | pass | ||
| 408 | else: | ||
| 409 | versions[pos] = pv | ||
| 410 | baseversions[pv] = bpv | ||
| 411 | |||
| 412 | if pv in versions and not baseversions.get(pv): | ||
| 413 | versions.remove(pv) | ||
| 414 | else: | ||
| 415 | pv = versions.pop() | ||
| 416 | |||
| 417 | # This is necessary because our existing main datastore | ||
| 418 | # has already been finalized with the old PV, we need one | ||
| 419 | # that's been finalized with the new PV. | ||
| 420 | d = bb.data.createCopy(safe_d) | ||
| 421 | verfunc(pv, d, safe_d) | ||
| 422 | try: | ||
| 423 | finalise(fn, d) | ||
| 424 | except bb.parse.SkipPackage: | ||
| 425 | bb.data.setVar("__SKIPPED", True, d) | ||
| 426 | |||
| 427 | _create_variants(datastores, versions, verfunc) | ||
| 428 | |||
| 429 | extended = d.getVar("BBCLASSEXTEND", True) or "" | ||
| 430 | if extended: | ||
| 431 | pn = d.getVar("PN", True) | ||
| 432 | def extendfunc(name, d): | ||
| 433 | d.setVar("PN", "%s-%s" % (pn, name)) | ||
| 434 | bb.parse.BBHandler.inherit([name], d) | ||
| 435 | |||
| 436 | safe_d.setVar("BBCLASSEXTEND", extended) | ||
| 437 | _create_variants(datastores, extended.split(), extendfunc) | ||
| 438 | |||
| 439 | for variant, variant_d in datastores.items(): | ||
| 440 | if variant: | ||
| 441 | try: | ||
| 442 | finalise(fn, variant_d) | ||
| 443 | except bb.parse.SkipPackage: | ||
| 444 | bb.data.setVar("__SKIPPED", True, variant_d) | ||
| 445 | |||
| 446 | if len(datastores) > 1: | ||
| 447 | variants = filter(None, datastores.keys()) | ||
| 448 | safe_d.setVar("__VARIANTS", " ".join(variants)) | ||
| 449 | |||
| 450 | datastores[""] = d | ||
| 451 | return datastores | ||
