summaryrefslogtreecommitdiffstats
path: root/lib/common.mk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common.mk')
-rw-r--r--lib/common.mk143
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/common.mk b/lib/common.mk
new file mode 100644
index 0000000..b680a75
--- /dev/null
+++ b/lib/common.mk
@@ -0,0 +1,143 @@
+# Common Makefile parts for BPF-building with libbpf
+# --------------------------------------------------
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+#
+# This file should be included from your Makefile like:
+# LIB_DIR = ../lib/
+# include $(LIB_DIR)/common.mk
+#
+# It is expected that you define the variables:
+# XDP_TARGETS and USER_TARGETS
+# as a space-separated list
+#
+XDP_C = ${XDP_TARGETS:=.c}
+XDP_OBJ = ${XDP_C:.c=.o}
+BPF_SKEL_OBJ = ${BPF_SKEL_TARGETS:=.o}
+BPF_SKEL_H = ${BPF_SKEL_OBJ:.bpf.o=.skel.h}
+USER_C := ${USER_TARGETS:=.c}
+USER_OBJ := ${USER_C:.c=.o}
+TEST_C := ${TEST_TARGETS:=.c}
+TEST_OBJ := ${TEST_C:.c=.o}
+XDP_OBJ_INSTALL ?= $(XDP_OBJ)
+MAN_FILES := $(MAN_PAGE)
+
+# Expect this is defined by including Makefile, but define if not
+LIB_DIR ?= ../lib
+LDLIBS ?= $(USER_LIBS)
+LDLIBS += -lm
+
+include $(LIB_DIR)/defines.mk
+include $(LIB_DIR)/libxdp/libxdp.mk
+
+# get list of objects in util
+include $(LIB_DIR)/util/util.mk
+
+# Extend if including Makefile already added some
+LIB_OBJS += $(foreach obj,$(UTIL_OBJS),$(LIB_DIR)/util/$(obj))
+
+EXTRA_DEPS +=
+EXTRA_USER_DEPS +=
+
+LDFLAGS+=-L$(LIBXDP_DIR)
+ifeq ($(DYNAMIC_LIBXDP),1)
+ LDLIBS:=-lxdp $(LDLIBS)
+ OBJECT_LIBXDP:=$(LIBXDP_DIR)/libxdp.so.$(LIBXDP_VERSION)
+else
+ LDLIBS:=-l:libxdp.a $(LDLIBS)
+ OBJECT_LIBXDP:=$(LIBXDP_DIR)/libxdp.a
+endif
+
+# Detect submodule libbpf source file changes
+ifeq ($(SYSTEM_LIBBPF),n)
+ LIBBPF_SOURCES := $(wildcard $(LIBBPF_DIR)/src/*.[ch])
+endif
+
+LIBXDP_SOURCES := $(wildcard $(LIBXDP_DIR)/*.[ch] $(LIBXDP_DIR)/*.in)
+
+# BPF-prog kern and userspace shares struct via header file:
+KERN_USER_H ?= $(wildcard common_kern_user.h)
+
+CFLAGS += -I$(HEADER_DIR) -I$(LIB_DIR)/util $(ARCH_INCLUDES)
+BPF_CFLAGS += -I$(HEADER_DIR) $(ARCH_INCLUDES)
+
+BPF_HEADERS := $(wildcard $(HEADER_DIR)/bpf/*.h) $(wildcard $(HEADER_DIR)/xdp/*.h)
+
+all: $(USER_TARGETS) $(XDP_OBJ) $(EXTRA_TARGETS) $(TEST_TARGETS) man
+
+.PHONY: clean
+clean::
+ $(Q)rm -f $(USER_TARGETS) $(XDP_OBJ) $(USER_OBJ) $(TEST_OBJ) $(USER_GEN) $(BPF_SKEL_H) *.ll
+
+.PHONY: install
+install: all install_local
+ install -m 0755 -d $(DESTDIR)$(SBINDIR)
+ install -m 0755 -d $(DESTDIR)$(BPF_OBJECT_DIR)
+ $(if $(USER_TARGETS),install -m 0755 $(USER_TARGETS) $(DESTDIR)$(SBINDIR))
+ $(if $(XDP_OBJ_INSTALL),install -m 0755 $(XDP_OBJ_INSTALL) $(DESTDIR)$(BPF_OBJECT_DIR))
+ $(if $(MAN_FILES),install -m 0755 -d $(DESTDIR)$(MANDIR)/man8)
+ $(if $(MAN_FILES),install -m 0644 $(MAN_FILES) $(DESTDIR)$(MANDIR)/man8)
+ $(if $(SCRIPTS_FILES),install -m 0755 -d $(DESTDIR)$(SCRIPTSDIR))
+ $(if $(SCRIPTS_FILES),install -m 0755 $(SCRIPTS_FILES) $(DESTDIR)$(SCRIPTSDIR))
+ $(if $(TEST_FILE),install -m 0755 -d $(DESTDIR)$(SCRIPTSDIR)/tests/$(TOOL_NAME))
+ $(if $(TEST_FILE),install -m 0644 $(TEST_FILE) $(DESTDIR)$(SCRIPTSDIR)/tests/$(TOOL_NAME))
+ $(if $(TEST_FILE_DEPS),install -m 0644 $(TEST_FILE_DEPS) $(DESTDIR)$(SCRIPTSDIR)/tests/$(TOOL_NAME))
+ $(if $(TEST_TARGETS),install -m 0755 $(TEST_TARGETS) $(DESTDIR)$(SCRIPTSDIR))
+
+.PHONY: install_local
+install_local::
+
+$(OBJECT_LIBBPF): $(LIBBPF_SOURCES)
+ $(Q)$(MAKE) -C $(LIB_DIR) libbpf
+
+$(OBJECT_LIBXDP): $(LIBXDP_SOURCES)
+ $(Q)$(MAKE) -C $(LIBXDP_DIR)
+
+$(CONFIGMK):
+ $(Q)$(MAKE) -C $(LIB_DIR)/.. config.mk
+
+# Create expansions for dependencies
+LIB_H := ${LIB_OBJS:.o=.h}
+
+# Detect if any of common obj changed and create dependency on .h-files
+$(LIB_OBJS): %.o: %.c %.h $(LIB_H)
+ $(Q)$(MAKE) -C $(dir $@) $(notdir $@)
+
+ALL_EXEC_TARGETS=$(USER_TARGETS) $(TEST_TARGETS)
+$(ALL_EXEC_TARGETS): %: %.c $(OBJECT_LIBBPF) $(OBJECT_LIBXDP) $(LIBMK) $(LIB_OBJS) $(KERN_USER_H) $(EXTRA_DEPS) $(EXTRA_USER_DEPS) $(BPF_SKEL_H) $(USER_EXTRA_C)
+ $(QUIET_CC)$(CC) -Wall $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $(LIB_OBJS) \
+ $< $(USER_EXTRA_C) $(LDLIBS)
+
+$(XDP_OBJ): %.o: %.c $(KERN_USER_H) $(EXTRA_DEPS) $(BPF_HEADERS) $(LIBMK)
+ $(QUIET_CLANG)$(CLANG) -S \
+ -target $(BPF_TARGET) \
+ -D __BPF_TRACING__ \
+ $(BPF_CFLAGS) \
+ -Wall \
+ -Wno-unused-value \
+ -Wno-pointer-sign \
+ -Wno-compare-distinct-pointer-types \
+ -Werror \
+ -O2 -emit-llvm -c -g -o ${@:.o=.ll} $<
+ $(QUIET_LLC)$(LLC) -march=$(BPF_TARGET) -filetype=obj -o $@ ${@:.o=.ll}
+
+$(BPF_SKEL_H): %.skel.h: %.bpf.o
+ $(QUIET_GEN)$(BPFTOOL) gen skeleton $< name ${@:.skel.h=} > $@
+
+.PHONY: man
+ifeq ($(EMACS),)
+man: ;
+else
+man: $(MAN_PAGE)
+$(MAN_PAGE): README.org $(LIBMK) $(LIB_DIR)/export-man.el
+ $(QUIET_GEN)$(EMACS) -Q --batch --load "$(LIB_DIR)/export-man.el" \
+ --eval "(export-man-page \"$@\" \"$<\" \"$(HAVE_FEATURES)\" \"v$(TOOLS_VERSION)\")"
+endif
+
+.PHONY: test
+ifeq ($(TEST_FILE),)
+test:
+ @echo " No tests defined"
+else
+test: all
+ $(Q)$(TEST_DIR)/test_runner.sh $(TEST_FILE)
+endif