Message ID | 157918094179.1357254.14428494370073273452.stgit@toke.dk (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | tools: Use consistent libbpf include paths everywhere | expand |
On Thu, Jan 16, 2020 at 5:28 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote: > > From: Toke Høiland-Jørgensen <toke@redhat.com> > > To make sure no new files are introduced that doesn't include the bpf/ > prefix in its #include, remove tools/lib/bpf from the include path > entirely. > > Instead, we introduce a new header files directory under the scratch tools/ > dir, and add a rule to run the 'install_headers' rule from libbpf to have a > full set of consistent libbpf headers in $(OUTPUT)/tools/include/bpf, and > then use $(OUTPUT)/tools/include as the include path for selftests. > > For consistency we also make sure we put all the scratch build files from > other bpftool and libbpf into tools/build/, so everything stays within > selftests/. > > Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> > --- > tools/testing/selftests/bpf/.gitignore | 1 + > tools/testing/selftests/bpf/Makefile | 50 +++++++++++++++++++------------- > 2 files changed, 31 insertions(+), 20 deletions(-) > > diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore > index 1d14e3ab70be..849be9990ad2 100644 > --- a/tools/testing/selftests/bpf/.gitignore > +++ b/tools/testing/selftests/bpf/.gitignore > @@ -40,3 +40,4 @@ test_cpp > /bpf_gcc > /tools > bpf_helper_defs.h > +/include/bpf Isn't the real path (within selftests/bpf) a tools/include/bpf, which is already ignored through /tools rule? > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile > index 1fd7da49bd56..c3fa695bb028 100644 > --- a/tools/testing/selftests/bpf/Makefile > +++ b/tools/testing/selftests/bpf/Makefile > @@ -20,8 +20,8 @@ CLANG ?= clang > LLC ?= llc > LLVM_OBJCOPY ?= llvm-objcopy > BPF_GCC ?= $(shell command -v bpf-gcc;) > -CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) -I$(LIBDIR) \ > - -I$(BPFDIR) -I$(GENDIR) -I$(TOOLSINCDIR) \ > +CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) \ > + -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) -I$(TOOLSINCDIR) \ > -Dbpf_prog_load=bpf_prog_test_load \ > -Dbpf_load_program=bpf_test_load_program > LDLIBS += -lcap -lelf -lz -lrt -lpthread > @@ -97,11 +97,15 @@ OVERRIDE_TARGETS := 1 > override define CLEAN > $(call msg,CLEAN) > $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN) > - $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ clean > endef > > include ../lib.mk > > +SCRATCH_DIR := $(OUTPUT)/tools > +BUILD_DIR := $(SCRATCH_DIR)/build > +INCLUDE_DIR := $(SCRATCH_DIR)/include > +INCLUDE_BPF := $(INCLUDE_DIR)/bpf/bpf.h > + > # Define simple and short `make test_progs`, `make test_sysctl`, etc targets > # to build individual tests. > # NOTE: Semicolon at the end is critical to override lib.mk's default static > @@ -120,7 +124,7 @@ $(OUTPUT)/urandom_read: urandom_read.c > $(call msg,BINARY,,$@) > $(CC) -o $@ $< -Wl,--build-id > > -$(OUTPUT)/test_stub.o: test_stub.c > +$(OUTPUT)/test_stub.o: test_stub.c $(INCLUDE_BPF) > $(call msg,CC,,$@) > $(CC) -c $(CFLAGS) -o $@ $< > > @@ -129,7 +133,7 @@ $(OUTPUT)/runqslower: force > $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ > OUTPUT=$(CURDIR)/tools/ VMLINUX_BTF=$(abspath ../../../../vmlinux) > > -BPFOBJ := $(OUTPUT)/libbpf.a > +BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a > > $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) > > @@ -155,17 +159,23 @@ force: > DEFAULT_BPFTOOL := $(OUTPUT)/tools/sbin/bpftool > BPFTOOL ?= $(DEFAULT_BPFTOOL) > > -$(DEFAULT_BPFTOOL): force > - $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ > +$(BUILD_DIR)/libbpf $(BUILD_DIR)/bpftool $(INCLUDE_DIR): > + $(call msg,MKDIR,,$@) > + mkdir -p $@ > + > +$(DEFAULT_BPFTOOL): force $(BUILD_DIR)/bpftool directories should be included as order-only dependencies (after | ) > + $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ > + OUTPUT=$(BUILD_DIR)/bpftool/ \ > prefix= DESTDIR=$(OUTPUT)/tools/ install > > -$(BPFOBJ): force > - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ > +$(BPFOBJ): force $(BUILD_DIR)/libbpf same > + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ > + OUTPUT=$(BUILD_DIR)/libbpf/ > > -BPF_HELPERS := $(OUTPUT)/bpf_helper_defs.h $(wildcard $(BPFDIR)/bpf_*.h) > -$(OUTPUT)/bpf_helper_defs.h: $(BPFOBJ) > - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ > - OUTPUT=$(OUTPUT)/ $(OUTPUT)/bpf_helper_defs.h > +BPF_HELPERS := $(wildcard $(BPFDIR)/bpf_*.h) $(INCLUDE_BPF) Shouldn't all BPF_HELPERS come from $(INCLUDE_DIR)/bpf now? > +$(INCLUDE_BPF): force $(BPFOBJ) And this can be more properly a $(BPF_HELPERS): force $(BPFOBJ)? > + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) install_headers \ > + OUTPUT=$(BUILD_DIR)/libbpf/ DESTDIR=$(SCRATCH_DIR) prefix= > > # Get Clang's default includes on this system, as opposed to those seen by > # '-target bpf'. This fixes "missing" files on some architectures/distros, > @@ -185,8 +195,8 @@ MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) > > CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) > BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ > - -I$(OUTPUT) -I$(CURDIR) -I$(CURDIR)/include/uapi \ > - -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include) > + -I$(INCLUDE_DIR) -I$(CURDIR) -I$(CURDIR)/include/uapi \ > + -I$(APIDIR) -I$(abspath $(OUTPUT)/../usr/include) > > CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ > -Wno-compare-distinct-pointer-types > @@ -306,7 +316,7 @@ $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \ > $(TRUNNER_EXTRA_HDRS) \ > $(TRUNNER_BPF_OBJS) \ > $(TRUNNER_BPF_SKELS) \ > - $$(BPFOBJ) | $(TRUNNER_OUTPUT) > + $$(BPFOBJ) $$(INCLUDE_BPF) | $(TRUNNER_OUTPUT) singling out $(INCLUDE_BPF) looks weird? But I think $(BPFOBJ) achieves the same effect, so this change can be probably dropped? Same below. > $$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@) > cd $$(@D) && $$(CC) $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F) > > @@ -314,7 +324,7 @@ $(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \ > %.c \ > $(TRUNNER_EXTRA_HDRS) \ > $(TRUNNER_TESTS_HDR) \ > - $$(BPFOBJ) | $(TRUNNER_OUTPUT) > + $$(BPFOBJ) $$(INCLUDE_BPF) | $(TRUNNER_OUTPUT) > $$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@) > $$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ > > @@ -326,7 +336,7 @@ ifneq ($2,) > endif > > $(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \ > - $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \ > + $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) $$(INCLUDE_BPF) \ > | $(TRUNNER_BINARY)-extras > $$(call msg,BINARY,,$$@) > $$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@ > @@ -388,7 +398,7 @@ $(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ) > $(call msg,CXX,,$@) > $(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@ > > -EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) \ > +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) \ > prog_tests/tests.h map_tests/tests.h verifier/tests.h \ > feature \ > - $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc tools) > + $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc) >
On Thu, Jan 16, 2020 at 2:41 PM Andrii Nakryiko <andrii.nakryiko@gmail.com> wrote: > > On Thu, Jan 16, 2020 at 5:28 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote: > > > > From: Toke Høiland-Jørgensen <toke@redhat.com> > > > > To make sure no new files are introduced that doesn't include the bpf/ > > prefix in its #include, remove tools/lib/bpf from the include path > > entirely. > > > > Instead, we introduce a new header files directory under the scratch tools/ > > dir, and add a rule to run the 'install_headers' rule from libbpf to have a > > full set of consistent libbpf headers in $(OUTPUT)/tools/include/bpf, and > > then use $(OUTPUT)/tools/include as the include path for selftests. > > > > For consistency we also make sure we put all the scratch build files from > > other bpftool and libbpf into tools/build/, so everything stays within > > selftests/. > > > > Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> > > --- BTW, this change also now forces full rebuild regardless if anything changed or not :( [...]
Andrii Nakryiko <andrii.nakryiko@gmail.com> writes: > On Thu, Jan 16, 2020 at 5:28 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote: >> >> From: Toke Høiland-Jørgensen <toke@redhat.com> >> >> To make sure no new files are introduced that doesn't include the bpf/ >> prefix in its #include, remove tools/lib/bpf from the include path >> entirely. >> >> Instead, we introduce a new header files directory under the scratch tools/ >> dir, and add a rule to run the 'install_headers' rule from libbpf to have a >> full set of consistent libbpf headers in $(OUTPUT)/tools/include/bpf, and >> then use $(OUTPUT)/tools/include as the include path for selftests. >> >> For consistency we also make sure we put all the scratch build files from >> other bpftool and libbpf into tools/build/, so everything stays within >> selftests/. >> >> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> >> --- >> tools/testing/selftests/bpf/.gitignore | 1 + >> tools/testing/selftests/bpf/Makefile | 50 +++++++++++++++++++------------- >> 2 files changed, 31 insertions(+), 20 deletions(-) >> >> diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore >> index 1d14e3ab70be..849be9990ad2 100644 >> --- a/tools/testing/selftests/bpf/.gitignore >> +++ b/tools/testing/selftests/bpf/.gitignore >> @@ -40,3 +40,4 @@ test_cpp >> /bpf_gcc >> /tools >> bpf_helper_defs.h >> +/include/bpf > > Isn't the real path (within selftests/bpf) a tools/include/bpf, which > is already ignored through /tools rule? Yeah, you're correct. I started out with having it in include/bpf, but ended up moving it, and guess I forgot to remove the .gitignore. Will fix. >> diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile >> index 1fd7da49bd56..c3fa695bb028 100644 >> --- a/tools/testing/selftests/bpf/Makefile >> +++ b/tools/testing/selftests/bpf/Makefile >> @@ -20,8 +20,8 @@ CLANG ?= clang >> LLC ?= llc >> LLVM_OBJCOPY ?= llvm-objcopy >> BPF_GCC ?= $(shell command -v bpf-gcc;) >> -CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) -I$(LIBDIR) \ >> - -I$(BPFDIR) -I$(GENDIR) -I$(TOOLSINCDIR) \ >> +CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) \ >> + -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) -I$(TOOLSINCDIR) \ >> -Dbpf_prog_load=bpf_prog_test_load \ >> -Dbpf_load_program=bpf_test_load_program >> LDLIBS += -lcap -lelf -lz -lrt -lpthread >> @@ -97,11 +97,15 @@ OVERRIDE_TARGETS := 1 >> override define CLEAN >> $(call msg,CLEAN) >> $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN) >> - $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ clean >> endef >> >> include ../lib.mk >> >> +SCRATCH_DIR := $(OUTPUT)/tools >> +BUILD_DIR := $(SCRATCH_DIR)/build >> +INCLUDE_DIR := $(SCRATCH_DIR)/include >> +INCLUDE_BPF := $(INCLUDE_DIR)/bpf/bpf.h >> + >> # Define simple and short `make test_progs`, `make test_sysctl`, etc targets >> # to build individual tests. >> # NOTE: Semicolon at the end is critical to override lib.mk's default static >> @@ -120,7 +124,7 @@ $(OUTPUT)/urandom_read: urandom_read.c >> $(call msg,BINARY,,$@) >> $(CC) -o $@ $< -Wl,--build-id >> >> -$(OUTPUT)/test_stub.o: test_stub.c >> +$(OUTPUT)/test_stub.o: test_stub.c $(INCLUDE_BPF) >> $(call msg,CC,,$@) >> $(CC) -c $(CFLAGS) -o $@ $< >> >> @@ -129,7 +133,7 @@ $(OUTPUT)/runqslower: force >> $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ >> OUTPUT=$(CURDIR)/tools/ VMLINUX_BTF=$(abspath ../../../../vmlinux) >> >> -BPFOBJ := $(OUTPUT)/libbpf.a >> +BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a >> >> $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) >> >> @@ -155,17 +159,23 @@ force: >> DEFAULT_BPFTOOL := $(OUTPUT)/tools/sbin/bpftool >> BPFTOOL ?= $(DEFAULT_BPFTOOL) >> >> -$(DEFAULT_BPFTOOL): force >> - $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ >> +$(BUILD_DIR)/libbpf $(BUILD_DIR)/bpftool $(INCLUDE_DIR): >> + $(call msg,MKDIR,,$@) >> + mkdir -p $@ >> + >> +$(DEFAULT_BPFTOOL): force $(BUILD_DIR)/bpftool > > directories should be included as order-only dependencies (after | ) OK. >> + $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ >> + OUTPUT=$(BUILD_DIR)/bpftool/ \ >> prefix= DESTDIR=$(OUTPUT)/tools/ install >> >> -$(BPFOBJ): force >> - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ >> +$(BPFOBJ): force $(BUILD_DIR)/libbpf > > same > >> + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ >> + OUTPUT=$(BUILD_DIR)/libbpf/ >> >> -BPF_HELPERS := $(OUTPUT)/bpf_helper_defs.h $(wildcard $(BPFDIR)/bpf_*.h) >> -$(OUTPUT)/bpf_helper_defs.h: $(BPFOBJ) >> - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ >> - OUTPUT=$(OUTPUT)/ $(OUTPUT)/bpf_helper_defs.h >> +BPF_HELPERS := $(wildcard $(BPFDIR)/bpf_*.h) $(INCLUDE_BPF) > > Shouldn't all BPF_HELPERS come from $(INCLUDE_DIR)/bpf now? > >> +$(INCLUDE_BPF): force $(BPFOBJ) > > And this can be more properly a $(BPF_HELPERS): force $(BPFOBJ)? > >> + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) install_headers \ >> + OUTPUT=$(BUILD_DIR)/libbpf/ DESTDIR=$(SCRATCH_DIR) prefix= >> >> # Get Clang's default includes on this system, as opposed to those seen by >> # '-target bpf'. This fixes "missing" files on some architectures/distros, >> @@ -185,8 +195,8 @@ MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) >> >> CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) >> BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ >> - -I$(OUTPUT) -I$(CURDIR) -I$(CURDIR)/include/uapi \ >> - -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include) >> + -I$(INCLUDE_DIR) -I$(CURDIR) -I$(CURDIR)/include/uapi \ >> + -I$(APIDIR) -I$(abspath $(OUTPUT)/../usr/include) >> >> CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ >> -Wno-compare-distinct-pointer-types >> @@ -306,7 +316,7 @@ $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \ >> $(TRUNNER_EXTRA_HDRS) \ >> $(TRUNNER_BPF_OBJS) \ >> $(TRUNNER_BPF_SKELS) \ >> - $$(BPFOBJ) | $(TRUNNER_OUTPUT) >> + $$(BPFOBJ) $$(INCLUDE_BPF) | $(TRUNNER_OUTPUT) > > singling out $(INCLUDE_BPF) looks weird? But I think $(BPFOBJ) > achieves the same effect, so this change can be probably dropped? Same > below. I was having some trouble getting the dependency order right here. $(INCLUDE_BPF) depends on $(BPFOBJ), not the other way around. May be fixable though, I'll take another look. -Toke
Andrii Nakryiko <andrii.nakryiko@gmail.com> writes: > On Thu, Jan 16, 2020 at 2:41 PM Andrii Nakryiko > <andrii.nakryiko@gmail.com> wrote: >> >> On Thu, Jan 16, 2020 at 5:28 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote: >> > >> > From: Toke Høiland-Jørgensen <toke@redhat.com> >> > >> > To make sure no new files are introduced that doesn't include the bpf/ >> > prefix in its #include, remove tools/lib/bpf from the include path >> > entirely. >> > >> > Instead, we introduce a new header files directory under the scratch tools/ >> > dir, and add a rule to run the 'install_headers' rule from libbpf to have a >> > full set of consistent libbpf headers in $(OUTPUT)/tools/include/bpf, and >> > then use $(OUTPUT)/tools/include as the include path for selftests. >> > >> > For consistency we also make sure we put all the scratch build files from >> > other bpftool and libbpf into tools/build/, so everything stays within >> > selftests/. >> > >> > Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> >> > --- > > BTW, this change also now forces full rebuild regardless if anything > changed or not :( It does? Hmm, that was not intentional (I was mostly focused on making sure a clean make worked, not the opposite). I'll see if I can't fix that as well... -Toke
diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore index 1d14e3ab70be..849be9990ad2 100644 --- a/tools/testing/selftests/bpf/.gitignore +++ b/tools/testing/selftests/bpf/.gitignore @@ -40,3 +40,4 @@ test_cpp /bpf_gcc /tools bpf_helper_defs.h +/include/bpf diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 1fd7da49bd56..c3fa695bb028 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -20,8 +20,8 @@ CLANG ?= clang LLC ?= llc LLVM_OBJCOPY ?= llvm-objcopy BPF_GCC ?= $(shell command -v bpf-gcc;) -CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) -I$(LIBDIR) \ - -I$(BPFDIR) -I$(GENDIR) -I$(TOOLSINCDIR) \ +CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(CURDIR) -I$(APIDIR) \ + -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) -I$(TOOLSINCDIR) \ -Dbpf_prog_load=bpf_prog_test_load \ -Dbpf_load_program=bpf_test_load_program LDLIBS += -lcap -lelf -lz -lrt -lpthread @@ -97,11 +97,15 @@ OVERRIDE_TARGETS := 1 override define CLEAN $(call msg,CLEAN) $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN) - $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ clean endef include ../lib.mk +SCRATCH_DIR := $(OUTPUT)/tools +BUILD_DIR := $(SCRATCH_DIR)/build +INCLUDE_DIR := $(SCRATCH_DIR)/include +INCLUDE_BPF := $(INCLUDE_DIR)/bpf/bpf.h + # Define simple and short `make test_progs`, `make test_sysctl`, etc targets # to build individual tests. # NOTE: Semicolon at the end is critical to override lib.mk's default static @@ -120,7 +124,7 @@ $(OUTPUT)/urandom_read: urandom_read.c $(call msg,BINARY,,$@) $(CC) -o $@ $< -Wl,--build-id -$(OUTPUT)/test_stub.o: test_stub.c +$(OUTPUT)/test_stub.o: test_stub.c $(INCLUDE_BPF) $(call msg,CC,,$@) $(CC) -c $(CFLAGS) -o $@ $< @@ -129,7 +133,7 @@ $(OUTPUT)/runqslower: force $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ OUTPUT=$(CURDIR)/tools/ VMLINUX_BTF=$(abspath ../../../../vmlinux) -BPFOBJ := $(OUTPUT)/libbpf.a +BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) @@ -155,17 +159,23 @@ force: DEFAULT_BPFTOOL := $(OUTPUT)/tools/sbin/bpftool BPFTOOL ?= $(DEFAULT_BPFTOOL) -$(DEFAULT_BPFTOOL): force - $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ +$(BUILD_DIR)/libbpf $(BUILD_DIR)/bpftool $(INCLUDE_DIR): + $(call msg,MKDIR,,$@) + mkdir -p $@ + +$(DEFAULT_BPFTOOL): force $(BUILD_DIR)/bpftool + $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ + OUTPUT=$(BUILD_DIR)/bpftool/ \ prefix= DESTDIR=$(OUTPUT)/tools/ install -$(BPFOBJ): force - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ +$(BPFOBJ): force $(BUILD_DIR)/libbpf + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ + OUTPUT=$(BUILD_DIR)/libbpf/ -BPF_HELPERS := $(OUTPUT)/bpf_helper_defs.h $(wildcard $(BPFDIR)/bpf_*.h) -$(OUTPUT)/bpf_helper_defs.h: $(BPFOBJ) - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ - OUTPUT=$(OUTPUT)/ $(OUTPUT)/bpf_helper_defs.h +BPF_HELPERS := $(wildcard $(BPFDIR)/bpf_*.h) $(INCLUDE_BPF) +$(INCLUDE_BPF): force $(BPFOBJ) + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) install_headers \ + OUTPUT=$(BUILD_DIR)/libbpf/ DESTDIR=$(SCRATCH_DIR) prefix= # Get Clang's default includes on this system, as opposed to those seen by # '-target bpf'. This fixes "missing" files on some architectures/distros, @@ -185,8 +195,8 @@ MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ - -I$(OUTPUT) -I$(CURDIR) -I$(CURDIR)/include/uapi \ - -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include) + -I$(INCLUDE_DIR) -I$(CURDIR) -I$(CURDIR)/include/uapi \ + -I$(APIDIR) -I$(abspath $(OUTPUT)/../usr/include) CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ -Wno-compare-distinct-pointer-types @@ -306,7 +316,7 @@ $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \ $(TRUNNER_EXTRA_HDRS) \ $(TRUNNER_BPF_OBJS) \ $(TRUNNER_BPF_SKELS) \ - $$(BPFOBJ) | $(TRUNNER_OUTPUT) + $$(BPFOBJ) $$(INCLUDE_BPF) | $(TRUNNER_OUTPUT) $$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@) cd $$(@D) && $$(CC) $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F) @@ -314,7 +324,7 @@ $(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \ %.c \ $(TRUNNER_EXTRA_HDRS) \ $(TRUNNER_TESTS_HDR) \ - $$(BPFOBJ) | $(TRUNNER_OUTPUT) + $$(BPFOBJ) $$(INCLUDE_BPF) | $(TRUNNER_OUTPUT) $$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@) $$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ @@ -326,7 +336,7 @@ ifneq ($2,) endif $(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \ - $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \ + $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) $$(INCLUDE_BPF) \ | $(TRUNNER_BINARY)-extras $$(call msg,BINARY,,$$@) $$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@ @@ -388,7 +398,7 @@ $(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ) $(call msg,CXX,,$@) $(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@ -EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) \ +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) \ prog_tests/tests.h map_tests/tests.h verifier/tests.h \ feature \ - $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc tools) + $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc)