Message ID | 20220707140811.603590-1-pulehui@huawei.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | [bpf-next] samples: bpf: Fix cross-compiling error about bpftool | expand |
> On Jul 7, 2022, at 7:08 AM, Pu Lehui <pulehui@huawei.com> wrote: > > Currently, when cross compiling bpf samples, the host side > cannot use arch-specific bpftool to generate vmlinux.h or > skeleton. We need to compile the bpftool with the host > compiler. > > Signed-off-by: Pu Lehui <pulehui@huawei.com> > --- > samples/bpf/Makefile | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > index 5002a5b9a7da..fe54a8c8f312 100644 > --- a/samples/bpf/Makefile > +++ b/samples/bpf/Makefile > @@ -1,4 +1,5 @@ > # SPDX-License-Identifier: GPL-2.0 > +-include tools/scripts/Makefile.include Why do we need the -include here? Thanks, Song > > BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) > TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools > @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU > BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool > BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool > BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool > -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) > +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) > $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ > - OUTPUT=$(BPFTOOL_OUTPUT)/ \ > - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ > - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ > + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ > + OUTPUT=$(BPFTOOL_OUTPUT)/ > > $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): > $(call msg,MKDIR,$@) > -- > 2.25.1 >
On 2022/7/8 3:12, Song Liu wrote: > > >> On Jul 7, 2022, at 7:08 AM, Pu Lehui <pulehui@huawei.com> wrote: >> >> Currently, when cross compiling bpf samples, the host side >> cannot use arch-specific bpftool to generate vmlinux.h or >> skeleton. We need to compile the bpftool with the host >> compiler. >> >> Signed-off-by: Pu Lehui <pulehui@huawei.com> >> --- >> samples/bpf/Makefile | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile >> index 5002a5b9a7da..fe54a8c8f312 100644 >> --- a/samples/bpf/Makefile >> +++ b/samples/bpf/Makefile >> @@ -1,4 +1,5 @@ >> # SPDX-License-Identifier: GPL-2.0 >> +-include tools/scripts/Makefile.include > > Why do we need the -include here? > HOSTLD is defined in tools/scripts/Makefile.include, we need to add it. And for -include, mainly to resolve some conflicts: 1. If workdir is kernel_src, then 'include tools/scripts/Makefile.include' is fine when 'make M=samples/bpf'. 2. Since the trick in samples/bpf/Makefile: # Trick to allow make to be run from this directory all: $(MAKE) -C ../../ M=$(CURDIR) BPF_SAMPLES_PATH=$(CURDIR) If workdir is samples/bpf, the compile process will first load the Makefile in samples/bpf, then change workdir to kernel_src and load the kernel_src's Makefile. So if we just add 'include tools/scripts/Makefile.include', then the first load will occur error for not found the file, so we add -include to skip the first load. > Thanks, > Song > >> >> BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) >> TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools >> @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU >> BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool >> BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool >> BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool >> -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >> +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >> $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ >> - OUTPUT=$(BPFTOOL_OUTPUT)/ \ >> - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ >> - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ >> + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ >> + OUTPUT=$(BPFTOOL_OUTPUT)/ >> >> $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): >> $(call msg,MKDIR,$@) >> -- >> 2.25.1 >> > > . >
On 2022/7/8 10:46, Pu Lehui wrote: > > > On 2022/7/8 3:12, Song Liu wrote: >> >> >>> On Jul 7, 2022, at 7:08 AM, Pu Lehui <pulehui@huawei.com> wrote: >>> >>> Currently, when cross compiling bpf samples, the host side >>> cannot use arch-specific bpftool to generate vmlinux.h or >>> skeleton. We need to compile the bpftool with the host >>> compiler. >>> >>> Signed-off-by: Pu Lehui <pulehui@huawei.com> >>> --- >>> samples/bpf/Makefile | 8 ++++---- >>> 1 file changed, 4 insertions(+), 4 deletions(-) >>> >>> diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile >>> index 5002a5b9a7da..fe54a8c8f312 100644 >>> --- a/samples/bpf/Makefile >>> +++ b/samples/bpf/Makefile >>> @@ -1,4 +1,5 @@ >>> # SPDX-License-Identifier: GPL-2.0 >>> +-include tools/scripts/Makefile.include >> >> Why do we need the -include here? >> > > HOSTLD is defined in tools/scripts/Makefile.include, we need to add it. > > And for -include, mainly to resolve some conflicts: > 1. If workdir is kernel_src, then 'include > tools/scripts/Makefile.include' is fine when 'make M=samples/bpf'. > 2. Since the trick in samples/bpf/Makefile: > > # Trick to allow make to be run from this directory > all: > $(MAKE) -C ../../ M=$(CURDIR) BPF_SAMPLES_PATH=$(CURDIR) > > If workdir is samples/bpf, the compile process will first load the > Makefile in samples/bpf, then change workdir to kernel_src and load the > kernel_src's Makefile. So if we just add 'include > tools/scripts/Makefile.include', then the first load will occur error > for not found the file, so we add -include to skip the first load. sorry, correct the reply, so we add -include to skip the 'tools/scripts/Makefile.include' file on the fisrt load. > >> Thanks, >> Song >> >>> >>> BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) >>> TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools >>> @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] >>> $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU >>> BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool >>> BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool >>> BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool >>> -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] >>> $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >>> +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) >>> | $(BPFTOOL_OUTPUT) >>> $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ >>> - OUTPUT=$(BPFTOOL_OUTPUT)/ \ >>> - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ >>> - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ >>> + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ >>> + OUTPUT=$(BPFTOOL_OUTPUT)/ >>> >>> $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): >>> $(call msg,MKDIR,$@) >>> -- >>> 2.25.1 >>> >> >> . >> > .
> On Jul 7, 2022, at 8:12 PM, Pu Lehui <pulehui@huawei.com> wrote: > > > > On 2022/7/8 10:46, Pu Lehui wrote: >> On 2022/7/8 3:12, Song Liu wrote: >>> >>> >>>> On Jul 7, 2022, at 7:08 AM, Pu Lehui <pulehui@huawei.com> wrote: >>>> >>>> Currently, when cross compiling bpf samples, the host side >>>> cannot use arch-specific bpftool to generate vmlinux.h or >>>> skeleton. We need to compile the bpftool with the host >>>> compiler. >>>> >>>> Signed-off-by: Pu Lehui <pulehui@huawei.com> >>>> --- >>>> samples/bpf/Makefile | 8 ++++---- >>>> 1 file changed, 4 insertions(+), 4 deletions(-) >>>> >>>> diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile >>>> index 5002a5b9a7da..fe54a8c8f312 100644 >>>> --- a/samples/bpf/Makefile >>>> +++ b/samples/bpf/Makefile >>>> @@ -1,4 +1,5 @@ >>>> # SPDX-License-Identifier: GPL-2.0 >>>> +-include tools/scripts/Makefile.include >>> >>> Why do we need the -include here? >>> >> HOSTLD is defined in tools/scripts/Makefile.include, we need to add it. >> And for -include, mainly to resolve some conflicts: >> 1. If workdir is kernel_src, then 'include tools/scripts/Makefile.include' is fine when 'make M=samples/bpf'. >> 2. Since the trick in samples/bpf/Makefile: >> # Trick to allow make to be run from this directory >> all: >> $(MAKE) -C ../../ M=$(CURDIR) BPF_SAMPLES_PATH=$(CURDIR) >> If workdir is samples/bpf, the compile process will first load the Makefile in samples/bpf, then change workdir to kernel_src and load the kernel_src's Makefile. So if we just add 'include tools/scripts/Makefile.include', then the first load will occur error for not found the file, so we add -include to skip the first load. > > sorry, correct the reply, so we add -include to skip the 'tools/scripts/Makefile.include' file on the fisrt load. Thanks for the explanation. Acked-by: Song Liu <song@kernel.org> > >>> Thanks, >>> Song >>> >>>> >>>> BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) >>>> TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools >>>> @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU >>>> BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool >>>> BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool >>>> BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool >>>> -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >>>> +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >>>> $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ >>>> - OUTPUT=$(BPFTOOL_OUTPUT)/ \ >>>> - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ >>>> - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ >>>> + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ >>>> + OUTPUT=$(BPFTOOL_OUTPUT)/ >>>> >>>> $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): >>>> $(call msg,MKDIR,$@) >>>> -- >>>> 2.25.1 >>>> >>> >>> . >>> >> .
On Thu, Jul 7, 2022 at 6:37 AM Pu Lehui <pulehui@huawei.com> wrote: > > Currently, when cross compiling bpf samples, the host side > cannot use arch-specific bpftool to generate vmlinux.h or > skeleton. We need to compile the bpftool with the host > compiler. > > Signed-off-by: Pu Lehui <pulehui@huawei.com> > --- samples/bpf use bpftool for vmlinux.h, skeleton, and static linking only. All that is supported by lightweight "bootstrap" bpftool version, so we can build just that. It will be faster, and bootstrap version should be always host-native even during cross compilation. See [0] for what I did in libbpf-bootstrap. Also please cc Quention for bpftool-related changes. Thanks! [0] https://github.com/libbpf/libbpf-bootstrap/commit/fc28424eb3f0e39cfb5959296b070389b9a8bd8f > samples/bpf/Makefile | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > index 5002a5b9a7da..fe54a8c8f312 100644 > --- a/samples/bpf/Makefile > +++ b/samples/bpf/Makefile > @@ -1,4 +1,5 @@ > # SPDX-License-Identifier: GPL-2.0 > +-include tools/scripts/Makefile.include > > BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) > TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools > @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU > BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool > BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool > BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool > -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) > +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) > $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ > - OUTPUT=$(BPFTOOL_OUTPUT)/ \ > - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ > - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ > + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ > + OUTPUT=$(BPFTOOL_OUTPUT)/ > > $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): > $(call msg,MKDIR,$@) > -- > 2.25.1 >
On 2022/7/9 6:42, Andrii Nakryiko wrote: > On Thu, Jul 7, 2022 at 6:37 AM Pu Lehui <pulehui@huawei.com> wrote: >> >> Currently, when cross compiling bpf samples, the host side >> cannot use arch-specific bpftool to generate vmlinux.h or >> skeleton. We need to compile the bpftool with the host >> compiler. >> >> Signed-off-by: Pu Lehui <pulehui@huawei.com> >> --- > > samples/bpf use bpftool for vmlinux.h, skeleton, and static linking > only. All that is supported by lightweight "bootstrap" bpftool > version, so we can build just that. It will be faster, and bootstrap > version should be always host-native even during cross compilation. > See [0] for what I did in libbpf-bootstrap. > > Also please cc Quention for bpftool-related changes. Thanks! > > [0] https://github.com/libbpf/libbpf-bootstrap/commit/fc28424eb3f0e39cfb5959296b070389b9a8bd8f > so brilliant,we can take it to other places where rely on bpftool. thanks. >> samples/bpf/Makefile | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile >> index 5002a5b9a7da..fe54a8c8f312 100644 >> --- a/samples/bpf/Makefile >> +++ b/samples/bpf/Makefile >> @@ -1,4 +1,5 @@ >> # SPDX-License-Identifier: GPL-2.0 >> +-include tools/scripts/Makefile.include >> >> BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) >> TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools >> @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU >> BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool >> BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool >> BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool >> -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >> +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) >> $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ >> - OUTPUT=$(BPFTOOL_OUTPUT)/ \ >> - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ >> - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ >> + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ >> + OUTPUT=$(BPFTOOL_OUTPUT)/ >> >> $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): >> $(call msg,MKDIR,$@) >> -- >> 2.25.1 >> > . >
diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 5002a5b9a7da..fe54a8c8f312 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 +-include tools/scripts/Makefile.include BPF_SAMPLES_PATH ?= $(abspath $(srctree)/$(src)) TOOLS_PATH := $(BPF_SAMPLES_PATH)/../../tools @@ -283,11 +284,10 @@ $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OU BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool BPFTOOL_OUTPUT := $(abspath $(BPF_SAMPLES_PATH))/bpftool BPFTOOL := $(BPFTOOL_OUTPUT)/bpftool -$(BPFTOOL): $(LIBBPF) $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) +$(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT) $(MAKE) -C $(BPFTOOLDIR) srctree=$(BPF_SAMPLES_PATH)/../../ \ - OUTPUT=$(BPFTOOL_OUTPUT)/ \ - LIBBPF_OUTPUT=$(LIBBPF_OUTPUT)/ \ - LIBBPF_DESTDIR=$(LIBBPF_DESTDIR)/ + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ + OUTPUT=$(BPFTOOL_OUTPUT)/ $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT): $(call msg,MKDIR,$@)
Currently, when cross compiling bpf samples, the host side cannot use arch-specific bpftool to generate vmlinux.h or skeleton. We need to compile the bpftool with the host compiler. Signed-off-by: Pu Lehui <pulehui@huawei.com> --- samples/bpf/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)