aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-27 09:21:10 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-27 22:29:45 +0100
commitadd4f107c151d32d9ea914bb0b93c3d3c17c776c (patch)
treef9bdc7b0e34c1c0894c83942c32c3e036133d143
parentff3617cc2cd5618f48a25aa4e3b2014430fcbe23 (diff)
downloadopenembedded-core-contrib-add4f107c151d32d9ea914bb0b93c3d3c17c776c.tar.gz
staging: Ensure dependencies are removed before being added
Currently items are added to the sysroot, the obsolete items are removed. If a change such as pkgconfig -> pkgconf is made, this leads to conflicts of overlapping files in the sysroot. In order to better support this, handle removing items before adding them. This requires some minor refactoring to construct the installed list before the main function loop, otherwise there are no changes in this patch other than reordering the operations. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/staging.bbclass77
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() {
multilibs = {}
manifests = {}
- installed = []
-
for f in os.listdir(depdir):
if not f.endswith(".complete"):
continue
@@ -402,16 +400,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"):
@@ -526,39 +560,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")