d2f2407e65
Signed-off-by: Connor Baker <ConnorBaker01@gmail.com>
88 lines
3.0 KiB
Bash
88 lines
3.0 KiB
Bash
# shellcheck shell=bash
|
|
|
|
# Only run the hook from nativeBuildInputs when strictDeps is set
|
|
if [[ -n ${removeStubsFromRunpathHookOnce-} ]]; then
|
|
# shellcheck disable=SC2154
|
|
nixDebugLog "skipping sourcing removeStubsFromRunpathHook.bash (hostOffset=$hostOffset) (targetOffset=$targetOffset)" \
|
|
"because it has already been sourced"
|
|
return 0
|
|
fi
|
|
|
|
declare -g removeStubsFromRunpathHookOnce=1
|
|
|
|
nixLog "sourcing removeStubsFromRunpathHook.bash (hostOffset=$hostOffset) (targetOffset=$targetOffset)"
|
|
|
|
# NOTE: Adding to prePhases to ensure all setup hooks are sourced prior to adding our hook.
|
|
appendToVar prePhases removeStubsFromRunpathHookRegistration
|
|
nixLog "added removeStubsFromRunpathHookRegistration to prePhases"
|
|
|
|
# Registering during prePhases ensures that all setup hooks are sourced prior to installing ours,
|
|
# allowing us to always go after autoAddDriverRunpath and autoPatchelfHook.
|
|
removeStubsFromRunpathHookRegistration() {
|
|
local postFixupHook
|
|
|
|
for postFixupHook in "${postFixupHooks[@]}"; do
|
|
if [[ $postFixupHook == "autoFixElfFiles addDriverRunpath" ]]; then
|
|
nixLog "discovered 'autoFixElfFiles addDriverRunpath' in postFixupHooks; this hook should be unnecessary when" \
|
|
"linking against stub files!"
|
|
fi
|
|
done
|
|
|
|
postFixupHooks+=("autoFixElfFiles removeStubsFromRunpath")
|
|
nixLog "added removeStubsFromRunpath to postFixupHooks"
|
|
|
|
return 0
|
|
}
|
|
|
|
removeStubsFromRunpath() {
|
|
local libPath
|
|
local runpathEntry
|
|
local -a origRunpathEntries=()
|
|
local -a newRunpathEntries=()
|
|
local -r driverLinkLib="@driverLinkLib@"
|
|
local -i driverLinkLibSightings=0
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
nixErrorLog "no library path provided" >&2
|
|
exit 1
|
|
elif [[ $# -gt 1 ]]; then
|
|
nixErrorLog "too many arguments" >&2
|
|
exit 1
|
|
elif [[ $1 == "" ]]; then
|
|
nixErrorLog "empty library path" >&2
|
|
exit 1
|
|
else
|
|
libPath="$1"
|
|
fi
|
|
|
|
getRunpathEntries "$libPath" origRunpathEntries
|
|
|
|
# NOTE: Always pre-increment since (( 0 )) sets an exit code of 1.
|
|
for runpathEntry in "${origRunpathEntries[@]}"; do
|
|
case $runpathEntry in
|
|
# NOTE: This assumes stubs have "-cuda" (`cudaNamePrefix` in `buildRedist`) in name.
|
|
# Match on (sub)directories named stubs or lib inside a stubs output.
|
|
*-cuda*/stubs|*-cuda*-stubs/lib*)
|
|
if ((driverLinkLibSightings)); then
|
|
# No need to add another copy of the driverLinkLib; just drop the stubs entry.
|
|
nixDebugLog "dropping $libPath runpath entry: $runpathEntry"
|
|
else
|
|
# We haven't observed a driverLinkLib yet, so replace the stubs entry with one.
|
|
nixDebugLog "replacing $libPath runpath entry: $runpathEntry -> $driverLinkLib"
|
|
newRunpathEntries+=("$driverLinkLib")
|
|
((++driverLinkLibSightings))
|
|
fi
|
|
;;
|
|
|
|
*)
|
|
nixDebugLog "keeping $libPath runpath entry: $runpathEntry"
|
|
newRunpathEntries+=("$runpathEntry")
|
|
[[ $runpathEntry == "$driverLinkLib" ]] && ((++driverLinkLibSightings))
|
|
;;
|
|
esac
|
|
done
|
|
|
|
local -r newRunpath=$(concatStringsSep ":" newRunpathEntries)
|
|
patchelf --set-rpath "$newRunpath" "$libPath"
|
|
}
|