@@ -1065,6 +1065,7 @@ def process_split_and_strip_files(d):
d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT') != '1'):
checkelf = {}
checkelflinks = {}
+ checkstatic = {}
for root, dirs, files in cpath.walk(dvar):
for f in files:
file = os.path.join(root, f)
@@ -1078,10 +1079,6 @@ def process_split_and_strip_files(d):
if file in skipfiles:
continue
- if oe.package.is_static_lib(file):
- staticlibs.append(file)
- continue
-
try:
ltarget = cpath.realpath(file, dvar, False)
s = cpath.lstat(ltarget)
@@ -1093,6 +1090,13 @@ def process_split_and_strip_files(d):
continue
if not s:
continue
+
+ if oe.package.is_static_lib(file):
+ # Use a reference of device ID and inode number to identify files
+ file_reference = "%d_%d" % (s.st_dev, s.st_ino)
+ checkstatic[file] = (file, file_reference)
+ continue
+
# Check its an executable
if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) \
or (s[stat.ST_MODE] & stat.S_IXOTH) \
@@ -1157,6 +1161,27 @@ def process_split_and_strip_files(d):
# Modified the file so clear the cache
cpath.updatecache(file)
+ # Do the same hardlink processing as above, but for static libraries
+ results = list(checkstatic.keys())
+
+ # As above, sort the results.
+ results.sort(key=lambda x: x[0])
+
+ for file in results:
+ # Use a reference of device ID and inode number to identify files
+ file_reference = checkstatic[file][1]
+ if file_reference in inodes:
+ os.unlink(file)
+ os.link(inodes[file_reference][0], file)
+ inodes[file_reference].append(file)
+ else:
+ inodes[file_reference] = [file]
+ # break hardlink
+ bb.utils.break_hardlinks(file)
+ staticlibs.append(file)
+ # Modified the file so clear the cache
+ cpath.updatecache(file)
+
def strip_pkgd_prefix(f):
nonlocal dvar
@@ -1195,11 +1220,24 @@ def process_split_and_strip_files(d):
dest = dv["libdir"] + os.path.dirname(src) + dv["dir"] + "/" + os.path.basename(target) + dv["append"]
fpath = dvar + dest
ftarget = dvar + dv["libdir"] + os.path.dirname(target) + dv["dir"] + "/" + os.path.basename(target) + dv["append"]
- bb.utils.mkdirhier(os.path.dirname(fpath))
- # Only one hardlink of separated debug info file in each directory
- if not os.access(fpath, os.R_OK):
- #bb.note("Link %s -> %s" % (fpath, ftarget))
- os.link(ftarget, fpath)
+ if os.access(ftarget, os.R_OK):
+ bb.utils.mkdirhier(os.path.dirname(fpath))
+ # Only one hardlink of separated debug info file in each directory
+ if not os.access(fpath, os.R_OK):
+ #bb.note("Link %s -> %s" % (fpath, ftarget))
+ os.link(ftarget, fpath)
+ elif (d.getVar('PACKAGE_DEBUG_STATIC_SPLIT') == '1'):
+ deststatic = dv["staticlibdir"] + os.path.dirname(src) + dv["staticdir"] + "/" + os.path.basename(file) + dv["staticappend"]
+ fpath = dvar + deststatic
+ ftarget = dvar + dv["staticlibdir"] + os.path.dirname(target) + dv["staticdir"] + "/" + os.path.basename(target) + dv["staticappend"]
+ if os.access(ftarget, os.R_OK):
+ bb.utils.mkdirhier(os.path.dirname(fpath))
+ # Only one hardlink of separated debug info file in each directory
+ if not os.access(fpath, os.R_OK):
+ #bb.note("Link %s -> %s" % (fpath, ftarget))
+ os.link(ftarget, fpath)
+ else:
+ bb.note("Unable to find inode link target %s" % (target))
# Create symlinks for all cases we were able to split symbols
for file in symlinks: