diff options
Diffstat (limited to 'pkgs/development/cuda-modules/cudatoolkit/default.nix')
-rw-r--r-- | pkgs/development/cuda-modules/cudatoolkit/default.nix | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/pkgs/development/cuda-modules/cudatoolkit/default.nix b/pkgs/development/cuda-modules/cudatoolkit/default.nix new file mode 100644 index 0000000000000..e0868e2b1c2cb --- /dev/null +++ b/pkgs/development/cuda-modules/cudatoolkit/default.nix @@ -0,0 +1,374 @@ +{ + cudaVersion, + runPatches ? [], + autoPatchelfHook, + autoAddOpenGLRunpathHook, + addOpenGLRunpath, + alsa-lib, + curlMinimal, + expat, + fetchurl, + fontconfig, + freetype, + gdk-pixbuf, + glib, + glibc, + gst_all_1, + gtk2, + lib, + libxkbcommon, + libkrb5, + krb5, + makeWrapper, + markForCudatoolkitRootHook, + ncurses5, + numactl, + nss, + patchelf, + perl, + python3, # FIXME: CUDAToolkit 10 may still need python27 + pulseaudio, + setupCudaHook, + stdenv, + backendStdenv, # E.g. gcc11Stdenv, set in extension.nix + unixODBC, + wayland, + xorg, + zlib, + freeglut, + libGLU, + libsForQt5, + libtiff, + qt6Packages, + qt6, + rdma-core, + ucx, + rsync, +}: + +let + # Version info for the classic cudatoolkit packages that contain everything that is in redist. + releases = builtins.import ./releases.nix; + release = releases.${cudaVersion}; +in + +backendStdenv.mkDerivation rec { + pname = "cudatoolkit"; + inherit (release) version; + inherit runPatches; + + dontPatchELF = true; + dontStrip = true; + + src = fetchurl {inherit (release) url sha256;}; + + outputs = [ + "out" + "lib" + "doc" + ]; + + nativeBuildInputs = + [ + perl + makeWrapper + rsync + addOpenGLRunpath + autoPatchelfHook + autoAddOpenGLRunpathHook + markForCudatoolkitRootHook + ] + ++ lib.optionals (lib.versionOlder version "11") [libsForQt5.wrapQtAppsHook] + ++ lib.optionals (lib.versionAtLeast version "11.8") [qt6Packages.wrapQtAppsHook]; + depsTargetTargetPropagated = [setupCudaHook]; + buildInputs = + lib.optionals (lib.versionOlder version "11") [ + libsForQt5.qt5.qtwebengine + freeglut + libGLU + ] + ++ [ + # To get $GDK_PIXBUF_MODULE_FILE via setup-hook + gdk-pixbuf + + # For autoPatchelf + ncurses5 + expat + python3 + zlib + glibc + xorg.libX11 + xorg.libXext + xorg.libXrender + xorg.libXt + xorg.libXtst + xorg.libXi + xorg.libXext + xorg.libXdamage + xorg.libxcb + xorg.xcbutilimage + xorg.xcbutilrenderutil + xorg.xcbutilwm + xorg.xcbutilkeysyms + pulseaudio + libxkbcommon + libkrb5 + krb5 + gtk2 + glib + fontconfig + freetype + numactl + nss + unixODBC + alsa-lib + wayland + ] + ++ lib.optionals (lib.versionAtLeast version "11.8") [ + (lib.getLib libtiff) + qt6Packages.qtwayland + rdma-core + (ucx.override {enableCuda = false;}) # Avoid infinite recursion + xorg.libxshmfence + xorg.libxkbfile + ] + ++ (lib.optionals (lib.versionAtLeast version "12") ( + map lib.getLib ([ + # Used by `/target-linux-x64/CollectX/clx` and `/target-linux-x64/CollectX/libclx_api.so` for: + # - `libcurl.so.4` + curlMinimal + + # Used by `/host-linux-x64/Scripts/WebRTCContainer/setup/neko/server/bin/neko` + gst_all_1.gstreamer + gst_all_1.gst-plugins-base + ]) + ++ ( + with qt6; [ + qtmultimedia + qttools + qtpositioning + qtscxml + qtsvg + qtwebchannel + qtwebengine + ] + ) + )); + + # Prepended to runpaths by autoPatchelf. + # The order inherited from older rpath preFixup code + runtimeDependencies = [ + (placeholder "lib") + (placeholder "out") + "${placeholder "out"}/nvvm" + # NOTE: use the same libstdc++ as the rest of nixpkgs, not from backendStdenv + "${lib.getLib stdenv.cc.cc}/lib64" + "${placeholder "out"}/jre/lib/amd64/jli" + "${placeholder "out"}/lib64" + "${placeholder "out"}/nvvm/lib64" + ]; + + autoPatchelfIgnoreMissingDeps = [ + # This is the hardware-dependent userspace driver that comes from + # nvidia_x11 package. It must be deployed at runtime in + # /run/opengl-driver/lib or pointed at by LD_LIBRARY_PATH variable, rather + # than pinned in runpath + "libcuda.so.1" + + # The krb5 expression ships libcom_err.so.3 but cudatoolkit asks for the + # older + # This dependency is asked for by target-linux-x64/CollectX/RedHat/x86_64/libssl.so.10 + # - do we even want to use nvidia-shipped libssl? + "libcom_err.so.2" + ]; + + preFixup = + if lib.versionOlder version "11" then + '' + ${lib.getExe' patchelf "patchelf"} $out/targets/*/lib/libnvrtc.so --add-needed libnvrtc-builtins.so + '' + else + '' + ${lib.getExe' patchelf "patchelf"} $out/lib64/libnvrtc.so --add-needed libnvrtc-builtins.so + ''; + + unpackPhase = '' + sh $src --keep --noexec + + ${lib.optionalString (lib.versionOlder version "10.1") '' + cd pkg/run_files + sh cuda-linux*.run --keep --noexec + sh cuda-samples*.run --keep --noexec + mv pkg ../../$(basename $src) + cd ../.. + rm -rf pkg + + for patch in $runPatches; do + sh $patch --keep --noexec + mv pkg $(basename $patch) + done + ''} + ''; + + installPhase = + '' + runHook preInstall + mkdir $out + ${lib.optionalString (lib.versionOlder version "10.1") '' + cd $(basename $src) + export PERL5LIB=. + perl ./install-linux.pl --prefix="$out" + cd .. + for patch in $runPatches; do + cd $(basename $patch) + perl ./install_patch.pl --silent --accept-eula --installdir="$out" + cd .. + done + ''} + ${lib.optionalString (lib.versionAtLeast version "10.1" && lib.versionOlder version "11") '' + cd pkg/builds/cuda-toolkit + mv * $out/ + ''} + ${lib.optionalString (lib.versionAtLeast version "11") '' + mkdir -p $out/bin $out/lib64 $out/include $doc + for dir in pkg/builds/* pkg/builds/cuda_nvcc/nvvm pkg/builds/cuda_cupti/extras/CUPTI; do + if [ -d $dir/bin ]; then + mv $dir/bin/* $out/bin + fi + if [ -d $dir/doc ]; then + (cd $dir/doc && find . -type d -exec mkdir -p $doc/\{} \;) + (cd $dir/doc && find . \( -type f -o -type l \) -exec mv \{} $doc/\{} \;) + fi + if [ -L $dir/include ] || [ -d $dir/include ]; then + (cd $dir/include && find . -type d -exec mkdir -p $out/include/\{} \;) + (cd $dir/include && find . \( -type f -o -type l \) -exec mv \{} $out/include/\{} \;) + fi + if [ -L $dir/lib64 ] || [ -d $dir/lib64 ]; then + (cd $dir/lib64 && find . -type d -exec mkdir -p $out/lib64/\{} \;) + (cd $dir/lib64 && find . \( -type f -o -type l \) -exec mv \{} $out/lib64/\{} \;) + fi + done + mv pkg/builds/cuda_nvcc/nvvm $out/nvvm + + mv pkg/builds/cuda_sanitizer_api $out/cuda_sanitizer_api + ln -s $out/cuda_sanitizer_api/compute-sanitizer/compute-sanitizer $out/bin/compute-sanitizer + + mv pkg/builds/nsight_systems/target-linux-x64 $out/target-linux-x64 + mv pkg/builds/nsight_systems/host-linux-x64 $out/host-linux-x64 + rm $out/host-linux-x64/libstdc++.so* + ''} + ${ + lib.optionalString (lib.versionAtLeast version "11.8") + # error: auto-patchelf could not satisfy dependency libtiff.so.5 wanted by /nix/store/.......-cudatoolkit-12.0.1/host-linux-x64/Plugins/imageformats/libqtiff.so + # we only ship libtiff.so.6, so let's use qt plugins built by Nix. + # TODO: don't copy, come up with a symlink-based "merge" + '' + rsync ${lib.getLib qt6Packages.qtimageformats}/lib/qt-6/plugins/ $out/host-linux-x64/Plugins/ -aP + '' + } + + rm -f $out/tools/CUDA_Occupancy_Calculator.xls # FIXME: why? + + ${lib.optionalString (lib.versionOlder version "10.1") '' + # let's remove the 32-bit libraries, they confuse the lib64->lib mover + rm -rf $out/lib + ''} + + ${lib.optionalString (lib.versionAtLeast version "12.0") '' + rm $out/host-linux-x64/libQt6* + ''} + + # Remove some cruft. + ${lib.optionalString ((lib.versionAtLeast version "7.0") && (lib.versionOlder version "10.1")) + "rm $out/bin/uninstall*"} + + # Fixup path to samples (needed for cuda 6.5 or else nsight will not find them) + if [ -d "$out"/cuda-samples ]; then + mv "$out"/cuda-samples "$out"/samples + fi + + # Change the #error on GCC > 4.9 to a #warning. + sed -i $out/include/host_config.h -e 's/#error\(.*unsupported GNU version\)/#warning\1/' + + # Fix builds with newer glibc version + sed -i "1 i#define _BITS_FLOATN_H" "$out/include/host_defines.h" + '' + + + # Point NVCC at a compatible compiler + # CUDA_TOOLKIT_ROOT_DIR is legacy, + # Cf. https://cmake.org/cmake/help/latest/module/FindCUDA.html#input-variables + '' + mkdir -p $out/nix-support + cat <<EOF >> $out/nix-support/setup-hook + cmakeFlags+=' -DCUDA_TOOLKIT_ROOT_DIR=$out' + EOF + + # Move some libraries to the lib output so that programs that + # depend on them don't pull in this entire monstrosity. + mkdir -p $lib/lib + mv -v $out/lib64/libcudart* $lib/lib/ + + # Remove OpenCL libraries as they are provided by ocl-icd and driver. + rm -f $out/lib64/libOpenCL* + ${lib.optionalString (lib.versionAtLeast version "10.1" && (lib.versionOlder version "11")) '' + mv $out/lib64 $out/lib + mv $out/extras/CUPTI/lib64/libcupti* $out/lib + ''} + + # nvprof do not find any program to profile if LD_LIBRARY_PATH is not set + wrapProgram $out/bin/nvprof \ + --prefix LD_LIBRARY_PATH : $out/lib + '' + + lib.optionalString (lib.versionOlder version "8.0") '' + # Hack to fix building against recent Glibc/GCC. + echo "NIX_CFLAGS_COMPILE+=' -D_FORCE_INLINES'" >> $out/nix-support/setup-hook + '' + # 11.8 includes a broken symlink, include/include, pointing to targets/x86_64-linux/include + + lib.optionalString (lib.versions.majorMinor version == "11.8") '' + rm $out/include/include + '' + + '' + runHook postInstall + ''; + + postInstall = '' + for b in nvvp ${lib.optionalString (lib.versionOlder version "11") "nsight"}; do + wrapProgram "$out/bin/$b" \ + --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" + done + ''; + + # 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 + # when not using sandboxing. + doInstallCheck = false; + postInstallCheck = '' + # Smoke test binaries + pushd $out/bin + for f in *; do + case $f in + crt) continue;; + nvcc.profile) continue;; + nsight_ee_plugins_manage.sh) continue;; + uninstall_cuda_toolkit_6.5.pl) continue;; + computeprof|nvvp|nsight) continue;; # GUIs don't feature "--version" + *) echo "Executing '$f --version':"; ./$f --version;; + esac + done + popd + ''; + passthru = { + inherit (backendStdenv) cc; + majorMinorVersion = lib.versions.majorMinor version; + majorVersion = lib.versions.majorMinor version; + }; + + meta = with lib; { + description = "A compiler for NVIDIA GPUs, math libraries, and tools"; + homepage = "https://developer.nvidia.com/cuda-toolkit"; + platforms = ["x86_64-linux"]; + license = licenses.nvidiaCuda; + maintainers = teams.cuda.members; + }; +} |