106 lines
3.8 KiB
Nix
106 lines
3.8 KiB
Nix
{ cudaVersion, lib }:
|
|
let
|
|
inherit (lib) attrsets modules trivial;
|
|
redistName = "cuda";
|
|
|
|
# Manifest files for CUDA redistributables (aka redist). These can be found at
|
|
# https://developer.download.nvidia.com/compute/cuda/redist/
|
|
# Maps a cuda version to the specific version of the manifest.
|
|
cudaVersionMap = {
|
|
"11.4" = "11.4.4";
|
|
"11.5" = "11.5.2";
|
|
"11.6" = "11.6.2";
|
|
"11.7" = "11.7.1";
|
|
"11.8" = "11.8.0";
|
|
"12.0" = "12.0.1";
|
|
"12.1" = "12.1.1";
|
|
"12.2" = "12.2.2";
|
|
"12.3" = "12.3.0";
|
|
"12.4" = "12.4.0";
|
|
};
|
|
|
|
# Check if the current CUDA version is supported.
|
|
cudaVersionMappingExists = builtins.hasAttr cudaVersion cudaVersionMap;
|
|
|
|
# fullCudaVersion : String
|
|
fullCudaVersion = cudaVersionMap.${cudaVersion};
|
|
|
|
evaluatedModules = modules.evalModules {
|
|
modules = [
|
|
../modules
|
|
# We need to nest the manifests in a config.cuda.manifests attribute so the
|
|
# module system can evaluate them.
|
|
{
|
|
cuda.manifests = {
|
|
redistrib = trivial.importJSON (./manifests + "/redistrib_${fullCudaVersion}.json");
|
|
feature = trivial.importJSON (./manifests + "/feature_${fullCudaVersion}.json");
|
|
};
|
|
}
|
|
];
|
|
};
|
|
|
|
# Generally we prefer to do things involving getting attribute names with feature_manifest instead
|
|
# of redistrib_manifest because the feature manifest will have *only* the redist architecture
|
|
# names as the keys, whereas the redistrib manifest will also have things like version, name, license,
|
|
# and license_path.
|
|
featureManifest = evaluatedModules.config.cuda.manifests.feature;
|
|
redistribManifest = evaluatedModules.config.cuda.manifests.redistrib;
|
|
|
|
# Builder function which builds a single redist package for a given platform.
|
|
# buildRedistPackage : callPackage -> PackageName -> Derivation
|
|
buildRedistPackage =
|
|
callPackage: pname:
|
|
let
|
|
redistribRelease = redistribManifest.${pname};
|
|
featureRelease = featureManifest.${pname};
|
|
drv =
|
|
let
|
|
# get `autoAddDriverRunpath` from pkgs instead of cudaPackages' alias to avoid warning
|
|
inherit (callPackage ({ pkgs }: pkgs) { }) autoAddDriverRunpath;
|
|
in
|
|
(callPackage ../generic-builders/manifest.nix {
|
|
# We pass the whole release to the builder because it has logic to handle
|
|
# the case we're trying to build on an unsupported platform.
|
|
inherit
|
|
pname
|
|
redistName
|
|
redistribRelease
|
|
featureRelease
|
|
autoAddDriverRunpath
|
|
;
|
|
}).overrideAttrs
|
|
(prevAttrs: {
|
|
# Add the package-specific license.
|
|
meta = prevAttrs.meta // {
|
|
license =
|
|
let
|
|
licensePath =
|
|
if redistribRelease.license_path != null then
|
|
redistribRelease.license_path
|
|
else
|
|
"${pname}/LICENSE.txt";
|
|
url = "https://developer.download.nvidia.com/compute/cuda/redist/${licensePath}";
|
|
in
|
|
lib.licenses.nvidiaCudaRedist // { inherit url; };
|
|
};
|
|
});
|
|
in
|
|
drv;
|
|
|
|
# Build all the redist packages given final and prev.
|
|
redistPackages =
|
|
final: _prev:
|
|
# Wrap the whole thing in an optionalAttrs so we can return an empty set if the CUDA version
|
|
# is not supported.
|
|
# NOTE: We cannot include the call to optionalAttrs *in* the pipe as we would strictly evaluate the
|
|
# attrNames before we check if the CUDA version is supported.
|
|
attrsets.optionalAttrs cudaVersionMappingExists (
|
|
trivial.pipe featureManifest [
|
|
# Get all the package names
|
|
builtins.attrNames
|
|
# Build the redist packages
|
|
(trivial.flip attrsets.genAttrs (buildRedistPackage final.callPackage))
|
|
]
|
|
);
|
|
in
|
|
redistPackages
|