2023-10-09 19:29:22 +00:00
|
|
|
# Type Aliases
|
|
|
|
#
|
|
|
|
# ReleaseAttrs : {
|
|
|
|
# "relative_path" : String,
|
|
|
|
# "sha256" : String,
|
|
|
|
# "md5" : String,
|
|
|
|
# "size" : String,
|
|
|
|
# }
|
|
|
|
#
|
|
|
|
# NOTE: PackageAttrs must have at least one of the arches.
|
|
|
|
# PackageAttrs : {
|
|
|
|
# "name" : String,
|
|
|
|
# "license" : String,
|
|
|
|
# "version" : String,
|
|
|
|
# "license_path" : None | String,
|
|
|
|
# "linux-aarch64" : None | ReleaseAttrs,
|
|
|
|
# "linux-ppc64le" : None | ReleaseAttrs,
|
|
|
|
# "linux-sbsa" : None | ReleaseAttrs,
|
|
|
|
# "linux-x86_64" : None | ReleaseAttrs,
|
|
|
|
# "windows-x86_64" : None | ReleaseAttrs,
|
|
|
|
# }
|
|
|
|
#
|
|
|
|
# ReleaseFeaturesAttrs : {
|
|
|
|
# "hasBin" : Boolean,
|
|
|
|
# "hasDev" : Boolean,
|
|
|
|
# "hasDoc" : Boolean,
|
|
|
|
# "hasLib" : Boolean,
|
|
|
|
# "hasOut" : Boolean,
|
|
|
|
# "hasSample" : Boolean,
|
|
|
|
# "hasStatic" : Boolean,
|
|
|
|
# "rootDirs" : List String,
|
|
|
|
# }
|
|
|
|
#
|
|
|
|
# NOTE: PackageFeatureAttrs must have at least one of the arches.
|
|
|
|
# PackageFeatureAttrs : {
|
|
|
|
# "linux-aarch64" : None | ReleaseFeaturesAttrs,
|
|
|
|
# "linux-ppc64le" : None | ReleaseFeaturesAttrs,
|
|
|
|
# "linux-sbsa" : None | ReleaseFeaturesAttrs,
|
|
|
|
# "linux-x86_64" : None | ReleaseFeaturesAttrs,
|
|
|
|
# "windows-x86_64" : None | ReleaseFeaturesAttrs,
|
|
|
|
# }
|
|
|
|
#
|
|
|
|
final: prev:
|
|
|
|
let
|
|
|
|
# NOTE: We use hasAttr throughout instead of the (?) operator because hasAttr does not require
|
|
|
|
# us to interpolate our variables into strings (like ${attrName}).
|
|
|
|
inherit (builtins) attrNames concatMap hasAttr listToAttrs removeAttrs;
|
2022-04-15 01:41:22 +00:00
|
|
|
inherit (final) callPackage;
|
2023-10-09 19:29:22 +00:00
|
|
|
inherit (prev) cudaVersion;
|
|
|
|
inherit (prev.lib.attrsets) nameValuePair optionalAttrs;
|
|
|
|
inherit (prev.lib.lists) optionals;
|
|
|
|
inherit (prev.lib.trivial) flip importJSON pipe;
|
2022-04-15 01:41:22 +00:00
|
|
|
|
2023-10-09 19:29:22 +00:00
|
|
|
# Manifest files for CUDA redistributables (aka redist). These can be found at
|
2022-04-15 01:41:22 +00:00
|
|
|
# https://developer.download.nvidia.com/compute/cuda/redist/
|
2023-10-09 19:29:22 +00:00
|
|
|
# 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.0";
|
|
|
|
"11.8" = "11.8.0";
|
|
|
|
"12.0" = "12.0.1";
|
|
|
|
"12.1" = "12.1.1";
|
|
|
|
"12.2" = "12.2.0";
|
2022-04-15 01:41:22 +00:00
|
|
|
};
|
|
|
|
|
2023-10-09 19:29:22 +00:00
|
|
|
# Check if the current CUDA version is supported.
|
|
|
|
cudaVersionMappingExists = hasAttr cudaVersion cudaVersionMap;
|
|
|
|
|
|
|
|
# Maps a cuda version to its manifest files.
|
|
|
|
# The manifest itself is from NVIDIA, but the features manifest is generated
|
|
|
|
# by us ahead of time and allows us to split pacakges into multiple outputs.
|
|
|
|
# Package names (e.g., "cuda_cccl") are mapped to their attributes or features.
|
|
|
|
# Since we map each attribute to a package name, we need to make sure to get rid of meta
|
|
|
|
# attributes included in the manifest. Currently, these are any of the following:
|
|
|
|
# - release_date
|
|
|
|
# - release_label
|
|
|
|
# - release_product
|
|
|
|
redistManifests =
|
|
|
|
let
|
|
|
|
# Remove meta attributes from the manifest
|
|
|
|
# removeAttrs : AttrSet String b -> Attr String b
|
|
|
|
removeMetaAttrs = flip removeAttrs [ "release_date" "release_label" "release_product" ];
|
|
|
|
# processManifest : Path -> Attr Set (String PackageAttrs)
|
|
|
|
processManifest = flip pipe [ importJSON removeMetaAttrs ];
|
|
|
|
# fullCudaVersion : String
|
|
|
|
fullCudaVersion = cudaVersionMap.${cudaVersion};
|
|
|
|
in
|
|
|
|
{
|
|
|
|
# features : Attr Set (String PackageFeatureAttrs)
|
|
|
|
features = processManifest (./manifests + "/redistrib_features_${fullCudaVersion}.json");
|
|
|
|
# manifest : Attr Set (String PackageAttrs)
|
|
|
|
manifest = processManifest (./manifests + "/redistrib_${fullCudaVersion}.json");
|
|
|
|
};
|
|
|
|
|
|
|
|
# Function to build a single redist package
|
|
|
|
buildRedistPackage = callPackage ./build-cuda-redist-package.nix { };
|
|
|
|
|
|
|
|
# Function that builds all redist packages given manifests
|
|
|
|
buildRedistPackages = { features, manifest }:
|
|
|
|
let
|
|
|
|
wrapper = pname:
|
|
|
|
let
|
|
|
|
# Get the redist architectures the package provides distributables for
|
|
|
|
packageAttrs = manifest.${pname};
|
|
|
|
|
|
|
|
# Check if supported
|
|
|
|
# TODO(@connorbaker): Currently hardcoding x86_64-linux as the only supported platform.
|
|
|
|
isSupported = packageAttrs ? linux-x86_64;
|
|
|
|
|
|
|
|
# Build the derivation
|
|
|
|
drv = buildRedistPackage {
|
|
|
|
inherit pname;
|
|
|
|
# TODO(@connorbaker): We currently discard the license attribute.
|
|
|
|
inherit (manifest.${pname}) version;
|
|
|
|
description = manifest.${pname}.name;
|
|
|
|
platforms = [ "x86_64-linux" ];
|
|
|
|
releaseAttrs = manifest.${pname}.linux-x86_64;
|
|
|
|
releaseFeaturesAttrs = features.${pname}.linux-x86_64;
|
|
|
|
};
|
2022-04-15 01:41:22 +00:00
|
|
|
|
2023-10-09 19:29:22 +00:00
|
|
|
# Wrap in an optional so we can filter out the empty lists created by unsupported
|
|
|
|
# packages with concatMap.
|
|
|
|
wrapped = optionals isSupported [ (nameValuePair pname drv) ];
|
|
|
|
in
|
|
|
|
wrapped;
|
2022-04-15 01:41:22 +00:00
|
|
|
|
2023-10-09 19:29:22 +00:00
|
|
|
# concatMap provides us an easy way to filter out packages for unsupported platforms.
|
|
|
|
# We wrap the buildRedistPackage call in a list to prevent errors when the package is not
|
|
|
|
# supported (by returning an empty list).
|
|
|
|
redistPackages = listToAttrs (concatMap wrapper (attrNames manifest));
|
|
|
|
in
|
|
|
|
redistPackages;
|
2022-04-15 01:41:22 +00:00
|
|
|
|
2023-10-09 19:29:22 +00:00
|
|
|
# All redistributable packages for the current CUDA version
|
|
|
|
redistPackages = optionalAttrs cudaVersionMappingExists (buildRedistPackages redistManifests);
|
|
|
|
in
|
|
|
|
redistPackages
|