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() { multilibs = {} manifests = {} - installed = [] - for f in os.listdir(depdir): if not f.endswith(".complete"): continue @@ -483,16 +481,52 @@ python extend_recipe_sysroot() { os.unlink(f) os.unlink(f.replace(".complete", "")) + installed = [] for dep in configuredeps: c = setscenedeps[dep][0] - taskhash = setscenedeps[dep][5] - taskmanifest = depdir + "/" + c + "." + taskhash if mytaskname in ["do_sdk_depends", "do_populate_sdk_ext"] and c.endswith("-initial"): bb.note("Skipping initial setscene dependency %s for installation into the sysroot" % c) continue - installed.append(c) + # We want to remove anything which this task previously installed but is no longer a dependency + taskindex = depdir + "/" + "index." + mytaskname + if os.path.exists(taskindex): + potential = [] + with open(taskindex, "r") as f: + for l in f: + l = l.strip() + if l not in installed: + l = depdir + "/" + l + if not os.path.exists(l): + # Was likely already uninstalled + continue + potential.append(l) + # We need to ensure not other task needs this dependency. We hold the sysroot + # lock so we ca search the indexes to check + if potential: + for i in glob.glob(depdir + "/index.*"): + if i.endswith("." + mytaskname): + continue + with open(i, "r") as f: + for l in f: + l = l.strip() + if l in potential: + potential.remove(l) + for l in potential: + bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) + lnk = os.readlink(l) + sstate_clean_manifest(depdir + "/" + lnk, d, workdir) + os.unlink(l) + os.unlink(l + ".complete") + + for dep in configuredeps: + c = setscenedeps[dep][0] + if c not in installed: + continue + taskhash = setscenedeps[dep][5] + taskmanifest = depdir + "/" + c + "." + taskhash + if os.path.exists(depdir + "/" + c): lnk = os.readlink(depdir + "/" + c) if lnk == c + "." + taskhash and os.path.exists(depdir + "/" + c + ".complete"): @@ -607,39 +641,6 @@ python extend_recipe_sysroot() { c = setscenedeps[dep][0] os.symlink(manifests[dep], depdir + "/" + c + ".complete") - # We want to remove anything which this task previously installed but is no longer a dependency - # This could potentially race against another task which also installed it but still requires it - # but the alternative is not doing anything at all and that race window should be small enough - # to be insignificant - taskindex = depdir + "/" + "index." + mytaskname - if os.path.exists(taskindex): - potential = [] - with open(taskindex, "r") as f: - for l in f: - l = l.strip() - if l not in installed: - l = depdir + "/" + l - if not os.path.exists(l): - # Was likely already uninstalled - continue - potential.append(l) - # We need to ensure not other task needs this dependency. We hold the sysroot - # lock so we ca search the indexes to check - if potential: - for i in glob.glob(depdir + "/index.*"): - if i.endswith("." + mytaskname): - continue - with open(i, "r") as f: - for l in f: - l = l.strip() - if l in potential: - potential.remove(l) - for l in potential: - bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) - lnk = os.readlink(l) - sstate_clean_manifest(depdir + "/" + lnk, d, workdir) - os.unlink(l) - os.unlink(l + ".complete") with open(taskindex, "w") as f: for l in sorted(installed): f.write(l + "\n")