From 18c67d2418c571a0a85592401db793b5e6a9343a Mon Sep 17 00:00:00 2001
From: n0-1
Date: Mon, 6 Jan 2025 02:27:19 +0100
Subject: [PATCH] Support for cross-compiling kernel modules
In order to correctly cross-compile, one has to pass ARCH and
CROSS_COMPILE make flags to kernel module build calls. Facilitate this
in the same way as for custom CC flag by recognizing KERNEL_-prefixed
configure environment variables of same name.
Reviewed-by: Brian Behlendorf
Signed-off-by: Phil Sutter
Closes #16924
---
config/kernel.m4 | 5 +++++
config/zfs-build.m4 | 2 ++
module/Makefile.in | 2 ++
rpm/generic/zfs-kmod.spec.in | 4 +++-
rpm/redhat/zfs-kmod.spec.in | 4 +++-
5 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/config/kernel.m4 b/config/kernel.m4
index ae6663390..9928ead1b 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -681,11 +681,16 @@ AC_DEFUN([ZFS_LINUX_COMPILE], [
building kernel modules])
AC_ARG_VAR([KERNEL_LLVM], [Binary option to
build kernel modules with LLVM/CLANG toolchain])
+ AC_ARG_VAR([KERNEL_CROSS_COMPILE], [Cross compile prefix
+ for kernel module builds])
+ AC_ARG_VAR([KERNEL_ARCH], [Architecture to build kernel modules for])
AC_TRY_COMMAND([
KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6"
make modules -k -j$TEST_JOBS ${KERNEL_CC:+CC=$KERNEL_CC}
${KERNEL_LD:+LD=$KERNEL_LD} ${KERNEL_LLVM:+LLVM=$KERNEL_LLVM}
CONFIG_MODULES=y CFLAGS_MODULE=-DCONFIG_MODULES
+ ${KERNEL_CROSS_COMPILE:+CROSS_COMPILE=$KERNEL_CROSS_COMPILE}
+ ${KERNEL_ARCH:+ARCH=$KERNEL_ARCH}
-C $LINUX_OBJ $ARCH_UM M=$PWD/$1 >$1/build.log 2>&1])
AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
])
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
index c44a893bb..55fc029f0 100644
--- a/config/zfs-build.m4
+++ b/config/zfs-build.m4
@@ -393,6 +393,8 @@ AC_DEFUN([ZFS_AC_RPM], [
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cc KERNEL_CC=$(KERNEL_CC)"'
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_ld KERNEL_LD=$(KERNEL_LD)"'
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_llvm KERNEL_LLVM=$(KERNEL_LLVM)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cross_compile KERNEL_CROSS_COMPILE=$(KERNEL_CROSS_COMPILE)"'
+ RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_arch KERNEL_ARCH=$(KERNEL_ARCH)"'
])
RPM_DEFINE_DKMS=''
diff --git a/module/Makefile.in b/module/Makefile.in
index 9b34b3dfa..529ab81dc 100644
--- a/module/Makefile.in
+++ b/module/Makefile.in
@@ -55,6 +55,8 @@ modules-Linux:
mkdir -p $(sort $(dir $(zfs-objs) $(zfs-)))
$(MAKE) -C @LINUX_OBJ@ $(if @KERNEL_CC@,CC=@KERNEL_CC@) \
$(if @KERNEL_LD@,LD=@KERNEL_LD@) $(if @KERNEL_LLVM@,LLVM=@KERNEL_LLVM@) \
+ $(if @KERNEL_CROSS_COMPILE@,CROSS_COMPILE=@KERNEL_CROSS_COMPILE@) \
+ $(if @KERNEL_ARCH@,ARCH=@KERNEL_ARCH@) \
M="$$PWD" @KERNEL_MAKE@ CONFIG_ZFS=m modules
modules-FreeBSD:
diff --git a/rpm/generic/zfs-kmod.spec.in b/rpm/generic/zfs-kmod.spec.in
index 30524474d..7ed828bd0 100644
--- a/rpm/generic/zfs-kmod.spec.in
+++ b/rpm/generic/zfs-kmod.spec.in
@@ -144,7 +144,9 @@ for kernel_version in %{?kernel_versions}; do
%{debuginfo} \
%{?kernel_cc} \
%{?kernel_ld} \
- %{?kernel_llvm}
+ %{?kernel_llvm} \
+ %{?kernel_cross_compile} \
+ %{?kernel_arch}
# Pre-6.10 kernel builds didn't need to copy over the source files to the
# build directory. However we do need to do it though post-6.10 due to
diff --git a/rpm/redhat/zfs-kmod.spec.in b/rpm/redhat/zfs-kmod.spec.in
index 876c198c6..a95bdf20f 100644
--- a/rpm/redhat/zfs-kmod.spec.in
+++ b/rpm/redhat/zfs-kmod.spec.in
@@ -69,7 +69,9 @@ fi
%{debuginfo} \
%{?kernel_cc} \
%{?kernel_ld} \
- %{?kernel_llvm}
+ %{?kernel_llvm} \
+ %{?kernel_cross_compile} \
+ %{?kernel_arch}
make %{?_smp_mflags}
# Module signing (modsign)