diff options
Diffstat (limited to 'meta/classes')
-rw-r--r-- | meta/classes/staging.bbclass | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass index b92bdaf490..bd798ba9bc 100644 --- a/meta/classes/staging.bbclass +++ b/meta/classes/staging.bbclass | |||
@@ -479,6 +479,7 @@ python extend_recipe_sysroot() { | |||
479 | bb.note("\n".join(msgbuf)) | 479 | bb.note("\n".join(msgbuf)) |
480 | 480 | ||
481 | stagingdir = d.getVar("STAGING_DIR") | 481 | stagingdir = d.getVar("STAGING_DIR") |
482 | sharedmanifests = stagingdir + "-components/manifests" | ||
482 | recipesysroot = d.getVar("RECIPE_SYSROOT") | 483 | recipesysroot = d.getVar("RECIPE_SYSROOT") |
483 | recipesysrootnative = d.getVar("RECIPE_SYSROOT_NATIVE") | 484 | recipesysrootnative = d.getVar("RECIPE_SYSROOT_NATIVE") |
484 | current_variant = d.getVar("BBEXTENDVARIANT") | 485 | current_variant = d.getVar("BBEXTENDVARIANT") |
@@ -493,6 +494,7 @@ python extend_recipe_sysroot() { | |||
493 | 494 | ||
494 | depdir = recipesysrootnative + "/installeddeps" | 495 | depdir = recipesysrootnative + "/installeddeps" |
495 | bb.utils.mkdirhier(depdir) | 496 | bb.utils.mkdirhier(depdir) |
497 | bb.utils.mkdirhier(sharedmanifests) | ||
496 | 498 | ||
497 | lock = bb.utils.lockfile(recipesysroot + "/sysroot.lock") | 499 | lock = bb.utils.lockfile(recipesysroot + "/sysroot.lock") |
498 | 500 | ||
@@ -588,6 +590,27 @@ python extend_recipe_sysroot() { | |||
588 | dest = staging_copyfile(l, destsysroot, fixme[''], postinsts, stagingdir, seendirs) | 590 | dest = staging_copyfile(l, destsysroot, fixme[''], postinsts, stagingdir, seendirs) |
589 | if dest: | 591 | if dest: |
590 | m.write(dest.replace(workdir + "/", "") + "\n") | 592 | m.write(dest.replace(workdir + "/", "") + "\n") |
593 | # Having multiple identical manifests in each sysroot eats diskspace so | ||
594 | # create a shared pool of them. | ||
595 | sharedm = sharedmanifests + "/" + os.path.basename(taskmanifest) | ||
596 | if not os.path.exists(sharedm): | ||
597 | smlock = bb.utils.lockfile(sharedm + ".lock") | ||
598 | # Can race here. You'd think it just means we may not end up with all copies hardlinked to each other | ||
599 | # but python can lose file handles so we need to do this under a lock. | ||
600 | try: | ||
601 | if not os.path.exists(sharedm): | ||
602 | os.rename(taskmanifest, sharedm) | ||
603 | except OSError: | ||
604 | pass | ||
605 | bb.utils.unlockfile(smlock) | ||
606 | if os.path.exists(sharedm): | ||
607 | # If we're crossing mount points we'll not reach here. | ||
608 | if os.path.exists(taskmanifest): | ||
609 | if os.path.getsize(sharedm) != os.path.getsize(taskmanifest): | ||
610 | # Order of entries can differ, overall size shouldn't | ||
611 | raise Exception("Manifests %s and %s differ in size and shouldn't?" % (sharedm, taskmanifest)) | ||
612 | os.unlink(taskmanifest) | ||
613 | os.link(sharedm, taskmanifest) | ||
591 | 614 | ||
592 | for f in fixme: | 615 | for f in fixme: |
593 | if f == '': | 616 | if f == '': |