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