diff options
| -rw-r--r-- | meta/classes/staging.bbclass | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass index 590be61a62..286d7b7e9e 100644 --- a/meta/classes/staging.bbclass +++ b/meta/classes/staging.bbclass | |||
| @@ -470,8 +470,6 @@ python extend_recipe_sysroot() { | |||
| 470 | multilibs = {} | 470 | multilibs = {} |
| 471 | manifests = {} | 471 | manifests = {} |
| 472 | 472 | ||
| 473 | installed = [] | ||
| 474 | |||
| 475 | for f in os.listdir(depdir): | 473 | for f in os.listdir(depdir): |
| 476 | if not f.endswith(".complete"): | 474 | if not f.endswith(".complete"): |
| 477 | continue | 475 | continue |
| @@ -483,16 +481,52 @@ python extend_recipe_sysroot() { | |||
| 483 | os.unlink(f) | 481 | os.unlink(f) |
| 484 | os.unlink(f.replace(".complete", "")) | 482 | os.unlink(f.replace(".complete", "")) |
| 485 | 483 | ||
| 484 | installed = [] | ||
| 486 | for dep in configuredeps: | 485 | for dep in configuredeps: |
| 487 | c = setscenedeps[dep][0] | 486 | c = setscenedeps[dep][0] |
| 488 | taskhash = setscenedeps[dep][5] | ||
| 489 | taskmanifest = depdir + "/" + c + "." + taskhash | ||
| 490 | if mytaskname in ["do_sdk_depends", "do_populate_sdk_ext"] and c.endswith("-initial"): | 487 | if mytaskname in ["do_sdk_depends", "do_populate_sdk_ext"] and c.endswith("-initial"): |
| 491 | bb.note("Skipping initial setscene dependency %s for installation into the sysroot" % c) | 488 | bb.note("Skipping initial setscene dependency %s for installation into the sysroot" % c) |
| 492 | continue | 489 | continue |
| 493 | |||
| 494 | installed.append(c) | 490 | installed.append(c) |
| 495 | 491 | ||
| 492 | # We want to remove anything which this task previously installed but is no longer a dependency | ||
| 493 | taskindex = depdir + "/" + "index." + mytaskname | ||
| 494 | if os.path.exists(taskindex): | ||
| 495 | potential = [] | ||
| 496 | with open(taskindex, "r") as f: | ||
| 497 | for l in f: | ||
| 498 | l = l.strip() | ||
| 499 | if l not in installed: | ||
| 500 | l = depdir + "/" + l | ||
| 501 | if not os.path.exists(l): | ||
| 502 | # Was likely already uninstalled | ||
| 503 | continue | ||
| 504 | potential.append(l) | ||
| 505 | # We need to ensure not other task needs this dependency. We hold the sysroot | ||
| 506 | # lock so we ca search the indexes to check | ||
| 507 | if potential: | ||
| 508 | for i in glob.glob(depdir + "/index.*"): | ||
| 509 | if i.endswith("." + mytaskname): | ||
| 510 | continue | ||
| 511 | with open(i, "r") as f: | ||
| 512 | for l in f: | ||
| 513 | l = l.strip() | ||
| 514 | if l in potential: | ||
| 515 | potential.remove(l) | ||
| 516 | for l in potential: | ||
| 517 | bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) | ||
| 518 | lnk = os.readlink(l) | ||
| 519 | sstate_clean_manifest(depdir + "/" + lnk, d, workdir) | ||
| 520 | os.unlink(l) | ||
| 521 | os.unlink(l + ".complete") | ||
| 522 | |||
| 523 | for dep in configuredeps: | ||
| 524 | c = setscenedeps[dep][0] | ||
| 525 | if c not in installed: | ||
| 526 | continue | ||
| 527 | taskhash = setscenedeps[dep][5] | ||
| 528 | taskmanifest = depdir + "/" + c + "." + taskhash | ||
| 529 | |||
| 496 | if os.path.exists(depdir + "/" + c): | 530 | if os.path.exists(depdir + "/" + c): |
| 497 | lnk = os.readlink(depdir + "/" + c) | 531 | lnk = os.readlink(depdir + "/" + c) |
| 498 | if lnk == c + "." + taskhash and os.path.exists(depdir + "/" + c + ".complete"): | 532 | if lnk == c + "." + taskhash and os.path.exists(depdir + "/" + c + ".complete"): |
| @@ -607,39 +641,6 @@ python extend_recipe_sysroot() { | |||
| 607 | c = setscenedeps[dep][0] | 641 | c = setscenedeps[dep][0] |
| 608 | os.symlink(manifests[dep], depdir + "/" + c + ".complete") | 642 | os.symlink(manifests[dep], depdir + "/" + c + ".complete") |
| 609 | 643 | ||
| 610 | # We want to remove anything which this task previously installed but is no longer a dependency | ||
| 611 | # This could potentially race against another task which also installed it but still requires it | ||
| 612 | # but the alternative is not doing anything at all and that race window should be small enough | ||
| 613 | # to be insignificant | ||
| 614 | taskindex = depdir + "/" + "index." + mytaskname | ||
| 615 | if os.path.exists(taskindex): | ||
| 616 | potential = [] | ||
| 617 | with open(taskindex, "r") as f: | ||
| 618 | for l in f: | ||
| 619 | l = l.strip() | ||
| 620 | if l not in installed: | ||
| 621 | l = depdir + "/" + l | ||
| 622 | if not os.path.exists(l): | ||
| 623 | # Was likely already uninstalled | ||
| 624 | continue | ||
| 625 | potential.append(l) | ||
| 626 | # We need to ensure not other task needs this dependency. We hold the sysroot | ||
| 627 | # lock so we ca search the indexes to check | ||
| 628 | if potential: | ||
| 629 | for i in glob.glob(depdir + "/index.*"): | ||
| 630 | if i.endswith("." + mytaskname): | ||
| 631 | continue | ||
| 632 | with open(i, "r") as f: | ||
| 633 | for l in f: | ||
| 634 | l = l.strip() | ||
| 635 | if l in potential: | ||
| 636 | potential.remove(l) | ||
| 637 | for l in potential: | ||
| 638 | bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) | ||
| 639 | lnk = os.readlink(l) | ||
| 640 | sstate_clean_manifest(depdir + "/" + lnk, d, workdir) | ||
| 641 | os.unlink(l) | ||
| 642 | os.unlink(l + ".complete") | ||
| 643 | with open(taskindex, "w") as f: | 644 | with open(taskindex, "w") as f: |
| 644 | for l in sorted(installed): | 645 | for l in sorted(installed): |
| 645 | f.write(l + "\n") | 646 | f.write(l + "\n") |
