`--enable-deterministic-archives` is a GNU specific strip flag and causes other strip implementations (for example LLVM's, see #138013) to fail. Since strip failures are ignored, this means that stripping doesn't work at all in certain situation (causing unnecessary dependencies etc.). To fix this, no longer pass `--enable-deterministic-archives` unconditionally, but instead add it in a GNU binutils specific strip wrapper only. `commonStripFlags` was only used for this flag, so we can remove it altogether. Future work could be to make a generic strip wrapper, with support for nix-support/strip-flags-{before,after} and NIX_STRIP_FLAGS_{BEFORE,AFTER}. This possibly overkill and unnecessary though -- also with the additional challenge of incorporating the darwin strip wrapper somehow.
58 lines
1.6 KiB
Bash
58 lines
1.6 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 stripCmds=(STRIP TARGET_STRIP)
|
|
|
|
# Optimization
|
|
if [[ "${STRIP-}" == "${TARGET_STRIP-}" ]]; then
|
|
dontStripTarget+=1
|
|
fi
|
|
|
|
local i
|
|
for i in ${!stripCmds[@]}; do
|
|
local -n flag="${flags[$i]}"
|
|
local -n stripCmd="${stripCmds[$i]}"
|
|
|
|
# `dontStrip` disables them all
|
|
if [[ "${dontStrip-}" || "${flag-}" ]] || ! type -f "${stripCmd-}" 2>/dev/null
|
|
then continue; fi
|
|
|
|
stripDebugList=${stripDebugList:-lib lib32 lib64 libexec bin sbin}
|
|
if [ -n "$stripDebugList" ]; then
|
|
stripDirs "$stripCmd" "$stripDebugList" "${stripDebugFlags:--S}"
|
|
fi
|
|
|
|
stripAllList=${stripAllList:-}
|
|
if [ -n "$stripAllList" ]; then
|
|
stripDirs "$stripCmd" "$stripAllList" "${stripAllFlags:--s}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
stripDirs() {
|
|
local cmd="$1"
|
|
local dirs="$2"
|
|
local stripFlags="$3"
|
|
local dirsNew=
|
|
|
|
local d
|
|
for d in ${dirs}; do
|
|
if [ -d "$prefix/$d" ]; then
|
|
dirsNew="${dirsNew} $prefix/$d "
|
|
fi
|
|
done
|
|
dirs=${dirsNew}
|
|
|
|
if [ -n "${dirs}" ]; then
|
|
header "stripping (with command $cmd and flags $stripFlags) in$dirs"
|
|
find $dirs -type f -exec $cmd $stripFlags '{}' \; 2>/dev/null
|
|
stopNest
|
|
fi
|
|
}
|