Files
nixpkgs/pkgs/development/cuda-modules/packages/removeStubsFromRunpathHook/removeStubsFromRunpathHook.bash
T
2025-11-25 19:39:53 +00:00

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"
}