path: root/scripts
diff options
authorMichael Tretter <>2020-09-01 15:29:00 +0200
committerRichard Purdie <>2020-09-02 16:00:46 +0100
commitfdc6ef9673c5b65e82267220ac38d60f43c213ed (patch)
tree3c6f8dd865208cd2d750d135f78b03b5a872bb44 /scripts
parent0033cc5c10cbdb7850c96f42e02ef12f55dbc575 (diff)
devtool: deploy-target: Fix size calculation for hard links
If a package contains hard links to a file, the file size is added for each hard link instead of once for the file. Therefore, the calculated size may be much larger than the actual package size. For example, the mesa-megadriver package contains several hard links to the same library. Keep track of the inode numbers when listing the files that are installed and use the actual size only for the first occurrence of an inode. All further hard links to the same inode are added to the file list, but accounted with size 0. All file names need to be added to the file list, because the list is used for preserving the files/hard links on the target. (From OE-Core rev: 17e92572278980d1a7f06de9d72c68baf57698f1) Signed-off-by: Michael Tretter <> Signed-off-by: Richard Purdie <>
Diffstat (limited to 'scripts')
1 files changed, 7 insertions, 1 deletions
diff --git a/scripts/lib/devtool/ b/scripts/lib/devtool/
index b1749ce672..e5af2c95ae 100644
--- a/scripts/lib/devtool/
+++ b/scripts/lib/devtool/
@@ -177,13 +177,19 @@ def deploy(args, config, basepath, workspace):
rd.getVar('base_libdir'), rd)
filelist = []
+ inodes = set({})
ftotalsize = 0
for root, _, files in os.walk(recipe_outdir):
for fn in files:
+ fstat = os.lstat(os.path.join(root, fn))
# Get the size in kiB (since we'll be comparing it to the output of du -k)
# MUST use lstat() here not stat() or getfilesize() since we don't want to
# dereference symlinks
- fsize = int(math.ceil(float(os.lstat(os.path.join(root, fn)).st_size)/1024))
+ if fstat.st_ino in inodes:
+ fsize = 0
+ else:
+ fsize = int(math.ceil(float(fstat.st_size)/1024))
+ inodes.add(fstat.st_ino)
ftotalsize += fsize
# The path as it would appear on the target
fpath = os.path.join(destdir, os.path.relpath(root, recipe_outdir), fn)