Merge pull request #267247 from yannham/feat/cuda-compat-jetson
Use cuda_compat drivers when available
This commit is contained in:
commit
9ad72f821f
3 changed files with 56 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
# General callPackage-supplied arguments
|
# General callPackage-supplied arguments
|
||||||
autoAddOpenGLRunpathHook,
|
autoAddOpenGLRunpathHook,
|
||||||
|
autoAddCudaCompatRunpathHook,
|
||||||
autoPatchelfHook,
|
autoPatchelfHook,
|
||||||
backendStdenv,
|
backendStdenv,
|
||||||
fetchurl,
|
fetchurl,
|
||||||
|
@ -126,6 +127,14 @@ backendStdenv.mkDerivation (
|
||||||
# Check e.g. with `patchelf --print-rpath path/to/my/binary
|
# Check e.g. with `patchelf --print-rpath path/to/my/binary
|
||||||
autoAddOpenGLRunpathHook
|
autoAddOpenGLRunpathHook
|
||||||
markForCudatoolkitRootHook
|
markForCudatoolkitRootHook
|
||||||
|
]
|
||||||
|
# autoAddCudaCompatRunpathHook depends on cuda_compat and would cause
|
||||||
|
# infinite recursion if applied to `cuda_compat` itself (beside the fact
|
||||||
|
# that it doesn't make sense in the first place)
|
||||||
|
++ lib.optionals (pname != "cuda_compat" && flags.isJetsonBuild) [
|
||||||
|
# autoAddCudaCompatRunpathHook must appear AFTER autoAddOpenGLRunpathHook.
|
||||||
|
# See its documentation in ./setup-hooks/extension.nix.
|
||||||
|
autoAddCudaCompatRunpathHook
|
||||||
];
|
];
|
||||||
|
|
||||||
buildInputs =
|
buildInputs =
|
||||||
|
|
|
@ -0,0 +1,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 -executable -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)
|
|
@ -44,4 +44,24 @@ final: _: {
|
||||||
./auto-add-opengl-runpath-hook.sh
|
./auto-add-opengl-runpath-hook.sh
|
||||||
)
|
)
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
# autoAddCudaCompatRunpathHook hook must be added AFTER `setupCudaHook`. Both
|
||||||
|
# hooks prepend a path with `libcuda.so` to the `DT_RUNPATH` section of
|
||||||
|
# patched elf files, but `cuda_compat` path must take precedence (otherwise,
|
||||||
|
# it doesn't have any effect) and thus appear first. Meaning this hook must be
|
||||||
|
# executed last.
|
||||||
|
autoAddCudaCompatRunpathHook =
|
||||||
|
final.callPackage
|
||||||
|
(
|
||||||
|
{makeSetupHook, cuda_compat}:
|
||||||
|
makeSetupHook
|
||||||
|
{
|
||||||
|
name = "auto-add-cuda-compat-runpath-hook";
|
||||||
|
substitutions = {
|
||||||
|
libcudaPath = "${cuda_compat}/compat";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
./auto-add-cuda-compat-runpath.sh
|
||||||
|
)
|
||||||
|
{};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue