diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-02-04 17:33:27 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-02-07 14:47:21 +0000 |
commit | 51834006476786f847b3ca60d5ed83a952fc64cb (patch) | |
tree | 15e50bda2b7553ce9c5aab0a2375ee7fc02eea10 | |
parent | 9792ba51c5caf56d182f1290df41f2a89b85f744 (diff) | |
download | openembedded-core-51834006476786f847b3ca60d5ed83a952fc64cb.tar.gz openembedded-core-51834006476786f847b3ca60d5ed83a952fc64cb.tar.bz2 openembedded-core-51834006476786f847b3ca60d5ed83a952fc64cb.zip |
staging: Add shared manifest support
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-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() { bb.note("\n".join(msgbuf)) stagingdir = d.getVar("STAGING_DIR") + sharedmanifests = stagingdir + "-components/manifests" recipesysroot = d.getVar("RECIPE_SYSROOT") recipesysrootnative = d.getVar("RECIPE_SYSROOT_NATIVE") current_variant = d.getVar("BBEXTENDVARIANT") @@ -493,6 +494,7 @@ python extend_recipe_sysroot() { depdir = recipesysrootnative + "/installeddeps" bb.utils.mkdirhier(depdir) + bb.utils.mkdirhier(sharedmanifests) lock = bb.utils.lockfile(recipesysroot + "/sysroot.lock") @@ -588,6 +590,27 @@ python extend_recipe_sysroot() { dest = staging_copyfile(l, destsysroot, fixme[''], postinsts, stagingdir, seendirs) if dest: m.write(dest.replace(workdir + "/", "") + "\n") + # Having multiple identical manifests in each sysroot eats diskspace so + # create a shared pool of them. + sharedm = sharedmanifests + "/" + os.path.basename(taskmanifest) + if not os.path.exists(sharedm): + smlock = bb.utils.lockfile(sharedm + ".lock") + # Can race here. You'd think it just means we may not end up with all copies hardlinked to each other + # but python can lose file handles so we need to do this under a lock. + try: + if not os.path.exists(sharedm): + os.rename(taskmanifest, sharedm) + except OSError: + pass + bb.utils.unlockfile(smlock) + if os.path.exists(sharedm): + # If we're crossing mount points we'll not reach here. + if os.path.exists(taskmanifest): + if os.path.getsize(sharedm) != os.path.getsize(taskmanifest): + # Order of entries can differ, overall size shouldn't + raise Exception("Manifests %s and %s differ in size and shouldn't?" % (sharedm, taskmanifest)) + os.unlink(taskmanifest) + os.link(sharedm, taskmanifest) for f in fixme: if f == '': |