summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Tretter <m.tretter@pengutronix.de>2020-09-01 15:29:00 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-09-10 19:07:40 +0100
commitdfd88e61b2495dec2dda4f6678c0510f5f91682c (patch)
tree0ca3891dd99f9354991161f545146d267fd26541
parent936d5e0aa53b8b265eca75dd5f257803166bbf49 (diff)
downloadpoky-dfd88e61b2495dec2dda4f6678c0510f5f91682c.tar.gz
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: 85b1e835572d184cfff86a87fced8673d1d40a7c) Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit 17e92572278980d1a7f06de9d72c68baf57698f1) Signed-off-by: Steve Sakoman <steve@sakoman.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--scripts/lib/devtool/deploy.py8
1 files changed, 7 insertions, 1 deletions
diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
index 6a997735fc..aaa25dda08 100644
--- a/scripts/lib/devtool/deploy.py
+++ b/scripts/lib/devtool/deploy.py
@@ -177,13 +177,19 @@ def deploy(args, config, basepath, workspace):
177 rd.getVar('base_libdir'), rd) 177 rd.getVar('base_libdir'), rd)
178 178
179 filelist = [] 179 filelist = []
180 inodes = set({})
180 ftotalsize = 0 181 ftotalsize = 0
181 for root, _, files in os.walk(recipe_outdir): 182 for root, _, files in os.walk(recipe_outdir):
182 for fn in files: 183 for fn in files:
184 fstat = os.lstat(os.path.join(root, fn))
183 # Get the size in kiB (since we'll be comparing it to the output of du -k) 185 # Get the size in kiB (since we'll be comparing it to the output of du -k)
184 # MUST use lstat() here not stat() or getfilesize() since we don't want to 186 # MUST use lstat() here not stat() or getfilesize() since we don't want to
185 # dereference symlinks 187 # dereference symlinks
186 fsize = int(math.ceil(float(os.lstat(os.path.join(root, fn)).st_size)/1024)) 188 if fstat.st_ino in inodes:
189 fsize = 0
190 else:
191 fsize = int(math.ceil(float(fstat.st_size)/1024))
192 inodes.add(fstat.st_ino)
187 ftotalsize += fsize 193 ftotalsize += fsize
188 # The path as it would appear on the target 194 # The path as it would appear on the target
189 fpath = os.path.join(destdir, os.path.relpath(root, recipe_outdir), fn) 195 fpath = os.path.join(destdir, os.path.relpath(root, recipe_outdir), fn)