1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-09 05:29:32 +00:00

package.bbclass: Preserve hard links!

Hard links were not being preserved in the move from the install image
-> package copy.  Again they were being discarded in the package ->
packages-split copy as well.

By preserving the hard links we have the potential to save a ton of rootfs
space.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
This commit is contained in:
Mark Hatle
2011-02-08 21:49:36 -06:00
committed by Richard Purdie
parent 58ae42cbc3
commit 3e6d91ece0
+17 -1
View File
@@ -323,7 +323,8 @@ python perform_packagecopy () {
# Start by package population by taking a copy of the installed
# files to operate on
os.system('rm -rf %s/*' % (dvar))
os.system('cp -pPR %s/* %s/' % (dest, dvar))
# Preserve sparse files and hard links
os.system('tar -cf - -C %s -ps . | tar -xf - -C %s' % (dest, dvar))
}
python populate_packages () {
@@ -383,6 +384,7 @@ python populate_packages () {
filesvar = bb.data.getVar('FILES', localdata, True) or ""
files = filesvar.split()
file_links = {}
for file in files:
if os.path.isabs(file):
file = '.' + file
@@ -406,9 +408,23 @@ python populate_packages () {
bb.mkdirhier(os.path.join(root,file))
os.chmod(os.path.join(root,file), os.stat(file).st_mode)
continue
fpath = os.path.join(root,file)
dpath = os.path.dirname(fpath)
bb.mkdirhier(dpath)
# Check if this is a hardlink to something... if it is
# attempt to preserve the link information, instead of copy.
if not os.path.islink(file):
s = os.stat(file)
if s.st_nlink > 1:
file_reference = "%d_%d" % (s.st_dev, s.st_ino)
if file_reference not in file_links:
# Save the reference for next time...
file_links[file_reference] = fpath
else:
os.link(file_links[file_reference], fpath)
continue
ret = bb.copyfile(file, fpath)
if ret is False or ret == 0:
raise bb.build.FuncFailed("File population failed")