forked from mirrors/nixpkgs
b3b672d5a1
Before the change separate-debug-info.sh did the stripping itself. This scheme has a few problems: 1. Stripping happens only on ELF files. *.a and *.o files are skipped. Derivations have to do it manually. Usually incorrectly as they don't run $RANLIB (true for `glibc` and `musl`). 2. Stripping happens on all paths. Ideally only `stripDebugList` paths should be considered. 3. Host strip is called on Target files. This change offloads stripping logic to strip hook. This strips more files for `glibc` and `musl`. Now we can remove most $STRIP calls from individual derivations. Co-authored-by: Sandro <sandro.jaeckel@gmail.com>
65 lines
2.5 KiB
Bash
65 lines
2.5 KiB
Bash
# This setup hook strips libraries and executables in the fixup phase.
|
|
|
|
fixupOutputHooks+=(_doStrip)
|
|
|
|
_doStrip() {
|
|
# We don't bother to strip build platform code because it shouldn't make it
|
|
# to $out anyways---if it does, that's a bigger problem that a lack of
|
|
# stripping will help catch.
|
|
local -ra flags=(dontStripHost dontStripTarget)
|
|
local -ra debugDirs=(stripDebugList stripDebugListTarget)
|
|
local -ra allDirs=(stripAllList stripAllListTarget)
|
|
local -ra stripCmds=(STRIP STRIP_FOR_TARGET)
|
|
local -ra ranlibCmds=(RANLIB RANLIB_FOR_TARGET)
|
|
|
|
# Strip only host paths by default. Leave targets as is.
|
|
stripDebugList=${stripDebugList:-lib lib32 lib64 libexec bin sbin}
|
|
stripDebugListTarget=${stripDebugListTarget:-}
|
|
stripAllList=${stripAllList:-}
|
|
stripAllListTarget=${stripAllListTarget:-}
|
|
|
|
local i
|
|
for i in ${!stripCmds[@]}; do
|
|
local -n flag="${flags[$i]}"
|
|
local -n debugDirList="${debugDirs[$i]}"
|
|
local -n allDirList="${allDirs[$i]}"
|
|
local -n stripCmd="${stripCmds[$i]}"
|
|
local -n ranlibCmd="${ranlibCmds[$i]}"
|
|
|
|
# `dontStrip` disables them all
|
|
if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null
|
|
then continue; fi
|
|
|
|
stripDirs "$stripCmd" "$ranlibCmd" "$debugDirList" "${stripDebugFlags:--S}"
|
|
stripDirs "$stripCmd" "$ranlibCmd" "$allDirList" "${stripAllFlags:--s}"
|
|
done
|
|
}
|
|
|
|
stripDirs() {
|
|
local cmd="$1"
|
|
local ranlibCmd="$2"
|
|
local paths="$3"
|
|
local stripFlags="$4"
|
|
local pathsNew=
|
|
|
|
local p
|
|
for p in ${paths}; do
|
|
if [ -e "$prefix/$p" ]; then
|
|
pathsNew="${pathsNew} $prefix/$p"
|
|
fi
|
|
done
|
|
paths=${pathsNew}
|
|
|
|
if [ -n "${paths}" ]; then
|
|
echo "stripping (with command $cmd and flags $stripFlags) in $paths"
|
|
# Do not strip lib/debug. This is a directory used by setup-hooks/separate-debug-info.sh.
|
|
find $paths -type f -a '!' -wholename "$prefix/lib/debug/*" -exec $cmd $stripFlags '{}' \; 2>/dev/null
|
|
# 'strip' does not normally preserve archive index in .a files.
|
|
# This usually causes linking failures against static libs like:
|
|
# ld: ...-i686-w64-mingw32-stage-final-gcc-13.0.0-lib/i686-w64-mingw32/lib/libstdc++.dll.a:
|
|
# error adding symbols: archive has no index; run ranlib to add one
|
|
# Restore the index by running 'ranlib'.
|
|
find $paths -name '*.a' -type f -exec $ranlibCmd '{}' \; 2>/dev/null
|
|
fi
|
|
}
|