diff --git a/packages/cuda/build.ncl b/packages/cuda/build.ncl new file mode 100644 index 00000000..69a17c73 --- /dev/null +++ b/packages/cuda/build.ncl @@ -0,0 +1,125 @@ +let { subsetOf, Attrs, BuildSpec, Local, OutputBin, OutputData, OutputLib, Source, .. } = import "minimal.ncl" in +let base = import "../base/build.ncl" in +let bash = import "../bash/build.ncl" in +let tar = import "../tar/build.ncl" in +let xz = import "../xz/build.ncl" in + +let glibc = import "../glibc/build.ncl" in +let gcc = import "../gcc/build.ncl" in +let zlib = import "../zlib/build.ncl" in +let nvidia-driver = import "../nvidia-driver/build.ncl" in + +let version = "13.2.1" in +let redist_url = "https://developer.download.nvidia.com/compute/cuda/redist" in +{ + name = "cuda", + build_deps = [ + { file = "build.sh" } | Local, + { + url = "%{redist_url}/cuda_nvcc/linux-x86_64/cuda_nvcc-linux-x86_64-13.2.78-archive.tar.xz", + sha256 = "1dc73b03f1d74081866986ca406f7b5981d14306ccbb03127ba45401f36e1862", + extract = true, + } | Source, + { + url = "%{redist_url}/cuda_cudart/linux-x86_64/cuda_cudart-linux-x86_64-13.2.75-archive.tar.xz", + sha256 = "9502ab2c7824e5ef3b554d290b9f564c5026994f469b99c72451a53578f386b9", + extract = true, + } | Source, + { + url = "%{redist_url}/cuda_cccl/linux-x86_64/cuda_cccl-linux-x86_64-13.2.75-archive.tar.xz", + sha256 = "1801f304d92085a327ab46db58264d7f7f48cce80f5825637c405c3a2410dadd", + extract = true, + } | Source, + { + url = "%{redist_url}/cuda_crt/linux-x86_64/cuda_crt-linux-x86_64-13.2.78-archive.tar.xz", + sha256 = "17e731ba749765c2e2e325e3bffecee94226c866cf59f13ba3792aa4f2b1bb31", + extract = true, + } | Source, + { + url = "%{redist_url}/cuda_nvrtc/linux-x86_64/cuda_nvrtc-linux-x86_64-13.2.78-archive.tar.xz", + sha256 = "99dec7ff38d8540b0cb7bdc7b3c8b12b87db83f0f1023ad5f1ed8b51b4af1272", + extract = true, + } | Source, + { + url = "%{redist_url}/cuda_cupti/linux-x86_64/cuda_cupti-linux-x86_64-13.2.75-archive.tar.xz", + sha256 = "302209ad5e44bfdfdd701d035a70d1f9700cdafe46d31c229d31c2c93b906462", + extract = true, + } | Source, + { + url = "%{redist_url}/libnvvm/linux-x86_64/libnvvm-linux-x86_64-13.2.78-archive.tar.xz", + sha256 = "9c665ebec40d0dec4df1858d5a0129972b00351dd674e783d30405cf712d925d", + extract = true, + } | Source, + { + url = "%{redist_url}/libcublas/linux-x86_64/libcublas-linux-x86_64-13.4.0.1-archive.tar.xz", + sha256 = "eda8001ac6b9a6ad862d054aa9b502ff39684147f1e86d02cc0a58a5ce67f62e", + extract = true, + } | Source, + { + url = "%{redist_url}/libcufft/linux-x86_64/libcufft-linux-x86_64-12.2.0.46-archive.tar.xz", + sha256 = "ad001666bce5986cf0244d7795b6ba0164f30a5d4b1b82bbcc5a8d60af05a8b5", + extract = true, + } | Source, + { + url = "%{redist_url}/libcurand/linux-x86_64/libcurand-linux-x86_64-10.4.2.55-archive.tar.xz", + sha256 = "78141da80fa96d9e56ff365e402e27d1873068e5e3e0f528e11c7e1a59cf8bc3", + extract = true, + } | Source, + { + url = "%{redist_url}/libcusolver/linux-x86_64/libcusolver-linux-x86_64-12.2.0.1-archive.tar.xz", + sha256 = "893b5b81527626e96b1adf7d3c6733d39d6e058b250e414bb9ca36c41a8c7081", + extract = true, + } | Source, + { + url = "%{redist_url}/libcusparse/linux-x86_64/libcusparse-linux-x86_64-12.7.10.1-archive.tar.xz", + sha256 = "b981186fa16f8187c550331182fd719dd88def0527d461059b5ef58c5788fa9e", + extract = true, + } | Source, + { + url = "%{redist_url}/libnpp/linux-x86_64/libnpp-linux-x86_64-13.1.0.48-archive.tar.xz", + sha256 = "d95ae34b4ba3a85e87ae3161876032ca6c7e1fc073b87520a1d8269cc818d5fe", + extract = true, + } | Source, + { + url = "%{redist_url}/libnvjitlink/linux-x86_64/libnvjitlink-linux-x86_64-13.2.78-archive.tar.xz", + sha256 = "75fb264ce48651095972ab3aaaefab0809f69245f859aabbf2113f4c5e01d400", + extract = true, + } | Source, + base, + bash, + tar, + xz, + ], + runtime_deps = [ + glibc, + subsetOf gcc ["libgcc", "libstdcpp"], + zlib, + nvidia-driver, + ], + + cmd = "./build.sh", + build_args = { include version }, + + outputs = { + nvcc = { glob = "opt/cuda/bin/nvcc" } | OutputBin, + cudafepp = { glob = "opt/cuda/bin/cudafe++" } | OutputBin, + ptxas = { glob = "opt/cuda/bin/ptxas" } | OutputBin, + fatbinary = { glob = "opt/cuda/bin/fatbinary" } | OutputBin, + nvlink = { glob = "opt/cuda/bin/nvlink" } | OutputBin, + bin2c = { glob = "opt/cuda/bin/bin2c" } | OutputBin, + nvcc_device_query = { glob = "opt/cuda/bin/__nvcc_device_query" } | OutputBin, + nvcc_profile = { glob = "opt/cuda/bin/nvcc.profile" } | OutputData, + nvvm_bin = { glob = "opt/cuda/nvvm/bin/*" } | OutputBin, + libs = { glob = "opt/cuda/lib/*.so*" } | OutputLib, + stubs = { glob = "opt/cuda/lib/stubs/*.so*" } | OutputLib, + nvvm_libs = { glob = "opt/cuda/nvvm/lib64/*.so*" } | OutputLib, + includes = { glob = "opt/cuda/include/**" } | OutputData, + nvvm_libdevice = { glob = "opt/cuda/nvvm/libdevice/*" } | OutputData, + pkgconfig = { glob = "opt/cuda/pkg-config/*" } | OutputData, + }, + + attrs = + { + upstream_version = version, + } | Attrs, +} | BuildSpec diff --git a/packages/cuda/build.sh b/packages/cuda/build.sh new file mode 100755 index 00000000..b9bb1c48 --- /dev/null +++ b/packages/cuda/build.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +DEST="$OUTPUT_DIR/opt/cuda" +mkdir -p "$DEST" + +for d in *-archive; do + [ -d "$d" ] || continue + (cd "$d" && tar -cf - .) | tar -xof - -C "$DEST" +done + +cd "$DEST" +if [ -d lib ] && [ ! -e lib64 ]; then + ln -s lib lib64 +fi + diff --git a/packages/linux_modules_build/build.ncl b/packages/linux_modules_build/build.ncl new file mode 100644 index 00000000..97386bb9 --- /dev/null +++ b/packages/linux_modules_build/build.ncl @@ -0,0 +1,52 @@ +let { Attrs, BuildSpec, Local, OutputData, Source, .. } = import "minimal.ncl" in +let base = import "../base/build.ncl" in +let toolchain = import "../toolchain/build.ncl" in +let make = import "../make/build.ncl" in +let flex = import "../flex/build.ncl" in +let bison = import "../bison/build.ncl" in +let bc = import "../bc/build.ncl" in +let perl = import "../perl/build.ncl" in +let elfutils = import "../elfutils/build.ncl" in +let m4 = import "../m4/build.ncl" in +let openssl = import "../openssl/build.ncl" in + +let version = "6.12.43" in +{ + name = "linux_modules_build", + build_deps = [ + { file = "build.sh" } | Local, + { + url = "gs://minimal-staging-archives/linux-%{version}.tar.xz", + sha256 = "0fcbbbbcd456e87bbbfc8bf37af541fda62ccfcce76903503424fd101ef7bdee", + extract = true, + strip_prefix = "linux-%{version}", + } | Source, + base, + toolchain, + make, + flex, + bison, + bc, + perl, + elfutils, + m4, + openssl, + ], + + cmd = "./build.sh", + build_args = { include version }, + + outputs = { + tree = { glob = "usr/src/linux-%{version}/**" } | OutputData, + }, + + attrs = + { + upstream_version = version, + source_provenance = { + category = 'GithubRepo, + owner = "torvalds", + repo = "linux", + }, + } | Attrs, +} | BuildSpec diff --git a/packages/linux_modules_build/build.sh b/packages/linux_modules_build/build.sh new file mode 100755 index 00000000..14436810 --- /dev/null +++ b/packages/linux_modules_build/build.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -euo pipefail + +VERSION="$MINIMAL_ARG_VERSION" + +make defconfig +scripts/config --disable MODULE_SIG +scripts/config --disable MODULE_SIG_ALL +scripts/config --disable SYSTEM_TRUSTED_KEYRING +scripts/config --disable SYSTEM_REVOCATION_KEYS +make olddefconfig +make -j"$(nproc)" + +DEST="$OUTPUT_DIR/usr/src/linux-${VERSION}" +mkdir -p "$DEST" + +cp -a Makefile Kbuild .config Module.symvers "$DEST/" 2>/dev/null || true +cp -a include "$DEST/" +cp -a scripts "$DEST/" +cp -a tools "$DEST/" 2>/dev/null || true + +case "$(uname -m)" in + x86_64) KARCH=x86 ;; + aarch64) KARCH=arm64 ;; + *) KARCH="$(uname -m)" ;; +esac + +mkdir -p "$DEST/arch/${KARCH}" +cp -a "arch/${KARCH}/include" "$DEST/arch/${KARCH}/" +cp -a "arch/${KARCH}/Makefile" "$DEST/arch/${KARCH}/" 2>/dev/null || true +for subdir in tools Makefile.postlink scripts; do + [ -e "arch/${KARCH}/${subdir}" ] && cp -a "arch/${KARCH}/${subdir}" "$DEST/arch/${KARCH}/" || true +done + +find "$DEST/include" "$DEST/arch" -name '*.c' -delete 2>/dev/null || true +find "$DEST" -name '*.o' -delete +find "$DEST" -name '*.cmd' -delete +find "$DEST" -name '.*.cmd' -delete + +rm -rf "$DEST/scripts/dtc/include-prefixes" +find "$DEST" -xtype l -delete diff --git a/packages/nvidia-driver/build.ncl b/packages/nvidia-driver/build.ncl new file mode 100644 index 00000000..1052023a --- /dev/null +++ b/packages/nvidia-driver/build.ncl @@ -0,0 +1,47 @@ +let { subsetOf, Attrs, BuildSpec, Local, OutputBin, OutputLib, Source, .. } = import "minimal.ncl" in +let base = import "../base/build.ncl" in +let bash = import "../bash/build.ncl" in +let tar = import "../tar/build.ncl" in +let zstd = import "../zstd/build.ncl" in + +let glibc = import "../glibc/build.ncl" in +let gcc = import "../gcc/build.ncl" in + +let version = "595.58.03" in +{ + name = "nvidia-driver", + build_deps = [ + { file = "build.sh" } | Local, + { + url = "https://download.nvidia.com/XFree86/Linux-x86_64/%{version}/NVIDIA-Linux-x86_64-%{version}-no-compat32.run", + sha256 = "b66c59b9bebc191b9c21bad7476da1486dd390198223a548892110bca5fb91f9", + } | Source, + base, + bash, + tar, + zstd, + ], + runtime_deps = [ + glibc, + subsetOf gcc ["libgcc"], + ], + + cmd = "./build.sh", + build_args = { include version }, + + outputs = { + nvidia-smi = { glob = "usr/bin/nvidia-smi" } | OutputBin, + nvidia-debugdump = { glob = "usr/bin/nvidia-debugdump" } | OutputBin, + nvidia-persistenced = { glob = "usr/bin/nvidia-persistenced" } | OutputBin, + nvidia-modprobe = { glob = "usr/bin/nvidia-modprobe" } | OutputBin, + nvidia-cuda-mps-control = { glob = "usr/bin/nvidia-cuda-mps-control" } | OutputBin, + nvidia-cuda-mps-server = { glob = "usr/bin/nvidia-cuda-mps-server" } | OutputBin, + libs = { glob = "usr/lib/*.so*" } | OutputLib, + firmware = { glob = "usr/lib/firmware/nvidia/**" } | OutputLib, + }, + + attrs = + { + upstream_version = version, + } | Attrs, +} | BuildSpec diff --git a/packages/nvidia-driver/build.sh b/packages/nvidia-driver/build.sh new file mode 100755 index 00000000..aaa970e3 --- /dev/null +++ b/packages/nvidia-driver/build.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail + +VERSION="$MINIMAL_ARG_VERSION" +RUN_FILE="NVIDIA-Linux-x86_64-${VERSION}-no-compat32.run" + +chmod +x "$RUN_FILE" +sh "$RUN_FILE" --extract-only --target nvidia-unpacked +cd nvidia-unpacked + +DEST="$OUTPUT_DIR" +mkdir -p "$DEST/usr/lib" "$DEST/usr/bin" "$DEST/usr/lib/firmware/nvidia/${VERSION}" + +install_lib_with_symlinks() { + local src="$1" + local soname="$2" + cp -a "$src" "$DEST/usr/lib/" + ln -sf "$(basename "$src")" "$DEST/usr/lib/${soname}" + local unversioned="${soname%.*}" + ln -sf "${soname}" "$DEST/usr/lib/${unversioned}" +} + +install_lib_with_symlinks "libcuda.so.${VERSION}" "libcuda.so.1" +install_lib_with_symlinks "libnvidia-ml.so.${VERSION}" "libnvidia-ml.so.1" +install_lib_with_symlinks "libnvidia-ptxjitcompiler.so.${VERSION}" "libnvidia-ptxjitcompiler.so.1" +install_lib_with_symlinks "libnvidia-nvvm.so.${VERSION}" "libnvidia-nvvm.so.4" +install_lib_with_symlinks "libcudadebugger.so.${VERSION}" "libcudadebugger.so.1" + +cp -a "libnvidia-gpucomp.so.${VERSION}" "$DEST/usr/lib/" 2>/dev/null || true +cp -a "libnvidia-sandboxutils.so.${VERSION}" "$DEST/usr/lib/" 2>/dev/null || true +cp -a "libnvidia-tileiras.so.${VERSION}" "$DEST/usr/lib/" 2>/dev/null || true +cp -a libnvidia-nvvm70.so.4 "$DEST/usr/lib/" 2>/dev/null || true + +for bin in nvidia-smi nvidia-debugdump nvidia-persistenced nvidia-cuda-mps-control nvidia-cuda-mps-server; do + if [ -f "$bin" ]; then + cp -a "$bin" "$DEST/usr/bin/" + chmod 755 "$DEST/usr/bin/$bin" + fi +done + +if [ -f nvidia-modprobe ]; then + cp -a nvidia-modprobe "$DEST/usr/bin/" + chmod 4755 "$DEST/usr/bin/nvidia-modprobe" || chmod 755 "$DEST/usr/bin/nvidia-modprobe" +fi + +cp -a firmware/gsp_ga10x.bin "$DEST/usr/lib/firmware/nvidia/${VERSION}/" +cp -a firmware/gsp_tu10x.bin "$DEST/usr/lib/firmware/nvidia/${VERSION}/" diff --git a/packages/nvidia-kmod/build.ncl b/packages/nvidia-kmod/build.ncl new file mode 100644 index 00000000..1127cc61 --- /dev/null +++ b/packages/nvidia-kmod/build.ncl @@ -0,0 +1,61 @@ +let { Attrs, BuildSpec, Local, OutputLib, Source, .. } = import "minimal.ncl" in +let base = import "../base/build.ncl" in +let toolchain = import "../toolchain/build.ncl" in +let bash = import "../bash/build.ncl" in +let make = import "../make/build.ncl" in +let gawk = import "../gawk/build.ncl" in +let perl = import "../perl/build.ncl" in +let elfutils = import "../elfutils/build.ncl" in +let zstd = import "../zstd/build.ncl" in +let inetutils = import "../inetutils/build.ncl" in + +let linux_modules_build = import "../linux_modules_build/build.ncl" in + +let version = "595.58.03" in +let kver = "6.12.43" in +{ + name = "nvidia-kmod", + build_deps = [ + { file = "build.sh" } | Local, + { + url = "https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/%{version}.tar.gz", + sha256 = "e0c4659ddf15e4f4e19cee05b49f88c9ba08ef3add0dfe08249798f58d0fe75e", + extract = true, + strip_prefix = "open-gpu-kernel-modules-%{version}", + } | Source, + base, + toolchain, + bash, + make, + gawk, + perl, + elfutils, + zstd, + inetutils, + linux_modules_build, + ], + + cmd = "./build.sh", + build_args = { + include version, + kernel_version = kver, + }, + + outputs = { + nvidia = { glob = "lib/modules/%{kver}/kernel/drivers/video/nvidia.ko" } | OutputLib, + nvidia-uvm = { glob = "lib/modules/%{kver}/kernel/drivers/video/nvidia-uvm.ko" } | OutputLib, + nvidia-modeset = { glob = "lib/modules/%{kver}/kernel/drivers/video/nvidia-modeset.ko" } | OutputLib, + nvidia-drm = { glob = "lib/modules/%{kver}/kernel/drivers/video/nvidia-drm.ko" } | OutputLib, + nvidia-peermem = { glob = "lib/modules/%{kver}/kernel/drivers/video/nvidia-peermem.ko" } | OutputLib, + }, + + attrs = + { + upstream_version = version, + source_provenance = { + category = 'GithubRepo, + owner = "NVIDIA", + repo = "open-gpu-kernel-modules", + }, + } | Attrs, +} | BuildSpec diff --git a/packages/nvidia-kmod/build.sh b/packages/nvidia-kmod/build.sh new file mode 100755 index 00000000..9708384f --- /dev/null +++ b/packages/nvidia-kmod/build.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -euo pipefail + +VERSION="$MINIMAL_ARG_VERSION" +KVER="$MINIMAL_ARG_KERNEL_VERSION" +KSRC_RO="/usr/src/linux-${KVER}" + +KSRC="$(pwd)/linux-${KVER}" +cp -a "$KSRC_RO" "$KSRC" +chmod -R u+w "$KSRC" + +export CC=gcc +export HOSTCC=gcc +export LD=ld + +make modules -j"$(nproc)" \ + CC=gcc HOSTCC=gcc LD=ld \ + SYSSRC="$KSRC" \ + SYSOUT="$KSRC" \ + IGNORE_PREEMPT_RT_PRESENCE=1 \ + IGNORE_MISSING_MODULE_SYMVERS=1 \ + TARGET_ARCH=x86_64 + +DEST="$OUTPUT_DIR/lib/modules/${KVER}/kernel/drivers/video" +mkdir -p "$DEST" +for m in nvidia nvidia-uvm nvidia-modeset nvidia-drm nvidia-peermem; do + if [ -f "kernel-open/${m}.ko" ]; then + cp "kernel-open/${m}.ko" "$DEST/" + fi +done