From: Bochao Cao <[email protected]> Add a shared skeleton rule and build host bpftool when BPFTOOL is not supplied. Use host CC/LD and absolute source paths in submakes.
Pass KHDR_INCLUDES to the BPF compiler without overriding it with source-tree headers. Generate the skeleton through a temporary file. Tested normal and separate-output builds, inherited relative srctree, and host bootstrap with unusable target CC/LD. A conflicting source header no longer overrides the installed header. Signed-off-by: Bochao Cao <[email protected]> --- tools/testing/selftests/net/bpf.mk | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/bpf.mk b/tools/testing/selftests/net/bpf.mk index a4f6755dd8941..016e32960280a 100644 --- a/tools/testing/selftests/net/bpf.mk +++ b/tools/testing/selftests/net/bpf.mk @@ -4,12 +4,12 @@ CLANG ?= clang SCRATCH_DIR := $(OUTPUT)/tools BUILD_DIR := $(SCRATCH_DIR)/build BPFDIR := $(top_srcdir)/tools/lib/bpf APIDIR := $(top_srcdir)/tools/include/uapi +CCINCLUDE += $(KHDR_INCLUDES) CCINCLUDE += -I$(selfdir)/bpf -CCINCLUDE += -I$(top_srcdir)/usr/include/ CCINCLUDE += -I$(SCRATCH_DIR)/include BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a MAKE_DIRS := $(BUILD_DIR)/libbpf @@ -44,10 +44,39 @@ $(BPF_PROG_OBJS): $(OUTPUT)/%.o : %.c $(BPFOBJ) | $(MAKE_DIRS) $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ $(APIDIR)/linux/bpf.h \ | $(BUILD_DIR)/libbpf $(call msg,MAKE,,$@) - $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \ + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) srctree=$(abspath $(top_srcdir)) \ + OUTPUT=$(BUILD_DIR)/libbpf/ \ EXTRA_CFLAGS='-g -O0' \ DESTDIR=$(SCRATCH_DIR) prefix= all install_headers EXTRA_CLEAN += $(SCRATCH_DIR) + +# Build a host bpftool only when a test needs a generated skeleton. +HOSTCC ?= gcc +HOSTLD ?= ld +BPFTOOL_BUILD := $(BUILD_DIR)/bpftool +ifeq ($(origin BPFTOOL),undefined) +BPFTOOL := $(BPFTOOL_BUILD)/bootstrap/bpftool +BPFTOOL_DEP := $(BPFTOOL) +else +BPFTOOL_DEP := $(shell command -v $(BPFTOOL)) +endif + +$(BPFTOOL_BUILD)/bootstrap/bpftool: \ + $(wildcard $(top_srcdir)/tools/bpf/bpftool/*.[ch]) \ + $(top_srcdir)/tools/bpf/bpftool/Makefile \ + $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) + $(call msg,MAKE,,$@) + $(Q)mkdir -p $(BPFTOOL_BUILD) + $(Q)$(MAKE) $(submake_extras) -C $(top_srcdir)/tools/bpf/bpftool \ + OUTPUT=$(BPFTOOL_BUILD)/ srctree=$(abspath $(top_srcdir)) \ + ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" bootstrap + +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o $(BPFTOOL_DEP) + $(call msg,GEN-SKEL,,$@) + $(Q)$(BPFTOOL) gen skeleton $< name $(notdir $*) > [email protected] + $(Q)mv [email protected] $@ + +EXTRA_CLEAN += $(wildcard $(OUTPUT)/*.skel.h $(OUTPUT)/*.skel.h.tmp) -- Git-155)

