.. | .. |
---|
1 | 1 | # SPDX-License-Identifier: GPL-2.0 |
---|
| 2 | +include ../../../../scripts/Kbuild.include |
---|
| 3 | +include ../../../scripts/Makefile.arch |
---|
2 | 4 | |
---|
3 | | -LIBDIR := ../../../lib |
---|
| 5 | +CXX ?= $(CROSS_COMPILE)g++ |
---|
| 6 | + |
---|
| 7 | +CURDIR := $(abspath .) |
---|
| 8 | +TOOLSDIR := $(abspath ../../..) |
---|
| 9 | +LIBDIR := $(TOOLSDIR)/lib |
---|
4 | 10 | BPFDIR := $(LIBDIR)/bpf |
---|
5 | | -APIDIR := ../../../include/uapi |
---|
6 | | -GENDIR := ../../../../include/generated |
---|
| 11 | +TOOLSINCDIR := $(TOOLSDIR)/include |
---|
| 12 | +BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool |
---|
| 13 | +APIDIR := $(TOOLSINCDIR)/uapi |
---|
| 14 | +GENDIR := $(abspath ../../../../include/generated) |
---|
7 | 15 | GENHDR := $(GENDIR)/autoconf.h |
---|
8 | 16 | |
---|
9 | 17 | ifneq ($(wildcard $(GENHDR)),) |
---|
10 | 18 | GENFLAGS := -DHAVE_GENHDR |
---|
11 | 19 | endif |
---|
12 | 20 | |
---|
13 | | -CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include |
---|
14 | | -LDLIBS += -lcap -lelf -lrt -lpthread |
---|
15 | | - |
---|
16 | | -TEST_CUSTOM_PROGS = $(OUTPUT)/urandom_read |
---|
17 | | -all: $(TEST_CUSTOM_PROGS) |
---|
18 | | - |
---|
19 | | -$(TEST_CUSTOM_PROGS): $(OUTPUT)/%: %.c |
---|
20 | | - $(CC) -o $(TEST_CUSTOM_PROGS) -static $< -Wl,--build-id |
---|
| 21 | +CLANG ?= clang |
---|
| 22 | +LLC ?= llc |
---|
| 23 | +LLVM_OBJCOPY ?= llvm-objcopy |
---|
| 24 | +BPF_GCC ?= $(shell command -v bpf-gcc;) |
---|
| 25 | +SAN_CFLAGS ?= |
---|
| 26 | +CFLAGS += -g -rdynamic -Wall -O2 $(GENFLAGS) $(SAN_CFLAGS) \ |
---|
| 27 | + -I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \ |
---|
| 28 | + -I$(TOOLSINCDIR) -I$(APIDIR) \ |
---|
| 29 | + -Dbpf_prog_load=bpf_prog_test_load \ |
---|
| 30 | + -Dbpf_load_program=bpf_test_load_program |
---|
| 31 | +LDLIBS += -lcap -lelf -lz -lrt -lpthread |
---|
21 | 32 | |
---|
22 | 33 | # Order correspond to 'make run_tests' order |
---|
23 | 34 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ |
---|
24 | | - test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \ |
---|
25 | | - test_sock test_btf test_sockmap test_lirc_mode2_user get_cgroup_id_user \ |
---|
26 | | - test_socket_cookie test_cgroup_storage test_select_reuseport |
---|
| 35 | + test_verifier_log test_dev_cgroup test_tcpbpf_user \ |
---|
| 36 | + test_sock test_sockmap get_cgroup_id_user test_socket_cookie \ |
---|
| 37 | + test_cgroup_storage \ |
---|
| 38 | + test_netcnt test_tcpnotify_user test_sysctl \ |
---|
| 39 | + test_progs-no_alu32 \ |
---|
| 40 | + test_current_pid_tgid_new_ns |
---|
27 | 41 | |
---|
28 | | -TEST_GEN_FILES = test_pkt_access.o test_xdp.o test_l4lb.o test_tcp_estats.o test_obj_id.o \ |
---|
29 | | - test_pkt_md_access.o test_xdp_redirect.o test_xdp_meta.o sockmap_parse_prog.o \ |
---|
30 | | - sockmap_verdict_prog.o dev_cgroup.o sample_ret0.o test_tracepoint.o \ |
---|
31 | | - test_l4lb_noinline.o test_xdp_noinline.o test_stacktrace_map.o \ |
---|
32 | | - sample_map_ret0.o test_tcpbpf_kern.o test_stacktrace_build_id.o \ |
---|
33 | | - sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o test_adjust_tail.o \ |
---|
34 | | - test_btf_haskv.o test_btf_nokv.o test_sockmap_kern.o test_tunnel_kern.o \ |
---|
35 | | - test_get_stack_rawtp.o test_sockmap_kern.o test_sockhash_kern.o \ |
---|
36 | | - test_lwt_seg6local.o sendmsg4_prog.o sendmsg6_prog.o test_lirc_mode2_kern.o \ |
---|
37 | | - get_cgroup_id_kern.o socket_cookie_prog.o test_select_reuseport_kern.o \ |
---|
38 | | - test_skb_cgroup_id_kern.o |
---|
| 42 | +# Also test bpf-gcc, if present |
---|
| 43 | +ifneq ($(BPF_GCC),) |
---|
| 44 | +TEST_GEN_PROGS += test_progs-bpf_gcc |
---|
| 45 | +endif |
---|
| 46 | + |
---|
| 47 | +TEST_GEN_FILES = |
---|
| 48 | +TEST_FILES = test_lwt_ip_encap.o \ |
---|
| 49 | + test_tc_edt.o |
---|
39 | 50 | |
---|
40 | 51 | # Order correspond to 'make run_tests' order |
---|
41 | 52 | TEST_PROGS := test_kmod.sh \ |
---|
42 | | - test_libbpf.sh \ |
---|
43 | 53 | test_xdp_redirect.sh \ |
---|
44 | 54 | test_xdp_meta.sh \ |
---|
| 55 | + test_xdp_veth.sh \ |
---|
45 | 56 | test_offload.py \ |
---|
46 | 57 | test_sock_addr.sh \ |
---|
47 | 58 | test_tunnel.sh \ |
---|
48 | 59 | test_lwt_seg6local.sh \ |
---|
49 | 60 | test_lirc_mode2.sh \ |
---|
50 | | - test_skb_cgroup_id.sh |
---|
| 61 | + test_skb_cgroup_id.sh \ |
---|
| 62 | + test_flow_dissector.sh \ |
---|
| 63 | + test_xdp_vlan_mode_generic.sh \ |
---|
| 64 | + test_xdp_vlan_mode_native.sh \ |
---|
| 65 | + test_lwt_ip_encap.sh \ |
---|
| 66 | + test_tcp_check_syncookie.sh \ |
---|
| 67 | + test_tc_tunnel.sh \ |
---|
| 68 | + test_tc_edt.sh \ |
---|
| 69 | + test_xdping.sh \ |
---|
| 70 | + test_bpftool_build.sh \ |
---|
| 71 | + test_bpftool.sh \ |
---|
| 72 | + test_bpftool_metadata.sh \ |
---|
| 73 | + |
---|
| 74 | +TEST_PROGS_EXTENDED := with_addr.sh \ |
---|
| 75 | + with_tunnels.sh \ |
---|
| 76 | + tcp_client.py \ |
---|
| 77 | + tcp_server.py \ |
---|
| 78 | + test_xdp_vlan.sh |
---|
51 | 79 | |
---|
52 | 80 | # Compile but not part of 'make run_tests' |
---|
53 | | -TEST_GEN_PROGS_EXTENDED = test_libbpf_open test_sock_addr test_skb_cgroup_id_user |
---|
| 81 | +TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \ |
---|
| 82 | + flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \ |
---|
| 83 | + test_lirc_mode2_user xdping test_cpp runqslower bench |
---|
| 84 | + |
---|
| 85 | +TEST_CUSTOM_PROGS = urandom_read |
---|
| 86 | + |
---|
| 87 | +# Emit succinct information message describing current building step |
---|
| 88 | +# $1 - generic step name (e.g., CC, LINK, etc); |
---|
| 89 | +# $2 - optional "flavor" specifier; if provided, will be emitted as [flavor]; |
---|
| 90 | +# $3 - target (assumed to be file); only file name will be emitted; |
---|
| 91 | +# $4 - optional extra arg, emitted as-is, if provided. |
---|
| 92 | +ifeq ($(V),1) |
---|
| 93 | +Q = |
---|
| 94 | +msg = |
---|
| 95 | +else |
---|
| 96 | +Q = @ |
---|
| 97 | +msg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))"; |
---|
| 98 | +MAKEFLAGS += --no-print-directory |
---|
| 99 | +submake_extras := feature_display=0 |
---|
| 100 | +endif |
---|
| 101 | + |
---|
| 102 | +# override lib.mk's default rules |
---|
| 103 | +OVERRIDE_TARGETS := 1 |
---|
| 104 | +override define CLEAN |
---|
| 105 | + $(call msg,CLEAN) |
---|
| 106 | + $(Q)$(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN) |
---|
| 107 | +endef |
---|
54 | 108 | |
---|
55 | 109 | include ../lib.mk |
---|
56 | 110 | |
---|
57 | | -BPFOBJ := $(OUTPUT)/libbpf.a |
---|
| 111 | +SCRATCH_DIR := $(OUTPUT)/tools |
---|
| 112 | +BUILD_DIR := $(SCRATCH_DIR)/build |
---|
| 113 | +INCLUDE_DIR := $(SCRATCH_DIR)/include |
---|
| 114 | +BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a |
---|
| 115 | +RESOLVE_BTFIDS := $(BUILD_DIR)/resolve_btfids/resolve_btfids |
---|
58 | 116 | |
---|
59 | | -$(TEST_GEN_PROGS): $(BPFOBJ) |
---|
| 117 | +# Define simple and short `make test_progs`, `make test_sysctl`, etc targets |
---|
| 118 | +# to build individual tests. |
---|
| 119 | +# NOTE: Semicolon at the end is critical to override lib.mk's default static |
---|
| 120 | +# rule for binaries. |
---|
| 121 | +$(notdir $(TEST_GEN_PROGS) \ |
---|
| 122 | + $(TEST_PROGS) \ |
---|
| 123 | + $(TEST_PROGS_EXTENDED) \ |
---|
| 124 | + $(TEST_GEN_PROGS_EXTENDED) \ |
---|
| 125 | + $(TEST_CUSTOM_PROGS)): %: $(OUTPUT)/% ; |
---|
60 | 126 | |
---|
61 | | -$(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/libbpf.a |
---|
| 127 | +$(OUTPUT)/%.o: %.c |
---|
| 128 | + $(call msg,CC,,$@) |
---|
| 129 | + $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ |
---|
| 130 | + |
---|
| 131 | +$(OUTPUT)/%:%.c |
---|
| 132 | + $(call msg,BINARY,,$@) |
---|
| 133 | + $(Q)$(LINK.c) $^ $(LDLIBS) -o $@ |
---|
| 134 | + |
---|
| 135 | +$(OUTPUT)/urandom_read: urandom_read.c |
---|
| 136 | + $(call msg,BINARY,,$@) |
---|
| 137 | + $(Q)$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) -Wl,--build-id=sha1 |
---|
| 138 | + |
---|
| 139 | +$(OUTPUT)/test_stub.o: test_stub.c $(BPFOBJ) |
---|
| 140 | + $(call msg,CC,,$@) |
---|
| 141 | + $(Q)$(CC) -c $(CFLAGS) -o $@ $< |
---|
| 142 | + |
---|
| 143 | +VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ |
---|
| 144 | + $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ |
---|
| 145 | + ../../../../vmlinux \ |
---|
| 146 | + /sys/kernel/btf/vmlinux \ |
---|
| 147 | + /boot/vmlinux-$(shell uname -r) |
---|
| 148 | +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) |
---|
| 149 | +ifeq ($(VMLINUX_BTF),) |
---|
| 150 | +$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)") |
---|
| 151 | +endif |
---|
| 152 | + |
---|
| 153 | +DEFAULT_BPFTOOL := $(SCRATCH_DIR)/sbin/bpftool |
---|
| 154 | + |
---|
| 155 | +$(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) |
---|
| 156 | + $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ |
---|
| 157 | + OUTPUT=$(SCRATCH_DIR)/ VMLINUX_BTF=$(VMLINUX_BTF) \ |
---|
| 158 | + BPFOBJ=$(BPFOBJ) BPF_INCLUDE=$(INCLUDE_DIR) && \ |
---|
| 159 | + cp $(SCRATCH_DIR)/runqslower $@ |
---|
| 160 | + |
---|
| 161 | +$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) |
---|
62 | 162 | |
---|
63 | 163 | $(OUTPUT)/test_dev_cgroup: cgroup_helpers.c |
---|
64 | 164 | $(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c |
---|
.. | .. |
---|
67 | 167 | $(OUTPUT)/test_socket_cookie: cgroup_helpers.c |
---|
68 | 168 | $(OUTPUT)/test_sockmap: cgroup_helpers.c |
---|
69 | 169 | $(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c |
---|
70 | | -$(OUTPUT)/test_progs: trace_helpers.c |
---|
| 170 | +$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c |
---|
71 | 171 | $(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c |
---|
72 | 172 | $(OUTPUT)/test_cgroup_storage: cgroup_helpers.c |
---|
| 173 | +$(OUTPUT)/test_netcnt: cgroup_helpers.c |
---|
| 174 | +$(OUTPUT)/test_sock_fields: cgroup_helpers.c |
---|
| 175 | +$(OUTPUT)/test_sysctl: cgroup_helpers.c |
---|
73 | 176 | |
---|
74 | | -.PHONY: force |
---|
| 177 | +BPFTOOL ?= $(DEFAULT_BPFTOOL) |
---|
| 178 | +$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ |
---|
| 179 | + $(BPFOBJ) | $(BUILD_DIR)/bpftool |
---|
| 180 | + $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ |
---|
| 181 | + OUTPUT=$(BUILD_DIR)/bpftool/ \ |
---|
| 182 | + prefix= DESTDIR=$(SCRATCH_DIR)/ install |
---|
| 183 | + $(Q)mkdir -p $(BUILD_DIR)/bpftool/Documentation |
---|
| 184 | + $(Q)RST2MAN_OPTS="--exit-status=1" $(MAKE) $(submake_extras) \ |
---|
| 185 | + -C $(BPFTOOLDIR)/Documentation \ |
---|
| 186 | + OUTPUT=$(BUILD_DIR)/bpftool/Documentation/ \ |
---|
| 187 | + prefix= DESTDIR=$(SCRATCH_DIR)/ install |
---|
75 | 188 | |
---|
76 | | -# force a rebuild of BPFOBJ when its dependencies are updated |
---|
77 | | -force: |
---|
| 189 | +$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ |
---|
| 190 | + ../../../include/uapi/linux/bpf.h \ |
---|
| 191 | + | $(INCLUDE_DIR) $(BUILD_DIR)/libbpf |
---|
| 192 | + $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \ |
---|
| 193 | + DESTDIR=$(SCRATCH_DIR) prefix= all install_headers |
---|
78 | 194 | |
---|
79 | | -$(BPFOBJ): force |
---|
80 | | - $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ |
---|
| 195 | +$(BUILD_DIR)/libbpf $(BUILD_DIR)/bpftool $(BUILD_DIR)/resolve_btfids $(INCLUDE_DIR): |
---|
| 196 | + $(call msg,MKDIR,,$@) |
---|
| 197 | + $(Q)mkdir -p $@ |
---|
81 | 198 | |
---|
82 | | -CLANG ?= clang |
---|
83 | | -LLC ?= llc |
---|
84 | | -LLVM_OBJCOPY ?= llvm-objcopy |
---|
85 | | -BTF_PAHOLE ?= pahole |
---|
86 | | - |
---|
87 | | -PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1) |
---|
88 | | - |
---|
89 | | -# Let newer LLVM versions transparently probe the kernel for availability |
---|
90 | | -# of full BPF instruction set. |
---|
91 | | -ifeq ($(PROBE),) |
---|
92 | | - CPU ?= probe |
---|
| 199 | +$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR) |
---|
| 200 | +ifeq ($(VMLINUX_H),) |
---|
| 201 | + $(call msg,GEN,,$@) |
---|
| 202 | + $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@ |
---|
93 | 203 | else |
---|
94 | | - CPU ?= generic |
---|
| 204 | + $(call msg,CP,,$@) |
---|
| 205 | + $(Q)cp "$(VMLINUX_H)" $@ |
---|
95 | 206 | endif |
---|
| 207 | + |
---|
| 208 | +$(RESOLVE_BTFIDS): $(BPFOBJ) | $(BUILD_DIR)/resolve_btfids \ |
---|
| 209 | + $(TOOLSDIR)/bpf/resolve_btfids/main.c \ |
---|
| 210 | + $(TOOLSDIR)/lib/rbtree.c \ |
---|
| 211 | + $(TOOLSDIR)/lib/zalloc.c \ |
---|
| 212 | + $(TOOLSDIR)/lib/string.c \ |
---|
| 213 | + $(TOOLSDIR)/lib/ctype.c \ |
---|
| 214 | + $(TOOLSDIR)/lib/str_error_r.c |
---|
| 215 | + $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \ |
---|
| 216 | + OUTPUT=$(BUILD_DIR)/resolve_btfids/ BPFOBJ=$(BPFOBJ) |
---|
96 | 217 | |
---|
97 | 218 | # Get Clang's default includes on this system, as opposed to those seen by |
---|
98 | 219 | # '-target bpf'. This fixes "missing" files on some architectures/distros, |
---|
.. | .. |
---|
100 | 221 | # |
---|
101 | 222 | # Use '-idirafter': Don't interfere with include mechanics except where the |
---|
102 | 223 | # build would have failed anyways. |
---|
103 | | -CLANG_SYS_INCLUDES := $(shell $(CLANG) -v -E - </dev/null 2>&1 \ |
---|
104 | | - | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') |
---|
| 224 | +define get_sys_includes |
---|
| 225 | +$(shell $(1) -v -E - </dev/null 2>&1 \ |
---|
| 226 | + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ |
---|
| 227 | +$(shell $(1) -dM -E - </dev/null | grep '#define __riscv_xlen ' | sed 's/#define /-D/' | sed 's/ /=/') |
---|
| 228 | +endef |
---|
105 | 229 | |
---|
106 | | -CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \ |
---|
107 | | - $(CLANG_SYS_INCLUDES) \ |
---|
108 | | - -Wno-compare-distinct-pointer-types |
---|
| 230 | +# Determine target endianness. |
---|
| 231 | +IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \ |
---|
| 232 | + grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__') |
---|
| 233 | +MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) |
---|
109 | 234 | |
---|
110 | | -$(OUTPUT)/test_l4lb_noinline.o: CLANG_FLAGS += -fno-inline |
---|
111 | | -$(OUTPUT)/test_xdp_noinline.o: CLANG_FLAGS += -fno-inline |
---|
| 235 | +CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) |
---|
| 236 | +BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ |
---|
| 237 | + -I$(INCLUDE_DIR) -I$(CURDIR) -I$(APIDIR) \ |
---|
| 238 | + -I$(abspath $(OUTPUT)/../usr/include) |
---|
112 | 239 | |
---|
113 | | -BTF_LLC_PROBE := $(shell $(LLC) -march=bpf -mattr=help 2>&1 | grep dwarfris) |
---|
114 | | -BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help 2>&1 | grep BTF) |
---|
115 | | -BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --help 2>&1 | grep -i 'usage.*llvm') |
---|
| 240 | +CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ |
---|
| 241 | + -Wno-compare-distinct-pointer-types |
---|
116 | 242 | |
---|
117 | | -ifneq ($(BTF_LLC_PROBE),) |
---|
118 | | -ifneq ($(BTF_PAHOLE_PROBE),) |
---|
119 | | -ifneq ($(BTF_OBJCOPY_PROBE),) |
---|
120 | | - CLANG_FLAGS += -g |
---|
121 | | - LLC_FLAGS += -mattr=dwarfris |
---|
122 | | - DWARF2BTF = y |
---|
123 | | -endif |
---|
124 | | -endif |
---|
| 243 | +$(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline |
---|
| 244 | +$(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline |
---|
| 245 | + |
---|
| 246 | +$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h |
---|
| 247 | + |
---|
| 248 | +# Build BPF object using Clang |
---|
| 249 | +# $1 - input .c file |
---|
| 250 | +# $2 - output .o file |
---|
| 251 | +# $3 - CFLAGS |
---|
| 252 | +# $4 - LDFLAGS |
---|
| 253 | +define CLANG_BPF_BUILD_RULE |
---|
| 254 | + $(call msg,CLNG-LLC,$(TRUNNER_BINARY),$2) |
---|
| 255 | + $(Q)($(CLANG) $3 -O2 -target bpf -emit-llvm \ |
---|
| 256 | + -c $1 -o - || echo "BPF obj compilation failed") | \ |
---|
| 257 | + $(LLC) -mattr=dwarfris -march=bpf -mcpu=v3 $4 -filetype=obj -o $2 |
---|
| 258 | +endef |
---|
| 259 | +# Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32 |
---|
| 260 | +define CLANG_NOALU32_BPF_BUILD_RULE |
---|
| 261 | + $(call msg,CLNG-LLC,$(TRUNNER_BINARY),$2) |
---|
| 262 | + $(Q)($(CLANG) $3 -O2 -target bpf -emit-llvm \ |
---|
| 263 | + -c $1 -o - || echo "BPF obj compilation failed") | \ |
---|
| 264 | + $(LLC) -march=bpf -mcpu=v2 $4 -filetype=obj -o $2 |
---|
| 265 | +endef |
---|
| 266 | +# Similar to CLANG_BPF_BUILD_RULE, but using native Clang and bpf LLC |
---|
| 267 | +define CLANG_NATIVE_BPF_BUILD_RULE |
---|
| 268 | + $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) |
---|
| 269 | + $(Q)($(CLANG) $3 -O2 -emit-llvm \ |
---|
| 270 | + -c $1 -o - || echo "BPF obj compilation failed") | \ |
---|
| 271 | + $(LLC) -march=bpf -mcpu=v3 $4 -filetype=obj -o $2 |
---|
| 272 | +endef |
---|
| 273 | +# Build BPF object using GCC |
---|
| 274 | +define GCC_BPF_BUILD_RULE |
---|
| 275 | + $(call msg,GCC-BPF,$(TRUNNER_BINARY),$2) |
---|
| 276 | + $(Q)$(BPF_GCC) $3 $4 -O2 -c $1 -o $2 |
---|
| 277 | +endef |
---|
| 278 | + |
---|
| 279 | +SKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c |
---|
| 280 | + |
---|
| 281 | +# Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on |
---|
| 282 | +# $eval()) and pass control to DEFINE_TEST_RUNNER_RULES. |
---|
| 283 | +# Parameters: |
---|
| 284 | +# $1 - test runner base binary name (e.g., test_progs) |
---|
| 285 | +# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc) |
---|
| 286 | +define DEFINE_TEST_RUNNER |
---|
| 287 | + |
---|
| 288 | +TRUNNER_OUTPUT := $(OUTPUT)$(if $2,/)$2 |
---|
| 289 | +TRUNNER_BINARY := $1$(if $2,-)$2 |
---|
| 290 | +TRUNNER_TEST_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.test.o, \ |
---|
| 291 | + $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c))) |
---|
| 292 | +TRUNNER_EXTRA_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \ |
---|
| 293 | + $$(filter %.c,$(TRUNNER_EXTRA_SOURCES))) |
---|
| 294 | +TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES)) |
---|
| 295 | +TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h |
---|
| 296 | +TRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c)) |
---|
| 297 | +TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, $$(TRUNNER_BPF_SRCS)) |
---|
| 298 | +TRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h, \ |
---|
| 299 | + $$(filter-out $(SKEL_BLACKLIST), \ |
---|
| 300 | + $$(TRUNNER_BPF_SRCS))) |
---|
| 301 | +TEST_GEN_FILES += $$(TRUNNER_BPF_OBJS) |
---|
| 302 | + |
---|
| 303 | +# Evaluate rules now with extra TRUNNER_XXX variables above already defined |
---|
| 304 | +$$(eval $$(call DEFINE_TEST_RUNNER_RULES,$1,$2)) |
---|
| 305 | + |
---|
| 306 | +endef |
---|
| 307 | + |
---|
| 308 | +# Using TRUNNER_XXX variables, provided by callers of DEFINE_TEST_RUNNER and |
---|
| 309 | +# set up by DEFINE_TEST_RUNNER itself, create test runner build rules with: |
---|
| 310 | +# $1 - test runner base binary name (e.g., test_progs) |
---|
| 311 | +# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc) |
---|
| 312 | +define DEFINE_TEST_RUNNER_RULES |
---|
| 313 | + |
---|
| 314 | +ifeq ($($(TRUNNER_OUTPUT)-dir),) |
---|
| 315 | +$(TRUNNER_OUTPUT)-dir := y |
---|
| 316 | +$(TRUNNER_OUTPUT): |
---|
| 317 | + $$(call msg,MKDIR,,$$@) |
---|
| 318 | + $(Q)mkdir -p $$@ |
---|
125 | 319 | endif |
---|
126 | 320 | |
---|
127 | | -# Have one program compiled without "-target bpf" to test whether libbpf loads |
---|
128 | | -# it successfully |
---|
129 | | -$(OUTPUT)/test_xdp.o: test_xdp.c |
---|
130 | | - $(CLANG) $(CLANG_FLAGS) \ |
---|
131 | | - -O2 -emit-llvm -c $< -o - | \ |
---|
132 | | - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ |
---|
133 | | -ifeq ($(DWARF2BTF),y) |
---|
134 | | - $(BTF_PAHOLE) -J $@ |
---|
| 321 | +# ensure we set up BPF objects generation rule just once for a given |
---|
| 322 | +# input/output directory combination |
---|
| 323 | +ifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),) |
---|
| 324 | +$(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y |
---|
| 325 | +$(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.o: \ |
---|
| 326 | + $(TRUNNER_BPF_PROGS_DIR)/%.c \ |
---|
| 327 | + $(TRUNNER_BPF_PROGS_DIR)/*.h \ |
---|
| 328 | + $$(INCLUDE_DIR)/vmlinux.h \ |
---|
| 329 | + $(wildcard $(BPFDIR)/bpf_*.h) \ |
---|
| 330 | + | $(TRUNNER_OUTPUT) $$(BPFOBJ) |
---|
| 331 | + $$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@, \ |
---|
| 332 | + $(TRUNNER_BPF_CFLAGS), \ |
---|
| 333 | + $(TRUNNER_BPF_LDFLAGS)) |
---|
| 334 | + |
---|
| 335 | +$(TRUNNER_BPF_SKELS): $(TRUNNER_OUTPUT)/%.skel.h: \ |
---|
| 336 | + $(TRUNNER_OUTPUT)/%.o \ |
---|
| 337 | + $(BPFTOOL) \ |
---|
| 338 | + | $(TRUNNER_OUTPUT) |
---|
| 339 | + $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@) |
---|
| 340 | + $(Q)$$(BPFTOOL) gen skeleton $$< > $$@ |
---|
135 | 341 | endif |
---|
136 | 342 | |
---|
137 | | -$(OUTPUT)/%.o: %.c |
---|
138 | | - $(CLANG) $(CLANG_FLAGS) \ |
---|
139 | | - -O2 -target bpf -emit-llvm -c $< -o - | \ |
---|
140 | | - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ |
---|
141 | | -ifeq ($(DWARF2BTF),y) |
---|
142 | | - $(BTF_PAHOLE) -J $@ |
---|
| 343 | +# ensure we set up tests.h header generation rule just once |
---|
| 344 | +ifeq ($($(TRUNNER_TESTS_DIR)-tests-hdr),) |
---|
| 345 | +$(TRUNNER_TESTS_DIR)-tests-hdr := y |
---|
| 346 | +$(TRUNNER_TESTS_HDR): $(TRUNNER_TESTS_DIR)/*.c |
---|
| 347 | + $$(call msg,TEST-HDR,$(TRUNNER_BINARY),$$@) |
---|
| 348 | + $$(shell ( cd $(TRUNNER_TESTS_DIR); \ |
---|
| 349 | + echo '/* Generated header, do not edit */'; \ |
---|
| 350 | + ls *.c 2> /dev/null | \ |
---|
| 351 | + sed -e 's@\([^\.]*\)\.c@DEFINE_TEST(\1)@'; \ |
---|
| 352 | + ) > $$@) |
---|
143 | 353 | endif |
---|
144 | 354 | |
---|
145 | | -EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) |
---|
| 355 | +# compile individual test files |
---|
| 356 | +# Note: we cd into output directory to ensure embedded BPF object is found |
---|
| 357 | +$(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \ |
---|
| 358 | + $(TRUNNER_TESTS_DIR)/%.c \ |
---|
| 359 | + $(TRUNNER_EXTRA_HDRS) \ |
---|
| 360 | + $(TRUNNER_BPF_OBJS) \ |
---|
| 361 | + $(TRUNNER_BPF_SKELS) \ |
---|
| 362 | + $$(BPFOBJ) | $(TRUNNER_OUTPUT) |
---|
| 363 | + $$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@) |
---|
| 364 | + $(Q)cd $$(@D) && $$(CC) -I. $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F) |
---|
| 365 | + |
---|
| 366 | +$(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \ |
---|
| 367 | + %.c \ |
---|
| 368 | + $(TRUNNER_EXTRA_HDRS) \ |
---|
| 369 | + $(TRUNNER_TESTS_HDR) \ |
---|
| 370 | + $$(BPFOBJ) | $(TRUNNER_OUTPUT) |
---|
| 371 | + $$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@) |
---|
| 372 | + $(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ |
---|
| 373 | + |
---|
| 374 | +# only copy extra resources if in flavored build |
---|
| 375 | +$(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT) |
---|
| 376 | +ifneq ($2,) |
---|
| 377 | + $$(call msg,EXT-COPY,$(TRUNNER_BINARY),$(TRUNNER_EXTRA_FILES)) |
---|
| 378 | + $(Q)cp -a $$^ $(TRUNNER_OUTPUT)/ |
---|
| 379 | +endif |
---|
| 380 | + |
---|
| 381 | +$(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \ |
---|
| 382 | + $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \ |
---|
| 383 | + $(RESOLVE_BTFIDS) \ |
---|
| 384 | + | $(TRUNNER_BINARY)-extras |
---|
| 385 | + $$(call msg,BINARY,,$$@) |
---|
| 386 | + $(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@ |
---|
| 387 | + $(Q)$(RESOLVE_BTFIDS) --no-fail --btf btf_data.o $$@ |
---|
| 388 | + |
---|
| 389 | +endef |
---|
| 390 | + |
---|
| 391 | +# Define test_progs test runner. |
---|
| 392 | +TRUNNER_TESTS_DIR := prog_tests |
---|
| 393 | +TRUNNER_BPF_PROGS_DIR := progs |
---|
| 394 | +TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \ |
---|
| 395 | + network_helpers.c testing_helpers.c \ |
---|
| 396 | + flow_dissector_load.h |
---|
| 397 | +TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \ |
---|
| 398 | + $(wildcard progs/btf_dump_test_case_*.c) |
---|
| 399 | +TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE |
---|
| 400 | +TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) |
---|
| 401 | +TRUNNER_BPF_LDFLAGS := -mattr=+alu32 |
---|
| 402 | +$(eval $(call DEFINE_TEST_RUNNER,test_progs)) |
---|
| 403 | + |
---|
| 404 | +# Define test_progs-no_alu32 test runner. |
---|
| 405 | +TRUNNER_BPF_BUILD_RULE := CLANG_NOALU32_BPF_BUILD_RULE |
---|
| 406 | +TRUNNER_BPF_LDFLAGS := |
---|
| 407 | +$(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32)) |
---|
| 408 | + |
---|
| 409 | +# Define test_progs BPF-GCC-flavored test runner. |
---|
| 410 | +ifneq ($(BPF_GCC),) |
---|
| 411 | +TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE |
---|
| 412 | +TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc) |
---|
| 413 | +TRUNNER_BPF_LDFLAGS := |
---|
| 414 | +$(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc)) |
---|
| 415 | +endif |
---|
| 416 | + |
---|
| 417 | +# Define test_maps test runner. |
---|
| 418 | +TRUNNER_TESTS_DIR := map_tests |
---|
| 419 | +TRUNNER_BPF_PROGS_DIR := progs |
---|
| 420 | +TRUNNER_EXTRA_SOURCES := test_maps.c |
---|
| 421 | +TRUNNER_EXTRA_FILES := |
---|
| 422 | +TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built) |
---|
| 423 | +TRUNNER_BPF_CFLAGS := |
---|
| 424 | +TRUNNER_BPF_LDFLAGS := |
---|
| 425 | +$(eval $(call DEFINE_TEST_RUNNER,test_maps)) |
---|
| 426 | + |
---|
| 427 | +# Define test_verifier test runner. |
---|
| 428 | +# It is much simpler than test_maps/test_progs and sufficiently different from |
---|
| 429 | +# them (e.g., test.h is using completely pattern), that it's worth just |
---|
| 430 | +# explicitly defining all the rules explicitly. |
---|
| 431 | +verifier/tests.h: verifier/*.c |
---|
| 432 | + $(shell ( cd verifier/; \ |
---|
| 433 | + echo '/* Generated header, do not edit */'; \ |
---|
| 434 | + echo '#ifdef FILL_ARRAY'; \ |
---|
| 435 | + ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \ |
---|
| 436 | + echo '#endif' \ |
---|
| 437 | + ) > verifier/tests.h) |
---|
| 438 | +$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT) |
---|
| 439 | + $(call msg,BINARY,,$@) |
---|
| 440 | + $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ |
---|
| 441 | + |
---|
| 442 | +# Make sure we are able to include and link libbpf against c++. |
---|
| 443 | +$(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ) |
---|
| 444 | + $(call msg,CXX,,$@) |
---|
| 445 | + $(Q)$(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@ |
---|
| 446 | + |
---|
| 447 | +# Benchmark runner |
---|
| 448 | +$(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h |
---|
| 449 | + $(call msg,CC,,$@) |
---|
| 450 | + $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ |
---|
| 451 | +$(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h |
---|
| 452 | +$(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h |
---|
| 453 | +$(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \ |
---|
| 454 | + $(OUTPUT)/perfbuf_bench.skel.h |
---|
| 455 | +$(OUTPUT)/bench.o: bench.h testing_helpers.h |
---|
| 456 | +$(OUTPUT)/bench: LDLIBS += -lm |
---|
| 457 | +$(OUTPUT)/bench: $(OUTPUT)/bench.o $(OUTPUT)/testing_helpers.o \ |
---|
| 458 | + $(OUTPUT)/bench_count.o \ |
---|
| 459 | + $(OUTPUT)/bench_rename.o \ |
---|
| 460 | + $(OUTPUT)/bench_trigger.o \ |
---|
| 461 | + $(OUTPUT)/bench_ringbufs.o |
---|
| 462 | + $(call msg,BINARY,,$@) |
---|
| 463 | + $(Q)$(CC) $(LDFLAGS) -o $@ $(filter %.a %.o,$^) $(LDLIBS) |
---|
| 464 | + |
---|
| 465 | +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) \ |
---|
| 466 | + prog_tests/tests.h map_tests/tests.h verifier/tests.h \ |
---|
| 467 | + feature \ |
---|
| 468 | + $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc) |
---|