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 8b833d313c..eb06f398ac 100644 --- a/meta/classes/staging.bbclass +++ b/meta/classes/staging.bbclass | |||
| @@ -389,8 +389,6 @@ python extend_recipe_sysroot() { | |||
| 389 | multilibs = {} | 389 | multilibs = {} |
| 390 | manifests = {} | 390 | manifests = {} |
| 391 | 391 | ||
| 392 | installed = [] | ||
| 393 | |||
| 394 | for f in os.listdir(depdir): | 392 | for f in os.listdir(depdir): |
| 395 | if not f.endswith(".complete"): | 393 | if not f.endswith(".complete"): |
| 396 | continue | 394 | continue |
| @@ -402,16 +400,52 @@ python extend_recipe_sysroot() { | |||
| 402 | os.unlink(f) | 400 | os.unlink(f) |
| 403 | os.unlink(f.replace(".complete", "")) | 401 | os.unlink(f.replace(".complete", "")) |
| 404 | 402 | ||
| 403 | installed = [] | ||
| 405 | for dep in configuredeps: | 404 | for dep in configuredeps: |
| 406 | c = setscenedeps[dep][0] | 405 | c = setscenedeps[dep][0] |
| 407 | taskhash = setscenedeps[dep][5] | ||
| 408 | taskmanifest = depdir + "/" + c + "." + taskhash | ||
| 409 | if mytaskname in ["do_sdk_depends", "do_populate_sdk_ext"] and c.endswith("-initial"): | 406 | if mytaskname in ["do_sdk_depends", "do_populate_sdk_ext"] and c.endswith("-initial"): |
| 410 | bb.note("Skipping initial setscene dependency %s for installation into the sysroot" % c) | 407 | bb.note("Skipping initial setscene dependency %s for installation into the sysroot" % c) |
| 411 | continue | 408 | continue |
| 412 | |||
| 413 | installed.append(c) | 409 | installed.append(c) |
| 414 | 410 | ||
| 411 | # We want to remove anything which this task previously installed but is no longer a dependency | ||
| 412 | taskindex = depdir + "/" + "index." + mytaskname | ||
| 413 | if os.path.exists(taskindex): | ||
| 414 | potential = [] | ||
| 415 | with open(taskindex, "r") as f: | ||
| 416 | for l in f: | ||
| 417 | l = l.strip() | ||
| 418 | if l not in installed: | ||
| 419 | l = depdir + "/" + l | ||
| 420 | if not os.path.exists(l): | ||
| 421 | # Was likely already uninstalled | ||
| 422 | continue | ||
| 423 | potential.append(l) | ||
| 424 | # We need to ensure not other task needs this dependency. We hold the sysroot | ||
| 425 | # lock so we ca search the indexes to check | ||
| 426 | if potential: | ||
| 427 | for i in glob.glob(depdir + "/index.*"): | ||
| 428 | if i.endswith("." + mytaskname): | ||
| 429 | continue | ||
| 430 | with open(i, "r") as f: | ||
| 431 | for l in f: | ||
| 432 | l = l.strip() | ||
| 433 | if l in potential: | ||
| 434 | potential.remove(l) | ||
| 435 | for l in potential: | ||
| 436 | bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) | ||
| 437 | lnk = os.readlink(l) | ||
| 438 | sstate_clean_manifest(depdir + "/" + lnk, d, workdir) | ||
| 439 | os.unlink(l) | ||
| 440 | os.unlink(l + ".complete") | ||
| 441 | |||
| 442 | for dep in configuredeps: | ||
| 443 | c = setscenedeps[dep][0] | ||
| 444 | if c not in installed: | ||
| 445 | continue | ||
| 446 | taskhash = setscenedeps[dep][5] | ||
| 447 | taskmanifest = depdir + "/" + c + "." + taskhash | ||
| 448 | |||
| 415 | if os.path.exists(depdir + "/" + c): | 449 | if os.path.exists(depdir + "/" + c): |
| 416 | lnk = os.readlink(depdir + "/" + c) | 450 | lnk = os.readlink(depdir + "/" + c) |
| 417 | if lnk == c + "." + taskhash and os.path.exists(depdir + "/" + c + ".complete"): | 451 | if lnk == c + "." + taskhash and os.path.exists(depdir + "/" + c + ".complete"): |
| @@ -526,39 +560,6 @@ python extend_recipe_sysroot() { | |||
| 526 | c = setscenedeps[dep][0] | 560 | c = setscenedeps[dep][0] |
| 527 | os.symlink(manifests[dep], depdir + "/" + c + ".complete") | 561 | os.symlink(manifests[dep], depdir + "/" + c + ".complete") |
| 528 | 562 | ||
| 529 | # We want to remove anything which this task previously installed but is no longer a dependency | ||
| 530 | # This could potentially race against another task which also installed it but still requires it | ||
| 531 | # but the alternative is not doing anything at all and that race window should be small enough | ||
| 532 | # to be insignificant | ||
| 533 | taskindex = depdir + "/" + "index." + mytaskname | ||
| 534 | if os.path.exists(taskindex): | ||
| 535 | potential = [] | ||
| 536 | with open(taskindex, "r") as f: | ||
| 537 | for l in f: | ||
| 538 | l = l.strip() | ||
| 539 | if l not in installed: | ||
| 540 | l = depdir + "/" + l | ||
| 541 | if not os.path.exists(l): | ||
| 542 | # Was likely already uninstalled | ||
| 543 | continue | ||
| 544 | potential.append(l) | ||
| 545 | # We need to ensure not other task needs this dependency. We hold the sysroot | ||
| 546 | # lock so we ca search the indexes to check | ||
| 547 | if potential: | ||
| 548 | for i in glob.glob(depdir + "/index.*"): | ||
| 549 | if i.endswith("." + mytaskname): | ||
| 550 | continue | ||
| 551 | with open(i, "r") as f: | ||
| 552 | for l in f: | ||
| 553 | l = l.strip() | ||
| 554 | if l in potential: | ||
| 555 | potential.remove(l) | ||
| 556 | for l in potential: | ||
| 557 | bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) | ||
| 558 | lnk = os.readlink(l) | ||
| 559 | sstate_clean_manifest(depdir + "/" + lnk, d, workdir) | ||
| 560 | os.unlink(l) | ||
| 561 | os.unlink(l + ".complete") | ||
| 562 | with open(taskindex, "w") as f: | 563 | with open(taskindex, "w") as f: |
| 563 | for l in sorted(installed): | 564 | for l in sorted(installed): |
| 564 | f.write(l + "\n") | 565 | f.write(l + "\n") |
