about summary refs log tree commit diff
path: root/pkgs/development/cuda-modules/setup-hooks/auto-add-cuda-compat-runpath.sh
blob: ae25cebaca6fadc3bcb98e52d9e1efd502f3a4de (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# shellcheck shell=bash
# Patch all dynamically linked, ELF files with the CUDA driver (libcuda.so)
# coming from the cuda_compat package by adding it to the RUNPATH.
echo "Sourcing auto-add-cuda-compat-runpath-hook"

elfHasDynamicSection() {
    patchelf --print-rpath "$1" >& /dev/null
}

autoAddCudaCompatRunpathPhase() (
  local outputPaths
  mapfile -t outputPaths < <(for o in $(getAllOutputNames); do echo "${!o}"; done)
  find "${outputPaths[@]}" -type f -print0  | while IFS= read -rd "" f; do
    if isELF "$f"; then
      # patchelf returns an error on statically linked ELF files
      if elfHasDynamicSection "$f" ; then
        echo "autoAddCudaCompatRunpathHook: patching $f"
        local origRpath="$(patchelf --print-rpath "$f")"
        patchelf --set-rpath "@libcudaPath@:$origRpath" "$f"
      elif (( "${NIX_DEBUG:-0}" >= 1 )) ; then
        echo "autoAddCudaCompatRunpathHook: skipping a statically-linked ELF file $f"
      fi
    fi
  done
)

postFixupHooks+=(autoAddCudaCompatRunpathPhase)