2023-11-07 15:35:11 +01:00
{
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 = " c u d a t o o l k i t " ;
inherit ( release ) version ;
inherit runPatches ;
dontPatchELF = true ;
dontStrip = true ;
src = fetchurl { inherit ( release ) url sha256 ; } ;
outputs = [
" o u t "
" l i b "
" d o c "
] ;
nativeBuildInputs =
[
perl
makeWrapper
rsync
addOpenGLRunpath
autoPatchelfHook
autoAddOpenGLRunpathHook
markForCudatoolkitRootHook
]
++ lib . optionals ( lib . versionOlder version " 1 1 " ) [ libsForQt5 . wrapQtAppsHook ]
++ lib . optionals ( lib . versionAtLeast version " 1 1 . 8 " ) [ qt6Packages . wrapQtAppsHook ] ;
2023-12-09 01:50:05 +01:00
propagatedBuildInputs = [ setupCudaHook ] ;
2023-11-07 15:35:11 +01:00
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 . override { enableCuda = false ; } ) # Avoid infinite recursion
xorg . libxshmfence
xorg . libxkbfile
]
++ ( lib . optionals ( lib . versionAtLeast version " 1 2 " ) (
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 " 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 "
] ;
preFixup =
if lib . versionOlder version " 1 1 " then
''
$ { lib . getExe' patchelf " p a t c h e l f " } $ out/targets /* / l i b / l i b n v r t c . s o - - a d d - n e e d e d l i b n v r t c - b u i l t i n s . s o
''
else
''
$ { lib . getExe' patchelf " p a t c h e l f " } $ out/lib64/libnvrtc.so - - add-needed libnvrtc-builtins . so
'' ;
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
'' }
$ { lib . optionalString ( lib . versionAtLeast version " 1 0 . 1 " && lib . versionOlder version " 1 1 " ) ''
cd pkg/builds/cuda-toolkit
mv * $ out /
'' }
$ { lib . optionalString ( lib . versionAtLeast version " 1 1 " ) ''
mkdir - p $ out/bin $ out/lib64 $ out/include $ doc
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
( 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 *
'' }
$ {
2023-12-03 19:42:41 +01:00
lib . optionalString ( lib . versionAtLeast version " 1 1 . 8 " && lib . versionOlder version " 1 2 " )
2023-11-07 15:35:11 +01:00
# 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
''
}
2023-12-03 19:42:41 +01:00
$ {
lib . optionalString ( lib . versionAtLeast version " 1 2 " )
# Use Qt plugins built by Nix.
''
for qtlib in $ out/host-linux-x64/Plugins /* / l i b q * . s o ; d o
qtdir = $ ( basename $ ( dirname $ qtlib ) )
filename = $ ( basename $ qtlib )
for qtpkgdir in $ { lib . concatMapStringsSep " " ( x : qt6Packages . ${ x } ) [ " q t b a s e " " q t i m a g e f o r m a t s " " q t s v g " " q t w a y l a n d " ] } ; do
if [ - e $ qtpkgdir/lib/qt-6/plugins / $ qtdir / $ filename ] ; then
ln - snf $ qtpkgdir/lib/qt-6/plugins / $ qtdir / $ filename $ qtlib
fi
done
done
''
}
2023-11-07 15:35:11 +01:00
rm - f $ out/tools/CUDA_Occupancy_Calculator.xls # FIXME: why?
$ { 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
'' }
$ { lib . optionalString ( lib . versionAtLeast version " 1 2 . 0 " ) ''
rm $ out/host-linux-x64/libQt6 *
'' }
# 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 "
''
+
# 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 " 1 0 . 1 " && ( lib . versionOlder version " 1 1 " ) ) ''
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 " 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
''
# 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
''
+ ''
runHook postInstall
'' ;
postInstall = ''
for b in nvvp $ { lib . optionalString ( lib . versionOlder version " 1 1 " ) " n s i g h t " } ; do
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
2023-12-03 19:42:41 +01:00
$ {
lib . optionalString ( lib . versionAtLeast version " 1 2 " )
# Check we don't have any lurking vendored qt libraries that weren't
# replaced during installPhase
''
qtlibfiles = $ ( find $ out - name " l i b q * . s o " - type f )
if [ ! - z " $ q t l i b f i l e s " ] ; then
echo " F o u n d u n e x p e c t e d v e n d o r e d Q t l i b r a r y f i l e s i n $ o u t " > & 2
echo $ qtlibfiles > & 2
echo " T h e s e s h o u l d b e r e p l a c e d w i t h s y m l i n k s i n i n s t a l l P h a s e " > & 2
exit 1
fi
''
}
2023-11-07 15:35:11 +01:00
'' ;
# 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 " E x e c u t i n g ' $ f - - v e r s i o n ' : " ; . / $ f - - version ; ;
esac
done
popd
'' ;
passthru = {
inherit ( backendStdenv ) cc ;
majorMinorVersion = lib . versions . majorMinor version ;
majorVersion = lib . versions . majorMinor version ;
} ;
meta = with lib ; {
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 . nvidiaCuda ;
maintainers = teams . cuda . members ;
} ;
}