summaryrefslogtreecommitdiff
path: root/src/xdp/common/common.mk
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-12-18 17:13:13 +0100
committerChristian Poessinger <christian@poessinger.com>2020-12-19 21:56:19 +0100
commitb5c80d310527223b93e4133ac2f4c8c063c70a98 (patch)
tree48ae9e2752b4b94c07f767a019c99a8c2460c014 /src/xdp/common/common.mk
parent22308b05dfbcd8da0230bbd8ba3bbc2a55da7786 (diff)
downloadvyos-1x-b5c80d310527223b93e4133ac2f4c8c063c70a98.tar.gz
vyos-1x-b5c80d310527223b93e4133ac2f4c8c063c70a98.zip
xdp: T2666: switch to example code provided by xdp-tutorial
Diffstat (limited to 'src/xdp/common/common.mk')
-rw-r--r--src/xdp/common/common.mk103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/xdp/common/common.mk b/src/xdp/common/common.mk
new file mode 100644
index 000000000..89aac68ef
--- /dev/null
+++ b/src/xdp/common/common.mk
@@ -0,0 +1,103 @@
+# 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:
+# COMMON_DIR = ../common/
+# include $(COMMON_DIR)/common.mk
+#
+# It is expected that you define the variables:
+# XDP_TARGETS and USER_TARGETS
+# as a space-separated list
+#
+LLC ?= llc
+CLANG ?= clang
+CC ?= gcc
+
+XDP_C = ${XDP_TARGETS:=.c}
+XDP_OBJ = ${XDP_C:.c=.o}
+USER_C := ${USER_TARGETS:=.c}
+USER_OBJ := ${USER_C:.c=.o}
+
+# Expect this is defined by including Makefile, but define if not
+COMMON_DIR ?= ../common/
+
+COPY_LOADER ?=
+LOADER_DIR ?= $(COMMON_DIR)/../utils
+
+# Extend if including Makefile already added some
+COMMON_OBJS += $(COMMON_DIR)/common_params.o $(COMMON_DIR)/common_user_bpf_xdp.o
+
+# Create expansions for dependencies
+COMMON_H := ${COMMON_OBJS:.o=.h}
+
+EXTRA_DEPS +=
+
+# BPF-prog kern and userspace shares struct via header file:
+KERN_USER_H ?= $(wildcard common_kern_user.h)
+
+CFLAGS ?= -g -I../include/
+BPF_CFLAGS ?= -I../include/
+
+LIBS = -l:libbpf.a -lelf -lz $(USER_LIBS)
+
+all: llvm-check $(USER_TARGETS) $(XDP_OBJ) $(COPY_LOADER) $(COPY_STATS)
+
+.PHONY: clean $(CLANG) $(LLC)
+
+clean:
+ $(MAKE) -C $(COMMON_DIR) clean
+ rm -f $(USER_TARGETS) $(XDP_OBJ) $(USER_OBJ) $(COPY_LOADER) $(COPY_STATS)
+ rm -f *.ll
+ rm -f *~
+
+ifdef COPY_LOADER
+$(COPY_LOADER): $(LOADER_DIR)/${COPY_LOADER:=.c} $(COMMON_H)
+ make -C $(LOADER_DIR) $(COPY_LOADER)
+ cp $(LOADER_DIR)/$(COPY_LOADER) $(COPY_LOADER)
+endif
+
+ifdef COPY_STATS
+$(COPY_STATS): $(LOADER_DIR)/${COPY_STATS:=.c} $(COMMON_H)
+ make -C $(LOADER_DIR) $(COPY_STATS)
+ cp $(LOADER_DIR)/$(COPY_STATS) $(COPY_STATS)
+# Needing xdp_stats imply depending on header files:
+EXTRA_DEPS += $(COMMON_DIR)/xdp_stats_kern.h $(COMMON_DIR)/xdp_stats_kern_user.h
+endif
+
+# For build dependency on this file, if it gets updated
+COMMON_MK = $(COMMON_DIR)/common.mk
+
+llvm-check: $(CLANG) $(LLC)
+ @for TOOL in $^ ; do \
+ if [ ! $$(command -v $${TOOL} 2>/dev/null) ]; then \
+ echo "*** ERROR: Cannot find tool $${TOOL}" ;\
+ exit 1; \
+ else true; fi; \
+ done
+
+# Create dependency: detect if C-file change and touch H-file, to trigger
+# target $(COMMON_OBJS)
+$(COMMON_H): %.h: %.c
+ touch $@
+
+# Detect if any of common obj changed and create dependency on .h-files
+$(COMMON_OBJS): %.o: %.h
+ make -C $(COMMON_DIR)
+
+$(USER_TARGETS): %: %.c Makefile $(COMMON_MK) $(COMMON_OBJS) $(KERN_USER_H) $(EXTRA_DEPS)
+ $(CC) -Wall $(CFLAGS) $(LDFLAGS) -o $@ $(COMMON_OBJS) \
+ $< $(LIBS)
+
+$(XDP_OBJ): %.o: %.c Makefile $(COMMON_MK) $(KERN_USER_H) $(EXTRA_DEPS)
+ $(CLANG) -S \
+ -target bpf \
+ -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} $<
+ $(LLC) -march=bpf -filetype=obj -o $@ ${@:.o=.ll}