On 7/28/26 6:06 PM, Ricardo B. Marlière (SUSE) wrote:
> Hello,
> 

Hello! Thanks for posting this.

The Fedora build system is rather complex, especially around selftests BPF. We
are also discovering we need these changes.

Due to some other oddities in our build system, we would also like to specify a 
precompiled vmlinux, rather than defaulting to $(objtree)/vmlinux.

I developed the following commit on top of these changes, and was finally able
to get a successful build in our env.

commit 616e12baf39ac44680c1dc22d31dbeea63e196b7
Author: Nico Pache <[email protected]>
Date:   Fri Aug 7 12:37:36 2026 -0600

    kbuild, selftests/bpf: allow overriding the module BTF base
    
    scripts/Makefile.modfinal currently hard-codes $(objtree)/vmlinux as the
    BTF base used for module BTF generation. That works for in-tree builds,
    but selftests/bpf/test_kmods may need to reuse a vmlinux resolved from a
    prepared build tree or from /sys/kernel/btf/vmlinux.
    
    Add a VMLINUX_BTF_BASE override so module BTF generation can use that
    pre-resolved vmlinux instead.
    
    Signed-off-by: Nico Pache <[email protected]>

diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
index 01a37ec872b9..fd16e66aa156 100644
--- a/scripts/Makefile.modfinal
+++ b/scripts/Makefile.modfinal
@@ -38,16 +38,19 @@ quiet_cmd_ld_ko_o = LD [M]  $@
                $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)              \
                -T $(objtree)/scripts/module.lds -o $@ $(filter %.o, $^)
 
+VMLINUX_BTF_BASE ?= $(objtree)/vmlinux
+VMLINUX_BTF_BASE_PREREQ := $(wildcard $(VMLINUX_BTF_BASE))
+
 quiet_cmd_btf_ko = BTF [M] $@
       cmd_btf_ko =                                                     \
-       if [ ! -f $(objtree)/vmlinux ]; then                            \
-               printf "Skipping BTF generation for %s due to unavailability of 
vmlinux\n" $@ 1>&2; \
+       if [ ! -f $(VMLINUX_BTF_BASE) ]; then                           \
+               printf "Skipping BTF generation for %s due to unavailability of 
%s\n" $@ $(VMLINUX_BTF_BASE) 1>&2; \
        else    \
-               $(CONFIG_SHELL) $(srctree)/scripts/gen-btf.sh --btf_base 
$(objtree)/vmlinux $@; \
+               $(CONFIG_SHELL) $(srctree)/scripts/gen-btf.sh --btf_base 
$(VMLINUX_BTF_BASE) $@; \
        fi;
 
-# Re-generate module BTFs if either module's .ko or vmlinux changed
-%.ko: %.o %.mod.o .module-common.o $(objtree)/scripts/module.lds $(and 
$(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),$(objtree)/vmlinux) FORCE
+# Re-generate module BTFs if either module's .ko or BTF base changed
+%.ko: %.o %.mod.o .module-common.o $(objtree)/scripts/module.lds $(and 
$(CONFIG_DEBUG_INFO_BTF_MODULES),$(VMLINUX_BTF_BASE_PREREQ)) FORCE
        +$(call if_changed,ld_ko_o)
 ifdef CONFIG_DEBUG_INFO_BTF_MODULES
        +$(if $(newer-prereqs),$(call cmd,btf_ko))
diff --git a/tools/testing/selftests/bpf/test_kmods/Makefile 
b/tools/testing/selftests/bpf/test_kmods/Makefile
index 53e47e715ec4..8580eee34f32 100644
--- a/tools/testing/selftests/bpf/test_kmods/Makefile
+++ b/tools/testing/selftests/bpf/test_kmods/Makefile
@@ -11,6 +11,8 @@ KMOD_O_VALID := $(if $(KMOD_O),$(if $(wildcard 
$(KMOD_O)/Module.symvers),$(KMOD_
 KDIR ?= $(if $(KMOD_O_VALID),$(SRCTREE_KDIR), \
            $(if $(wildcard $(SRCTREE_KDIR)/Module.symvers),$(SRCTREE_KDIR), \
                /lib/modules/$(shell uname -r)/build))
+# The parent bpf/Makefile may already have resolved a usable BTF base.
+VMLINUX_BTF_BASE_ARG := $(if $(VMLINUX_BTF),VMLINUX_BTF_BASE=$(abspath 
$(VMLINUX_BTF)))
 
 ifeq ($(V),1)
 Q =
@@ -32,10 +34,12 @@ PERMISSIVE := $(filter 0,$(BPF_STRICT_BUILD))
 all:
 ifeq ($(PERMISSIVE),)
        $(Q)$(MAKE) -C $(KDIR) $(if $(KMOD_O_VALID),O=$(KMOD_O_VALID) 
KBUILD_OUTPUT=$(KMOD_O_VALID),KBUILD_OUTPUT=) \
+               $(VMLINUX_BTF_BASE_ARG) \
                $(if $(OUTPUT),MO=$(OUTPUT)) \
                M=$(TEST_KMOD_DIR) modules
 else ifneq ("$(wildcard $(KDIR))", "")
        $(Q)$(MAKE) -C $(KDIR) $(if $(KMOD_O_VALID),O=$(KMOD_O_VALID) 
KBUILD_OUTPUT=$(KMOD_O_VALID),KBUILD_OUTPUT=) \
+               $(VMLINUX_BTF_BASE_ARG) \
                $(if $(OUTPUT),MO=$(OUTPUT)) \
                M=$(TEST_KMOD_DIR) modules
 endif


Given your series was defferred, and there is a "rewrite" coming, what would
be the best approach to working together (between us three) to get these
fixes in that series too. 

Cheers,
-- Nico 

> When doing a simple out-of-tree build, e.g.:
> 
> $ git clean -fdx
> $ mkdir ../build
> $ make defconfig O=../build
> $ scripts/kconfig/merge_config.sh -O ../build ../build/.config 
> tools/testing/selftests/bpf/{config,config.x86_64}
> $ make O=../build
> $ make -C tools/testing/selftests install O=$PWD/../build SKIP_TARGETS= 
> TARGETS=bpf
> 
> Will leave behind several build artifacts:
> 
> $ git clean -fdx
> Removing tools/testing/selftests/bpf/libarena/asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/asan_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/buddy.bpf.o
> Removing tools/testing/selftests/bpf/libarena/buddy_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/common.bpf.o
> Removing tools/testing/selftests/bpf/libarena/common_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/libarena.bpf.o
> Removing tools/testing/selftests/bpf/libarena/libarena.skel.h
> Removing tools/testing/selftests/bpf/libarena/libarena_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/libarena_asan.skel.h
> Removing tools/testing/selftests/bpf/libarena/rbtree.bpf.o
> Removing tools/testing/selftests/bpf/libarena/rbtree_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/spmc.bpf.o
> Removing tools/testing/selftests/bpf/libarena/spmc_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/st_asan_buddy.bpf.o
> Removing tools/testing/selftests/bpf/libarena/st_asan_buddy_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/st_buddy.bpf.o
> Removing tools/testing/selftests/bpf/libarena/st_buddy_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_parallel_spmc.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_parallel_spmc_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_rbtree.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_rbtree_asan.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_spmc.bpf.o
> Removing tools/testing/selftests/bpf/libarena/test_spmc_asan.bpf.o
> Removing tools/testing/selftests/bpf/map_tests/tests.h
> Removing tools/testing/selftests/bpf/prog_tests/tests.h
> Removing tools/testing/selftests/bpf/test_kmods/..module-common.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.Module.symvers.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_x.ko.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_x.mod.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_x.mod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_x.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_y.ko.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_y.mod.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_y.mod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_modorder_y.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_no_cfi.ko.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_no_cfi.mod.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_no_cfi.mod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_no_cfi.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_rqspinlock.ko.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_rqspinlock.mod.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_rqspinlock.mod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_test_rqspinlock.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_testmod.ko.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_testmod.mod.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_testmod.mod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_testmod.o.cmd
> Removing tools/testing/selftests/bpf/test_kmods/.bpf_testmod.o.d
> Removing tools/testing/selftests/bpf/test_kmods/.module-common.o
> Removing tools/testing/selftests/bpf/test_kmods/.modules.order.cmd
> Removing tools/testing/selftests/bpf/test_kmods/Module.symvers
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.ko
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.mod
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.mod.c
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.mod.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_x.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.ko
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.mod
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.mod.c
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.mod.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_modorder_y.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.ko
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.mod
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.mod.c
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.mod.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_no_cfi.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_rqspinlock.ko
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_rqspinlock.mod
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_rqspinlock.mod.c
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_rqspinlock.mod.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_test_rqspinlock.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_testmod.ko
> Removing tools/testing/selftests/bpf/test_kmods/bpf_testmod.mod
> Removing tools/testing/selftests/bpf/test_kmods/bpf_testmod.mod.c
> Removing tools/testing/selftests/bpf/test_kmods/bpf_testmod.mod.o
> Removing tools/testing/selftests/bpf/test_kmods/bpf_testmod.o
> Removing tools/testing/selftests/bpf/test_kmods/modules.order
> Removing tools/testing/selftests/bpf/verification_cert.h
> Removing tools/testing/selftests/bpf/verifier/tests.h
> 
> This series fixes this.
> 
> Assisted-by: claude sonnet
> Signed-off-by: Ricardo B. Marlière (SUSE) <[email protected]>
> ---
> Ricardo B. Marlière (SUSE) (3):
>       selftests/bpf: Route generated test headers to OUTPUT
>       selftests/bpf: Route libarena build artifacts to OUTPUT
>       selftests/bpf: Route test_kmods build artifacts to OUTPUT
> 
>  tools/testing/selftests/bpf/Makefile            | 45 
> ++++++++++++++-----------
>  tools/testing/selftests/bpf/libarena/Makefile   | 24 +++++++------
>  tools/testing/selftests/bpf/test_kmods/Makefile |  3 ++
>  3 files changed, 42 insertions(+), 30 deletions(-)
> ---
> base-commit: 62cc90241548d5570ee68e01aaba6506964e9811
> change-id: 20260728-selftests-bpf_oot-da8b59be69fc
> 
> Best regards,
> --  
> Ricardo B. Marlière (SUSE) <[email protected]>
> 
> 


Reply via email to