staging: Avoid sysroot removal races
Currently a task could remove a dependency needed by another task leading to build failures, often due to missing dependencies (e.g. dynamic libraries not being found). This was often seen for all-arch recipes in package_write_rpm. When removing a dependency, first check that no other task active for the recipe has that same dependency. (From OE-Core rev: ff3617cc2cd5618f48a25aa4e3b2014430fcbe23) (From OE-Core rev: 67438ac91a40429affc952ad1d7e92c763f52bab) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit 3de078642925e720c2fca5b89cd3abb8b29d2439) Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
54efca180b
commit
292cb6a32f
|
@ -328,6 +328,7 @@ python extend_recipe_sysroot() {
|
||||||
import subprocess
|
import subprocess
|
||||||
import errno
|
import errno
|
||||||
import collections
|
import collections
|
||||||
|
import glob
|
||||||
|
|
||||||
taskdepdata = d.getVar("BB_TASKDEPDATA", False)
|
taskdepdata = d.getVar("BB_TASKDEPDATA", False)
|
||||||
mytaskname = d.getVar("BB_RUNTASK")
|
mytaskname = d.getVar("BB_RUNTASK")
|
||||||
|
@ -612,6 +613,7 @@ python extend_recipe_sysroot() {
|
||||||
# to be insignificant
|
# to be insignificant
|
||||||
taskindex = depdir + "/" + "index." + mytaskname
|
taskindex = depdir + "/" + "index." + mytaskname
|
||||||
if os.path.exists(taskindex):
|
if os.path.exists(taskindex):
|
||||||
|
potential = []
|
||||||
with open(taskindex, "r") as f:
|
with open(taskindex, "r") as f:
|
||||||
for l in f:
|
for l in f:
|
||||||
l = l.strip()
|
l = l.strip()
|
||||||
|
@ -620,11 +622,24 @@ python extend_recipe_sysroot() {
|
||||||
if not os.path.exists(l):
|
if not os.path.exists(l):
|
||||||
# Was likely already uninstalled
|
# Was likely already uninstalled
|
||||||
continue
|
continue
|
||||||
bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l))
|
potential.append(l)
|
||||||
lnk = os.readlink(l)
|
# We need to ensure not other task needs this dependency. We hold the sysroot
|
||||||
sstate_clean_manifest(depdir + "/" + lnk, d, workdir)
|
# lock so we ca search the indexes to check
|
||||||
os.unlink(l)
|
if potential:
|
||||||
os.unlink(l + ".complete")
|
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:
|
with open(taskindex, "w") as f:
|
||||||
for l in sorted(installed):
|
for l in sorted(installed):
|
||||||
f.write(l + "\n")
|
f.write(l + "\n")
|
||||||
|
|
Loading…
Reference in New Issue