CC = clang LIBBPF_LIBXDP_STATIC ?= 0 # Top-level directories. BUILD_DIR = build SRC_DIR = src MODULES_DIR = modules # Common directories. COMMON_DIR = $(SRC_DIR)/common LOADER_DIR = $(SRC_DIR)/loader XDP_DIR = $(SRC_DIR)/xdp # Additional build directories. BUILD_LOADER_DIR = $(BUILD_DIR)/loader BUILD_XDP_DIR = $(BUILD_DIR)/xdp # XDP Tools directories. XDP_TOOLS_DIR = $(MODULES_DIR)/xdp-tools XDP_TOOLS_HEADERS = $(XDP_TOOLS_DIR)/headers # LibXDP and LibBPF directories. LIBXDP_DIR = $(XDP_TOOLS_DIR)/lib/libxdp LIBBPF_DIR = $(XDP_TOOLS_DIR)/lib/libbpf LIBBPF_SRC = $(LIBBPF_DIR)/src # LibBPF objects. LIBBPF_OBJS = $(LIBBPF_SRC)/staticobjs/bpf_prog_linfo.o $(LIBBPF_SRC)/staticobjs/bpf.o $(LIBBPF_SRC)/staticobjs/btf_dump.o LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/btf.o $(LIBBPF_SRC)/staticobjs/gen_loader.o $(LIBBPF_SRC)/staticobjs/hashmap.o LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/libbpf_errno.o $(LIBBPF_SRC)/staticobjs/libbpf_probes.o $(LIBBPF_SRC)/staticobjs/libbpf.o LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/linker.o $(LIBBPF_SRC)/staticobjs/netlink.o $(LIBBPF_SRC)/staticobjs/nlattr.o LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/relo_core.o $(LIBBPF_SRC)/staticobjs/ringbuf.o $(LIBBPF_SRC)/staticobjs/str_error.o LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/strset.o $(LIBBPF_SRC)/staticobjs/usdt.o $(LIBBPF_SRC)/staticobjs/zip.o # LibXDP objects. # To Do: Figure out why static objects produces errors relating to unreferenced functions with dispatcher. LIBXDP_OBJS = $(LIBXDP_DIR)/sharedobjs/xsk.o $(LIBXDP_DIR)/sharedobjs/libxdp.o # Loader directories. LOADER_SRC = prog.c LOADER_OUT = xdpfw LOADER_UTILS_DIR = $(LOADER_DIR)/utils # Loader utils. LOADER_UTILS_CONFIG_SRC = config.c LOADER_UTILS_CONFIG_OBJ = config.o LOADER_UTILS_CMDLINE_SRC = cmdline.c LOADER_UTILS_CMDLINE_OBJ = cmdline.o LOADER_UTILS_HELPERS_SRC = helpers.c LOADER_UTILS_HELPERS_OBJ = helpers.o # Loader objects. LOADER_OBJS = $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CONFIG_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CMDLINE_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_HELPERS_OBJ) ifeq ($(LIBBPF_LIBXDP_STATIC), 1) LOADER_OBJS := $(LIBBPF_OBJS) $(LIBXDP_OBJS) $(LOADER_OBJS) endif # XDP directories. XDP_SRC = prog.c XDP_OBJ = xdp_prog.o XDP_UTILS_DIR = $(XDP_DIR)/utils # XDP utils. XDP_UTILS_HELPERS_SRC = helpers.c XDP_UTILS_HELPERS_OBJ = helpers.o XDP_UTILS_RL_SRC = rl.c XDP_UTILS_RL_OBJ = rl.o # Includes. INCS = -I $(SRC_DIR) -I $(LIBBPF_SRC) -I /usr/include -I /usr/local/include # Flags. FLAGS = -O2 -g FLAGS_LOADER = -lconfig -lelf -lz ifeq ($(LIBBPF_LIBXDP_STATIC), 0) FLAGS_LOADER += -lbpf -lxdp endif # All chains. all: loader xdp # Loader program. loader: libxdp loader_utils $(CC) $(INCS) $(FLAGS) $(FLAGS_LOADER) -o $(BUILD_LOADER_DIR)/$(LOADER_OUT) $(LOADER_OBJS) $(LOADER_DIR)/$(LOADER_SRC) loader_utils: loader_utils_config loader_utils_cmdline loader_utils_helpers loader_utils_config: $(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CONFIG_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_CONFIG_SRC) loader_utils_cmdline: $(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CMDLINE_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_CMDLINE_SRC) loader_utils_helpers: $(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_HELPERS_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_HELPERS_SRC) # XDP program. xdp: $(CC) $(INCS) $(FLAGS) -target bpf -c -o $(BUILD_XDP_DIR)/$(XDP_OBJ) $(XDP_DIR)/$(XDP_SRC) # LibXDP chain. We need to install objects here since our program relies on installed object files and such. libxdp: $(MAKE) -C $(XDP_TOOLS_DIR) libxdp sudo $(MAKE) -C $(LIBBPF_SRC) install sudo $(MAKE) -C $(LIBXDP_DIR) install clean: $(MAKE) -C $(XDP_TOOLS_DIR) clean $(MAKE) -C $(LIBBPF_SRC) clean find $(BUILD_DIR) -type f ! -name ".*" -exec rm -f {} + find $(BUILD_LOADER_DIR) -type f ! -name ".*" -exec rm -f {} + find $(BUILD_XDP_DIR) -type f ! -name ".*" -exec rm -f {} + install: mkdir -p /etc/xdpfw/ cp -n xdpfw.conf.example /etc/xdpfw/xdpfw.conf cp -f $(BUILD_LOADER_DIR)/$(LOADER_OUT) /usr/bin cp -f $(BUILD_XDP_DIR)/$(XDP_OBJ) /etc/xdpfw cp -n other/xdpfw.service /etc/systemd/system/ .PHONY: all libxdp .DEFAULT: all