{ cudaVersion, fetchurl, final, lib, package, patchelf, zlib, ... }: let inherit (lib) lists maintainers meta strings ; in finalAttrs: prevAttrs: { src = fetchurl {inherit (package) url hash;}; # Useful for inspecting why something went wrong. brokenConditions = let cudaTooOld = strings.versionOlder cudaVersion package.minCudaVersion; cudaTooNew = (package.maxCudaVersion != null) && strings.versionOlder package.maxCudaVersion cudaVersion; in prevAttrs.brokenConditions // { "CUDA version is too old" = cudaTooOld; "CUDA version is too new" = cudaTooNew; }; buildInputs = prevAttrs.buildInputs ++ [zlib] ++ lists.optionals finalAttrs.passthru.useCudatoolkitRunfile [final.cudatoolkit] ++ lists.optionals (!finalAttrs.passthru.useCudatoolkitRunfile) [final.libcublas.lib]; # Tell autoPatchelf about runtime dependencies. # NOTE: Versions from CUDNN releases have four components. postFixup = strings.optionalString (strings.versionAtLeast finalAttrs.version "8.0.5.0") '' ${meta.getExe' patchelf "patchelf"} $lib/lib/libcudnn.so --add-needed libcudnn_cnn_infer.so ${meta.getExe' patchelf "patchelf"} $lib/lib/libcudnn_ops_infer.so --add-needed libcublas.so --add-needed libcublasLt.so ''; passthru.useCudatoolkitRunfile = strings.versionOlder cudaVersion "11.3.999"; meta = prevAttrs.meta // { homepage = "https://developer.nvidia.com/cudnn"; maintainers = prevAttrs.meta.maintainers ++ ( with maintainers; [ mdaiter samuela connorbaker ] ); license = { shortName = "cuDNN EULA"; fullName = "NVIDIA cuDNN Software License Agreement (EULA)"; url = "https://docs.nvidia.com/deeplearning/sdk/cudnn-sla/index.html#supplement"; free = false; redistributable = !finalAttrs.passthru.useCudatoolkitRunfile; }; }; }