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