summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-05-16 11:12:18 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-05-16 23:19:18 +0100
commit2962cd877b7629b0be2962505796f5e60c31578e (patch)
treea35f2ecac2e3bf70616ec0f642d4193084d8c201
parentb8b3413a9c9898291005b17f13a02e37b0c4c758 (diff)
downloadpoky-2962cd877b7629b0be2962505796f5e60c31578e.tar.gz
staging: Fix rare sysroot corruption issue
We've seen failures on the autobuilder in oe-selftest where things which should be in the sysroot aren't. The exact steps to reproduce the exact failure are elusive and probably hash equivalance dependency but this set of steps does reproduce corruption which is probably of the same origin: Add DISTRO_FEATURES += "systemd" bitbake dbus Remove DISTRO_FEATURES += "systemd" bitbake dbus bitbake dbus -c clean bitbake dbus -c configure Add DISTRO_FEATURES += "systemd" bitbake quilt-native bitbake dbus -c populate_sysroot Remove DISTRO_FEATURES += "systemd" bitbake dbus -c compile Where dbus will now fail as the compiler was no longer in the sysroot. This works by clearing x11 and other values out of DISTRO_FEATURES so the x11 dependencies are removed from the sysroot. The configure stamp remains valid so when the original configuration is restored, it becomes valid again but a load of the sysroot disappeared and build failures result. Fix this by removing stamps when we remove things from the sysroot. Depends on a change to bitbake build.py to add the clean_stamp API. [YOCTO #14790] (From OE-Core rev: f4b1cecc82435b71135d7b65f6ea67be0e4f8c66) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/staging.bbclass24
1 files changed, 24 insertions, 0 deletions
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass
index 9fc8f4f283..8372a4574a 100644
--- a/meta/classes/staging.bbclass
+++ b/meta/classes/staging.bbclass
@@ -404,7 +404,9 @@ python extend_recipe_sysroot() {
404 # All files that we're going to be installing, to find conflicts. 404 # All files that we're going to be installing, to find conflicts.
405 fileset = {} 405 fileset = {}
406 406
407 invalidate_tasks = set()
407 for f in os.listdir(depdir): 408 for f in os.listdir(depdir):
409 removed = []
408 if not f.endswith(".complete"): 410 if not f.endswith(".complete"):
409 continue 411 continue
410 f = depdir + "/" + f 412 f = depdir + "/" + f
@@ -414,6 +416,28 @@ python extend_recipe_sysroot() {
414 sstate_clean_manifest(depdir + "/" + lnk, d, canrace=True, prefix=workdir) 416 sstate_clean_manifest(depdir + "/" + lnk, d, canrace=True, prefix=workdir)
415 os.unlink(f) 417 os.unlink(f)
416 os.unlink(f.replace(".complete", "")) 418 os.unlink(f.replace(".complete", ""))
419 removed.append(os.path.basename(f.replace(".complete", "")))
420
421 # If we've removed files from the sysroot above, the task that installed them may still
422 # have a stamp file present for the task. This is probably invalid right now but may become
423 # valid again if the user were to change configuration back for example. Since we've removed
424 # the files a task might need, remove the stamp file too to force it to rerun.
425 # YOCTO #14790
426 if removed:
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 if l.startswith("TaskDeps:"):
433 continue
434 l = l.strip()
435 if l in removed:
436 invalidate_tasks.add(i.rsplit(".", 1)[1])
437 break
438 for t in invalidate_tasks:
439 bb.note("Invalidating stamps for task %s" % t)
440 bb.build.clean_stamp(t, d)
417 441
418 installed = [] 442 installed = []
419 for dep in configuredeps: 443 for dep in configuredeps: