From 7c62d100d411ad93b7c6aa2bd7766b6839e9b714 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Sun, 8 Mar 2026 19:23:47 +0300 Subject: [PATCH] fix: use SYSSRC=common SYSOUT=amd64 for NVIDIA build on Debian split headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Debian 12 splits kernel headers into two packages: linux-headers- (arch-specific: generated/, config/) linux-headers--common (source headers: linux/, asm-generic/, etc.) NVIDIA conftest.sh builds include paths as HEADERS=$SOURCES/include. When SYSSRC=amd64, HEADERS=amd64/include/ which is nearly empty — conftest can't compile any kernel header tests, all compile-tests fail silently, and NVIDIA assumes all kernel APIs are present. This causes link errors for APIs added in kernel 6.3+ (vm_flags_set, vm_flags_clear) and removed APIs (phys_to_dma, dma_is_direct, get_dma_ops). Fix: pass SYSSRC=common (real headers) and SYSOUT=amd64 (generated headers). NVIDIA Makefile maps SYSSRC→NV_KERNEL_SOURCES, SYSOUT→NV_KERNEL_OUTPUT, and runs 'make -C common KBUILD_OUTPUT=amd64'. Conftest then correctly detects which APIs are present in kernel 6.1 and uses proper wrappers. Tested: 5 .ko files built successfully on Debian 12 kernel 6.1.0-43-amd64. Co-Authored-By: Claude Sonnet 4.6 --- iso/builder/build-nvidia-module.sh | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/iso/builder/build-nvidia-module.sh b/iso/builder/build-nvidia-module.sh index c54f77c..8c06f9a 100644 --- a/iso/builder/build-nvidia-module.sh +++ b/iso/builder/build-nvidia-module.sh @@ -23,17 +23,24 @@ DEBIAN_KERNEL_ABI="$3" [ -n "$DEBIAN_KERNEL_ABI" ] || { echo "usage: $0 "; exit 1; } KVER="${DEBIAN_KERNEL_ABI}-amd64" -KDIR="/usr/src/linux-headers-${KVER}" +# On Debian, kernel headers are split into two packages: +# linux-headers- — arch-specific (generated, Makefile) +# linux-headers--common — common source headers (linux/, asm-generic/, etc.) +# NVIDIA conftest needs SYSSRC pointing to common (for source headers like linux/mm.h) +# and SYSOUT pointing to amd64 (for generated headers like autoconf.h, asm/). +KDIR_ARCH="/usr/src/linux-headers-${KVER}" +KDIR_COMMON="/usr/src/linux-headers-${DEBIAN_KERNEL_ABI}-common" echo "=== NVIDIA ${NVIDIA_VERSION} (proprietary) for kernel ${KVER} ===" -if [ ! -d "$KDIR" ]; then +if [ ! -d "$KDIR_ARCH" ] || [ ! -d "$KDIR_COMMON" ]; then echo "=== installing linux-headers-${KVER} ===" DEBIAN_FRONTEND=noninteractive apt-get install -y \ "linux-headers-${KVER}" \ gcc make perl fi -echo "kernel headers: $KDIR" +echo "kernel headers (arch): $KDIR_ARCH" +echo "kernel headers (common): $KDIR_COMMON" CACHE_DIR="${DIST_DIR}/nvidia-${NVIDIA_VERSION}-${KVER}" if [ -d "$CACHE_DIR/modules" ] && [ -f "$CACHE_DIR/bin/nvidia-smi" ]; then @@ -86,12 +93,16 @@ echo "kernel source: $KERNEL_SRC" # Build kernel modules # CFLAGS_MODULE: add GCC include dir so NVIDIA's nv_stdarg.h can find stdarg.h. # Kernel build uses -nostdinc which strips GCC's own includes; we restore it here. -GCC_INCLUDES=$(gcc --print-file-name=include 2>/dev/null || echo "") echo "=== building kernel modules ($(nproc) cores) ===" cd "$KERNEL_SRC" +# SYSSRC=common: conftest finds real kernel headers (linux/mm.h etc.) +# SYSOUT=amd64: generated headers (autoconf.h, asm/) from arch package +# Without this split, conftest uses amd64/include/ which is nearly empty, +# all compile-tests fail silently, and NVIDIA assumes all APIs present → link errors. make -j$(nproc) \ - KERNEL_UNAME="$KVER" SYSSRC="$KDIR" \ - CFLAGS_MODULE="${GCC_INCLUDES:+-I${GCC_INCLUDES}} -Wno-error" \ + KERNEL_UNAME="$KVER" \ + SYSSRC="$KDIR_COMMON" \ + SYSOUT="$KDIR_ARCH" \ modules 2>&1 | tail -10 # Collect outputs