On 1/21/25 3:15 AM, Nicolas Schier wrote: > On Tue, Jan 21, 2025 at 02:48:54AM -0600, Jinghao Jia wrote: >> >> >> On 1/20/25 6:47 PM, Jinghao Jia wrote: >>> >>> >>> On 1/20/25 6:42 PM, Masahiro Yamada wrote: >>>> On Mon, Jan 20, 2025 at 11:30 AM Jinghao Jia <jinghao7@xxxxxxxxxxxx> wrote: >>>>> >>>>> Commit 13b25489b6f8 ("kbuild: change working directory to external >>>>> module directory with M=") changed kbuild working directory of bpf >>>>> samples to $(srctree)/samples/bpf, which broke the vmlinux path for >>>>> VMLINUX_BTF, as the Makefile assumes the current work directory to be >>>>> $(srctree): >>>>> >>>>> Makefile:316: *** Cannot find a vmlinux for VMLINUX_BTF at any of " /path/to/linux/samples/bpf/vmlinux", build the kernel or set VMLINUX_BTF like "VMLINUX_BTF=/sys/kernel/btf/vmlinux" or VMLINUX_H variable. Stop. >>>>> >>>>> Correctly refer to the kernel source directory using $(srctree). >>>>> >>>>> Fixes: 13b25489b6f8 ("kbuild: change working directory to external module directory with M=") >>>>> Tested-by: Ruowen Qin <ruqin@xxxxxxxxxx> >>>>> Signed-off-by: Jinghao Jia <jinghao7@xxxxxxxxxxxx> >>>>> --- >>>>> samples/bpf/Makefile | 2 +- >>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>> >>>>> diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile >>>>> index 96a05e70ace3..f97295724a14 100644 >>>>> --- a/samples/bpf/Makefile >>>>> +++ b/samples/bpf/Makefile >>>>> @@ -307,7 +307,7 @@ $(obj)/$(TRACE_HELPERS): TPROGS_CFLAGS := $(TPROGS_CFLAGS) -D__must_check= >>>>> >>>>> VMLINUX_BTF_PATHS ?= $(abspath $(if $(O),$(O)/vmlinux)) \ >>>>> $(abspath $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)) \ >>>>> - $(abspath ./vmlinux) >>>>> + $(abspath $(srctree)/vmlinux) >>>> >>>> This is wrong and will not work for O= build. >>>> >>>> The prefix should be $(objtree)/ >>>> >>>> >>> >>> I thought the $(srctree)/vmlinux is a fallback when $(O) is not defined, am I >>> understanding it wrong here? >>> >>> --Jinghao >>> >> >> I played with kbuild a little bit more. It seems that the way the Makefiles are >> set up does not allow a sample/bpf build w/o O= when the kernel itself is built >> w/ O=, as it directly invokes the top-level Makefile. If O= is passed to the >> sample/bpf build, the $(abspath $(if $(O),$(O)/vmlinux)) part should take care >> of that. With that said, please do correct me if I am wrong. >> >> --Jinghao > > $(srctree) refers to the root of the kernel source tree, while > $(objtree) refers to the root of the kernel object tree. Even if both > variables have the same value for the case you are fixing, it makes > sense to align to the meaning of the variables as described in > Documentation/kbuild/makefiles.rst. > > In short: if you want to access file created during the kernel build, > please always use $(objtree) instead of $(srctree). > > Hope that helps. > > Kind regards, > Nicolas I see. Thanks for the clarification! I will add this to v2. --Jinghao