2020-04-24 23:36:52 +00:00
args @
{ version
, sha256
, url ? " "
, name ? " "
, developerProgram ? false
, runPatches ? [ ]
2023-04-12 12:48:02 +00:00
, autoPatchelfHook
, autoAddOpenGLRunpathHook
2020-04-24 23:36:52 +00:00
, addOpenGLRunpath
2021-06-28 23:13:55 +00:00
, alsa-lib
2023-07-15 17:15:38 +00:00
, curlMinimal
2020-04-24 23:36:52 +00:00
, expat
, fetchurl
, fontconfig
, freetype
, gdk-pixbuf
, glib
, glibc
2023-07-15 17:15:38 +00:00
, gst_all_1
2020-04-24 23:36:52 +00:00
, gtk2
, lib
2023-04-12 12:48:02 +00:00
, libxkbcommon
, libkrb5
, krb5
2020-04-24 23:36:52 +00:00
, makeWrapper
, ncurses5
2023-04-12 12:48:02 +00:00
, numactl
, nss
2020-04-24 23:36:52 +00:00
, perl
2023-04-12 12:48:02 +00:00
, python3 # FIXME: CUDAToolkit 10 may still need python27
, pulseaudio
2020-04-24 23:36:52 +00:00
, requireFile
2023-04-12 12:48:02 +00:00
, stdenv
2023-03-08 16:32:21 +00:00
, backendStdenv # E.g. gcc11Stdenv, set in extension.nix
2020-04-24 23:36:52 +00:00
, unixODBC
2023-04-12 12:48:02 +00:00
, wayland
2020-04-24 23:36:52 +00:00
, xorg
, zlib
2023-04-12 12:48:02 +00:00
, freeglut
, libGLU
, libsForQt5
, libtiff
, qt6Packages
2023-07-15 17:15:38 +00:00
, qt6
2023-04-12 12:48:02 +00:00
, rdma-core
, ucx
, rsync
2020-04-24 23:36:52 +00:00
} :
2023-03-08 16:32:21 +00:00
backendStdenv . mkDerivation rec {
2020-04-24 23:36:52 +00:00
pname = " c u d a t o o l k i t " ;
inherit version runPatches ;
dontPatchELF = true ;
dontStrip = true ;
src =
if developerProgram then
requireFile {
message = ''
This nix expression requires that $ { args . name } is already part of the store .
Register yourself to NVIDIA Accelerated Computing Developer Program , retrieve the CUDA toolkit
at https://developer.nvidia.com/cuda-toolkit, and run the following command in the download directory :
nix-prefetch-url file:// \ $ PWD / $ { args . name }
'' ;
inherit ( args ) name sha256 ;
}
else
fetchurl {
inherit ( args ) url sha256 ;
} ;
outputs = [ " o u t " " l i b " " d o c " ] ;
2023-04-12 12:48:02 +00:00
nativeBuildInputs = [
perl
makeWrapper
rsync
addOpenGLRunpath
autoPatchelfHook
autoAddOpenGLRunpathHook
] ++ lib . optionals ( lib . versionOlder version " 1 1 " ) [
libsForQt5 . wrapQtAppsHook
] ++ lib . optionals ( lib . versionAtLeast version " 1 1 . 8 " ) [
qt6Packages . wrapQtAppsHook
] ;
buildInputs = lib . optionals ( lib . versionOlder version " 1 1 " ) [
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 " 1 1 . 8 " ) [
( lib . getLib libtiff )
qt6Packages . qtwayland
rdma-core
ucx
xorg . libxshmfence
xorg . libxkbfile
2023-07-15 17:15:38 +00:00
] ++ ( lib . optionals ( lib . versionAtLeast version " 1 2 . 1 " ) ( 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
] ) ) ) ;
2023-04-12 12:48:02 +00:00
# Prepended to runpaths by autoPatchelf.
# The order inherited from older rpath preFixup code
2020-04-24 23:36:52 +00:00
runtimeDependencies = [
2023-04-12 12:48:02 +00:00
( placeholder " l i b " )
( placeholder " o u t " )
" ${ placeholder " o u t " } / n v v m "
# NOTE: use the same libstdc++ as the rest of nixpkgs, not from backendStdenv
" ${ lib . getLib stdenv . cc . cc } / l i b 6 4 "
" ${ placeholder " o u t " } / j r e / l i b / a m d 6 4 / j l i "
" ${ placeholder " o u t " } / l i b 6 4 "
" ${ placeholder " o u t " } / n v v m / l i b 6 4 "
] ;
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
" l i b c u d a . s o . 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?
" l i b c o m _ e r r . s o . 2 "
2020-04-24 23:36:52 +00:00
] ;
2023-07-15 17:15:38 +00:00
preFixup = ''
patchelf $ out/lib64/libnvrtc.so - - add-needed libnvrtc-builtins . so
'' ;
2020-04-24 23:36:52 +00:00
unpackPhase = ''
sh $ src - - keep - - noexec
$ { lib . optionalString ( lib . versionOlder version " 1 0 . 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 " 1 0 . 1 " ) ''
cd $ ( basename $ src )
export PERL5LIB = .
perl ./install-linux.pl - - prefix = " $ o u t "
cd . .
for patch in $ runPatches ; do
cd $ ( basename $ patch )
perl ./install_patch.pl - - silent - - accept-eula - - installdir = " $ o u t "
cd . .
done
'' }
2020-09-25 04:45:31 +00:00
$ { lib . optionalString ( lib . versionAtLeast version " 1 0 . 1 " && lib . versionOlder version " 1 1 " ) ''
2020-04-24 23:36:52 +00:00
cd pkg/builds/cuda-toolkit
mv * $ out /
'' }
2020-09-25 04:45:31 +00:00
$ { lib . optionalString ( lib . versionAtLeast version " 1 1 " ) ''
2021-12-06 16:07:01 +00:00
mkdir - p $ out/bin $ out/lib64 $ out/include $ doc
2020-09-25 04:45:31 +00:00
for dir in pkg/builds /* p k g / b u i l d s / c u d a _ n v c c / n v v m p k g / b u i l d s / c u d a _ c u p t i / e x t r a s / C U P T I ; d o
if [ - d $ dir/bin ] ; then
mv $ dir/bin /* $ o u t / b i n
fi
if [ - d $ dir/doc ] ; then
2021-12-06 16:07:01 +00:00
( cd $ dir/doc && find . - type d - exec mkdir - p $ doc / \ { } \ ; )
( cd $ dir/doc && find . \ ( - type f - o - type l \ ) - exec mv \ { } $ doc / \ { } \ ; )
2020-09-25 04:45:31 +00:00
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
2022-03-30 09:31:56 +00:00
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
2023-04-12 12:48:02 +00:00
rm $ out/host-linux-x64/libstdc++.so *
'' }
$ { lib . optionalString ( lib . versionAtLeast version " 1 1 . 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
2020-09-25 04:45:31 +00:00
'' }
2020-04-24 23:36:52 +00:00
2020-09-25 04:45:31 +00:00
rm - f $ out/tools/CUDA_Occupancy_Calculator.xls # FIXME: why?
2020-04-24 23:36:52 +00:00
$ { lib . optionalString ( lib . versionOlder version " 1 0 . 1 " ) ''
# let's remove the 32-bit libraries, they confuse the lib64->lib mover
rm - rf $ out/lib
'' }
2023-07-15 17:15:38 +00:00
$ { lib . optionalString ( lib . versionAtLeast version " 1 2 . 0 " ) ''
rm $ out/host-linux-x64/libQt6 *
'' }
2020-04-24 23:36:52 +00:00
# Remove some cruft.
$ { lib . optionalString ( ( lib . versionAtLeast version " 7 . 0 " ) && ( lib . versionOlder version " 1 0 . 1 " ) )
" r m $ o u t / b i n / u n i n s t a l l * " }
# Fixup path to samples (needed for cuda 6.5 or else nsight will not find them)
if [ - d " $ o u t " /cuda-samples ] ; then
mv " $ o u t " /cuda-samples " $ o u t " /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 # d e f i n e _ B I T S _ F L O A T N _ H " " $ o u t / i n c l u d e / h o s t _ d e f i n e s . h "
2023-03-08 16:32:21 +00:00
'' +
# Point NVCC at a compatible compiler
# FIXME: redist cuda_nvcc copy-pastes this code
# Refer to comments in the overrides for cuda_nvcc for explanation
# CUDA_TOOLKIT_ROOT_DIR is legacy,
# Cf. https://cmake.org/cmake/help/latest/module/FindCUDA.html#input-variables
2023-03-15 16:39:30 +00:00
# NOTE: We unconditionally set -Xfatbin=-compress-all, which reduces the size of the compiled
# binaries. If binaries grow over 2GB, they will fail to link. This is a problem for us, as
# the default set of CUDA capabilities we build can regularly cause this to occur (for
# example, with Magma).
2023-03-08 16:32:21 +00:00
''
2020-04-24 23:36:52 +00:00
mkdir - p $ out/nix-support
2023-03-08 16:32:21 +00:00
cat < < EOF > > $ out/nix-support/setup-hook
cmakeFlags + = ' - DCUDA_TOOLKIT_ROOT_DIR = $ out'
cmakeFlags + = ' - DCUDA_HOST_COMPILER = $ { backendStdenv . cc } /bin '
cmakeFlags + = ' - DCMAKE_CUDA_HOST_COMPILER = $ { backendStdenv . cc } /bin '
if [ - z " \' ' ${ CUDAHOSTCXX- } " ] ; then
export CUDAHOSTCXX = $ { backendStdenv . cc } /bin ;
fi
2023-03-15 16:39:30 +00:00
export NVCC_PREPEND_FLAGS + = ' - - compiler-bindir = $ { backendStdenv . cc } /bin - Xfatbin = - compress-all'
2023-03-08 16:32:21 +00:00
EOF
2021-06-06 07:54:09 +00:00
2020-04-24 23:36:52 +00:00
# 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 *
2020-09-25 04:45:31 +00:00
$ { lib . optionalString ( lib . versionAtLeast version " 1 0 . 1 " && ( lib . versionOlder version " 1 1 " ) ) ''
2020-04-24 23:36:52 +00:00
mv $ out/lib64 $ out/lib
2020-09-25 04:45:31 +00:00
mv $ out/extras/CUPTI/lib64/libcupti * $ out/lib
2020-04-24 23:36:52 +00:00
'' }
# 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
'' + l i b . o p t i o n a l S t r i n g ( l i b . v e r s i o n O l d e r v e r s i o n " 8 . 0 " ) ''
# Hack to fix building against recent Glibc/GCC.
echo " N I X _ C F L A G S _ C O M P I L E + = ' - D _ F O R C E _ I N L I N E S ' " > > $ out/nix-support/setup-hook
2023-07-15 17:15:38 +00:00
''
# 11.8 includes a broken symlink, include/include, pointing to targets/x86_64-linux/include
+ lib . optionalString ( lib . versions . majorMinor version == " 1 1 . 8 " ) ''
rm $ out/include/include
2020-04-24 23:36:52 +00:00
'' + ''
runHook postInstall
'' ;
postInstall = ''
2020-09-25 04:45:31 +00:00
for b in nvvp $ { lib . optionalString ( lib . versionOlder version " 1 1 " ) " n s i g h t " } ; do
2020-04-24 23:36:52 +00:00
wrapProgram " $ o u t / b i n / $ b " \
- - set GDK_PIXBUF_MODULE_FILE " $ G D K _ P I X B U F _ M O D U L E _ F I L E "
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 = let
in ''
# 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 " E x e c u t i n g ' $ f - - v e r s i o n ' : " ; . / $ f - - version ; ;
esac
done
popd
'' ;
passthru = {
2023-03-08 16:32:21 +00:00
inherit ( backendStdenv ) cc ;
2022-04-15 01:41:22 +00:00
majorMinorVersion = lib . versions . majorMinor version ;
2020-04-24 23:36:52 +00:00
majorVersion = lib . versions . majorMinor version ;
} ;
2021-02-05 17:12:51 +00:00
meta = with lib ; {
2020-04-24 23:36:52 +00:00
description = " A c o m p i l e r f o r N V I D I A G P U s , m a t h l i b r a r i e s , a n d t o o l s " ;
homepage = " h t t p s : / / d e v e l o p e r . n v i d i a . c o m / c u d a - t o o l k i t " ;
platforms = [ " x 8 6 _ 6 4 - l i n u x " ] ;
license = licenses . unfree ;
2023-05-24 13:37:59 +00:00
maintainers = teams . cuda . members ;
2020-04-24 23:36:52 +00:00
} ;
}