From 28a09189166c767ad284adb9f7e137a3f98546a4 Mon Sep 17 00:00:00 2001 From: Ambroz Bizjak Date: Wed, 22 May 2019 18:34:09 +0200 Subject: [PATCH] Add driver library path to some packages to find CUDA libraries. This is to avoid relying on LD_LIBRARY_PATH for finding the CUDA driver libraries. --- pkgs/applications/misc/blender/default.nix | 14 ++++++++++++-- pkgs/development/compilers/cudatoolkit/default.nix | 14 ++++++++++++-- .../libraries/science/math/cudnn/generic.nix | 9 +++++++++ .../libraries/science/math/nccl/default.nix | 8 ++++++-- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/pkgs/applications/misc/blender/default.nix b/pkgs/applications/misc/blender/default.nix index 353cf620ee741..5445c7efb59be 100644 --- a/pkgs/applications/misc/blender/default.nix +++ b/pkgs/applications/misc/blender/default.nix @@ -2,7 +2,7 @@ , ilmbase, libXi, libX11, libXext, libXrender , libjpeg, libpng, libsamplerate, libsndfile , libtiff, libGLU_combined, openal, opencolorio, openexr, openimageio, openjpeg_1, pythonPackages -, zlib, fftw, opensubdiv, freetype, jemalloc, ocl-icd +, zlib, fftw, opensubdiv, freetype, jemalloc, ocl-icd, addOpenGLRunpath , jackaudioSupport ? false, libjack2 , cudaSupport ? config.cudaSupport or false, cudatoolkit , colladaSupport ? true, opencollada @@ -21,8 +21,9 @@ stdenv.mkDerivation rec { sha256 = "1g4kcdqmf67srzhi3hkdnr4z1ph4h9sza1pahz38mrj998q4r52c"; }; + nativeBuildInputs = [ cmake ] ++ optional cudaSupport addOpenGLRunpath; buildInputs = - [ boost cmake ffmpeg gettext glew ilmbase + [ boost ffmpeg gettext glew ilmbase libXi libX11 libXext libXrender freetype libjpeg libpng libsamplerate libsndfile libtiff libGLU_combined openal opencolorio openexr openimageio openjpeg_1 python zlib fftw jemalloc @@ -80,6 +81,15 @@ stdenv.mkDerivation rec { --prefix PYTHONPATH : ${pythonPackages.numpy}/${python.sitePackages} ''; + # Set RUNPATH so that libcuda and libnvrtc in /run/opengl-driver(-32)/lib can be + # found. See the explanation in libglvnd. + postFixup = optionalString cudaSupport '' + for program in $out/bin/blender $out/bin/.blender-wrapped; do + isELF "$program" || continue + addOpenGLRunpath "$program" + done + ''; + meta = with stdenv.lib; { description = "3D Creation/Animation/Publishing System"; homepage = https://www.blender.org; diff --git a/pkgs/development/compilers/cudatoolkit/default.nix b/pkgs/development/compilers/cudatoolkit/default.nix index e2c3c8fe587b2..6a18c05f38e5d 100644 --- a/pkgs/development/compilers/cudatoolkit/default.nix +++ b/pkgs/development/compilers/cudatoolkit/default.nix @@ -1,6 +1,7 @@ { lib, stdenv, makeWrapper, fetchurl, requireFile, perl, ncurses5, expat, python27, zlib , gcc48, gcc49, gcc5, gcc6, gcc7 , xorg, gtk2, gdk_pixbuf, glib, fontconfig, freetype, unixODBC, alsaLib, glibc +, addOpenGLRunpath }: let @@ -39,7 +40,7 @@ let outputs = [ "out" "lib" "doc" ]; - nativeBuildInputs = [ perl makeWrapper ]; + nativeBuildInputs = [ perl makeWrapper addOpenGLRunpath ]; buildInputs = [ gdk_pixbuf ]; # To get $GDK_PIXBUF_MODULE_FILE via setup-hook runtimeDependencies = [ ncurses5 expat python zlib glibc @@ -143,10 +144,19 @@ let else rpath2=$rpath:$lib/lib:$out/jre/lib/amd64/jli:$out/lib:$out/lib64:$out/nvvm/lib:$out/nvvm/lib64 fi - patchelf --set-rpath $rpath2 --force-rpath $i + patchelf --set-rpath "$rpath2" --force-rpath $i done < <(find $out $lib $doc -type f -print0) ''; + # Set RPATH so that libcuda and other libraries in + # /run/opengl-driver(-32)/lib can be found. See the explanation in + # addOpenGLRunpath. Don't try to figure out which libraries really need + # it, just patch all (but not the stubs libraries). Note that + # --force-rpath prevents changing RPATH (set above) to RUNPATH. + postFixup = '' + addOpenGLRunpath --force-rpath {$out,$lib}/lib/lib*.so + ''; + # cuda-gdb doesn't run correctly when not using sandboxing, so # temporarily disabling the install check. This should be set to true # when we figure out how to get `cuda-gdb --version` to run correctly diff --git a/pkgs/development/libraries/science/math/cudnn/generic.nix b/pkgs/development/libraries/science/math/cudnn/generic.nix index bb1258655b5bf..3c448abeccf6d 100644 --- a/pkgs/development/libraries/science/math/cudnn/generic.nix +++ b/pkgs/development/libraries/science/math/cudnn/generic.nix @@ -7,6 +7,7 @@ , lib , cudatoolkit , fetchurl +, addOpenGLRunpath }: stdenv.mkDerivation rec { @@ -19,6 +20,8 @@ stdenv.mkDerivation rec { inherit sha256; }; + nativeBuildInputs = [ addOpenGLRunpath ]; + installPhase = '' function fixRunPath { p=$(patchelf --print-rpath $1) @@ -31,6 +34,12 @@ stdenv.mkDerivation rec { cp -a lib64 $out/lib64 ''; + # Set RUNPATH so that libcuda in /run/opengl-driver(-32)/lib can be found. + # See the explanation in addOpenGLRunpath. + postFixup = '' + addOpenGLRunpath $out/lib/lib*.so + ''; + propagatedBuildInputs = [ cudatoolkit ]; diff --git a/pkgs/development/libraries/science/math/nccl/default.nix b/pkgs/development/libraries/science/math/nccl/default.nix index badd08291de49..a099b779a7819 100644 --- a/pkgs/development/libraries/science/math/nccl/default.nix +++ b/pkgs/development/libraries/science/math/nccl/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchFromGitHub, which, cudatoolkit }: +{ stdenv, fetchFromGitHub, which, cudatoolkit, addOpenGLRunpath }: stdenv.mkDerivation rec { name = "nccl-${version}-cuda-${cudatoolkit.majorVersion}"; @@ -13,7 +13,7 @@ stdenv.mkDerivation rec { outputs = [ "out" "dev" ]; - nativeBuildInputs = [ which ]; + nativeBuildInputs = [ which addOpenGLRunpath ]; buildInputs = [ cudatoolkit ]; @@ -28,6 +28,10 @@ stdenv.mkDerivation rec { postFixup = '' moveToOutput lib/libnccl_static.a $dev + + # Set RUNPATH so that libnvidia-ml in /run/opengl-driver(-32)/lib can be found. + # See the explanation in addOpenGLRunpath. + addOpenGLRunpath $out/lib/lib*.so ''; NIX_CFLAGS_COMPILE = [ "-Wno-unused-function" ];