Commit | Line | Data |
---|---|---|
b2441318 | 1 | # SPDX-License-Identifier: GPL-2.0 |
9cae4ace | 2 | include ../../../../scripts/Kbuild.include |
748e50c1 | 3 | include ../../../scripts/Makefile.arch |
618e165b | 4 | |
e7ad28e6 IL |
5 | CXX ?= $(CROSS_COMPILE)g++ |
6 | ||
74b5a596 | 7 | CURDIR := $(abspath .) |
f3c926a4 AN |
8 | TOOLSDIR := $(abspath ../../..) |
9 | LIBDIR := $(TOOLSDIR)/lib | |
e8f1f34a | 10 | BPFDIR := $(LIBDIR)/bpf |
f3c926a4 AN |
11 | TOOLSINCDIR := $(TOOLSDIR)/include |
12 | BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool | |
13 | APIDIR := $(TOOLSINCDIR)/uapi | |
74b5a596 | 14 | GENDIR := $(abspath ../../../../include/generated) |
02ea80b1 | 15 | GENHDR := $(GENDIR)/autoconf.h |
d498f871 | 16 | |
02ea80b1 DB |
17 | ifneq ($(wildcard $(GENHDR)),) |
18 | GENFLAGS := -DHAVE_GENHDR | |
19 | endif | |
20 | ||
3ef84346 JW |
21 | CLANG ?= clang |
22 | LLC ?= llc | |
23 | LLVM_OBJCOPY ?= llvm-objcopy | |
4ce150b6 | 24 | BPF_GCC ?= $(shell command -v bpf-gcc;) |
02995dd4 AN |
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) \ | |
74b5a596 | 29 | -Dbpf_prog_load=bpf_prog_test_load \ |
9d120b41 | 30 | -Dbpf_load_program=bpf_test_load_program |
166750bc | 31 | LDLIBS += -lcap -lelf -lz -lrt -lpthread |
5aa5bd14 | 32 | |
f09b2e38 | 33 | # Order correspond to 'make run_tests' order |
18b3ad90 | 34 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ |
5597432d | 35 | test_verifier_log test_dev_cgroup test_tcpbpf_user \ |
c64779e2 | 36 | test_sock test_sockmap get_cgroup_id_user test_socket_cookie \ |
415bb4e1 | 37 | test_cgroup_storage \ |
42fce2cf | 38 | test_netcnt test_tcpnotify_user test_sock_fields test_sysctl \ |
1c1052e0 CN |
39 | test_progs-no_alu32 \ |
40 | test_current_pid_tgid_new_ns | |
3ef84346 | 41 | |
74b5a596 | 42 | # Also test bpf-gcc, if present |
4ce150b6 | 43 | ifneq ($(BPF_GCC),) |
74b5a596 | 44 | TEST_GEN_PROGS += test_progs-bpf_gcc |
4ce150b6 IL |
45 | endif |
46 | ||
74b5a596 | 47 | TEST_GEN_FILES = |
e47a1799 AR |
48 | TEST_FILES = test_lwt_ip_encap.o \ |
49 | test_tc_edt.o | |
74b5a596 | 50 | |
f09b2e38 JDB |
51 | # Order correspond to 'make run_tests' order |
52 | TEST_PROGS := test_kmod.sh \ | |
f09b2e38 JDB |
53 | test_xdp_redirect.sh \ |
54 | test_xdp_meta.sh \ | |
88091ff5 | 55 | test_xdp_veth.sh \ |
622adafb | 56 | test_offload.py \ |
933a741e | 57 | test_sock_addr.sh \ |
c99a84ea | 58 | test_tunnel.sh \ |
6bdd533c | 59 | test_lwt_seg6local.sh \ |
5ecd8c22 | 60 | test_lirc_mode2.sh \ |
50b3ed57 | 61 | test_skb_cgroup_id.sh \ |
97396ff0 | 62 | test_flow_dissector.sh \ |
d35661fc JDB |
63 | test_xdp_vlan_mode_generic.sh \ |
64 | test_xdp_vlan_mode_native.sh \ | |
bafc0ba8 | 65 | test_lwt_ip_encap.sh \ |
98cdabcd | 66 | test_tcp_check_syncookie.sh \ |
7df5e3db | 67 | test_tc_tunnel.sh \ |
cd538502 | 68 | test_tc_edt.sh \ |
45c5589d | 69 | test_xdping.sh \ |
73633274 | 70 | test_bpftool_build.sh \ |
d42d1cc4 YZ |
71 | test_bpftool.sh \ |
72 | test_bpftool_metadata.sh \ | |
5aa5bd14 | 73 | |
f98937c6 | 74 | TEST_PROGS_EXTENDED := with_addr.sh \ |
1be72f29 | 75 | with_tunnels.sh \ |
f98937c6 | 76 | tcp_client.py \ |
3035bb72 AR |
77 | tcp_server.py \ |
78 | test_xdp_vlan.sh | |
ef4ab844 | 79 | |
f09b2e38 | 80 | # Compile but not part of 'make run_tests' |
cb79a4e1 | 81 | TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \ |
25a7991c | 82 | flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \ |
8e7c2a02 | 83 | test_lirc_mode2_user xdping test_cpp runqslower bench |
f09b2e38 | 84 | |
74b5a596 AN |
85 | TEST_CUSTOM_PROGS = urandom_read |
86 | ||
92f7440e AN |
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) | |
965b9fee | 93 | Q = |
92f7440e AN |
94 | msg = |
95 | else | |
965b9fee | 96 | Q = @ |
2cc51d34 | 97 | msg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))"; |
965b9fee | 98 | MAKEFLAGS += --no-print-directory |
2cc51d34 | 99 | submake_extras := feature_display=0 |
92f7440e AN |
100 | endif |
101 | ||
102 | # override lib.mk's default rules | |
103 | OVERRIDE_TARGETS := 1 | |
104 | override define CLEAN | |
2cc51d34 | 105 | $(call msg,CLEAN) |
d5ca5905 | 106 | $(Q)$(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN) |
92f7440e AN |
107 | endef |
108 | ||
e8f1f34a ZSL |
109 | include ../lib.mk |
110 | ||
a2c9652f THJ |
111 | SCRATCH_DIR := $(OUTPUT)/tools |
112 | BUILD_DIR := $(SCRATCH_DIR)/build | |
113 | INCLUDE_DIR := $(SCRATCH_DIR)/include | |
114 | BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a | |
cc15a20d | 115 | RESOLVE_BTFIDS := $(BUILD_DIR)/resolve_btfids/resolve_btfids |
a2c9652f | 116 | |
03dcb784 AN |
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)/% ; | |
126 | ||
d5ca5905 AN |
127 | $(OUTPUT)/%.o: %.c |
128 | $(call msg,CC,,$@) | |
129 | $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ | |
130 | ||
92f7440e | 131 | $(OUTPUT)/%:%.c |
2cc51d34 | 132 | $(call msg,BINARY,,$@) |
d5ca5905 | 133 | $(Q)$(LINK.c) $^ $(LDLIBS) -o $@ |
92f7440e | 134 | |
74b5a596 | 135 | $(OUTPUT)/urandom_read: urandom_read.c |
2cc51d34 | 136 | $(call msg,BINARY,,$@) |
d5ca5905 | 137 | $(Q)$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) -Wl,--build-id |
3ef84346 | 138 | |
a2c9652f | 139 | $(OUTPUT)/test_stub.o: test_stub.c $(BPFOBJ) |
2cc51d34 | 140 | $(call msg,CC,,$@) |
d5ca5905 | 141 | $(Q)$(CC) -c $(CFLAGS) -o $@ $< |
e93d9918 | 142 | |
ca4db638 | 143 | VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ |
cc6fa771 AN |
144 | $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ |
145 | ../../../../vmlinux \ | |
146 | /sys/kernel/btf/vmlinux \ | |
147 | /boot/vmlinux-$(shell uname -r) | |
ca4db638 | 148 | VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) |
cc6fa771 | 149 | |
6bcaf41f AN |
150 | DEFAULT_BPFTOOL := $(SCRATCH_DIR)/sbin/bpftool |
151 | ||
152 | $(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) | |
bfe42797 | 153 | $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ |
a2c9652f | 154 | OUTPUT=$(SCRATCH_DIR)/ VMLINUX_BTF=$(VMLINUX_BTF) \ |
b26d1e2b VK |
155 | BPFOBJ=$(BPFOBJ) BPF_INCLUDE=$(INCLUDE_DIR) && \ |
156 | cp $(SCRATCH_DIR)/runqslower $@ | |
e8f1f34a | 157 | |
74b5a596 | 158 | $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ) |
f09b2e38 | 159 | |
41757dcb | 160 | $(OUTPUT)/test_dev_cgroup: cgroup_helpers.c |
5ecd8c22 | 161 | $(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c |
1d436885 | 162 | $(OUTPUT)/test_sock: cgroup_helpers.c |
e50b0a6f | 163 | $(OUTPUT)/test_sock_addr: cgroup_helpers.c |
194db0d9 | 164 | $(OUTPUT)/test_socket_cookie: cgroup_helpers.c |
16962b24 | 165 | $(OUTPUT)/test_sockmap: cgroup_helpers.c |
c65267e5 | 166 | $(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c |
435f90a3 | 167 | $(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c |
f269099a | 168 | $(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c |
68cfa3ac | 169 | $(OUTPUT)/test_cgroup_storage: cgroup_helpers.c |
371e4fcc | 170 | $(OUTPUT)/test_netcnt: cgroup_helpers.c |
e0b27b3f | 171 | $(OUTPUT)/test_sock_fields: cgroup_helpers.c |
1f5fa9ab | 172 | $(OUTPUT)/test_sysctl: cgroup_helpers.c |
41757dcb | 173 | |
f3c926a4 | 174 | BPFTOOL ?= $(DEFAULT_BPFTOOL) |
03506297 AN |
175 | $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ |
176 | $(BPFOBJ) | $(BUILD_DIR)/bpftool | |
177 | $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ | |
178 | OUTPUT=$(BUILD_DIR)/bpftool/ \ | |
a2c9652f | 179 | prefix= DESTDIR=$(SCRATCH_DIR)/ install |
41d5c37b QM |
180 | $(Q)mkdir -p $(BUILD_DIR)/bpftool/Documentation |
181 | $(Q)RST2MAN_OPTS="--exit-status=1" $(MAKE) $(submake_extras) \ | |
182 | -C $(BPFTOOLDIR)/Documentation \ | |
183 | OUTPUT=$(BUILD_DIR)/bpftool/Documentation/ \ | |
184 | prefix= DESTDIR=$(SCRATCH_DIR)/ install | |
f3c926a4 | 185 | |
03506297 | 186 | $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ |
a2c9652f THJ |
187 | ../../../include/uapi/linux/bpf.h \ |
188 | | $(INCLUDE_DIR) $(BUILD_DIR)/libbpf | |
189 | $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \ | |
03506297 | 190 | DESTDIR=$(SCRATCH_DIR) prefix= all install_headers |
6882804c | 191 | |
cc15a20d | 192 | $(BUILD_DIR)/libbpf $(BUILD_DIR)/bpftool $(BUILD_DIR)/resolve_btfids $(INCLUDE_DIR): |
a2c9652f | 193 | $(call msg,MKDIR,,$@) |
d5ca5905 | 194 | $(Q)mkdir -p $@ |
74b5a596 | 195 | |
acbd0620 | 196 | $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) | $(BPFTOOL) $(INCLUDE_DIR) |
ca4db638 | 197 | ifeq ($(VMLINUX_H),) |
acbd0620 | 198 | $(call msg,GEN,,$@) |
d5ca5905 | 199 | $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@ |
ca4db638 AN |
200 | else |
201 | $(call msg,CP,,$@) | |
d5ca5905 | 202 | $(Q)cp "$(VMLINUX_H)" $@ |
ca4db638 | 203 | endif |
acbd0620 | 204 | |
cc15a20d JO |
205 | $(RESOLVE_BTFIDS): $(BPFOBJ) | $(BUILD_DIR)/resolve_btfids \ |
206 | $(TOOLSDIR)/bpf/resolve_btfids/main.c \ | |
207 | $(TOOLSDIR)/lib/rbtree.c \ | |
208 | $(TOOLSDIR)/lib/zalloc.c \ | |
209 | $(TOOLSDIR)/lib/string.c \ | |
210 | $(TOOLSDIR)/lib/ctype.c \ | |
211 | $(TOOLSDIR)/lib/str_error_r.c | |
212 | $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \ | |
213 | OUTPUT=$(BUILD_DIR)/resolve_btfids/ BPFOBJ=$(BPFOBJ) | |
214 | ||
167381f3 SB |
215 | # Get Clang's default includes on this system, as opposed to those seen by |
216 | # '-target bpf'. This fixes "missing" files on some architectures/distros, | |
217 | # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc. | |
218 | # | |
219 | # Use '-idirafter': Don't interfere with include mechanics except where the | |
220 | # build would have failed anyways. | |
4ce150b6 IL |
221 | define get_sys_includes |
222 | $(shell $(1) -v -E - </dev/null 2>&1 \ | |
167381f3 | 223 | | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') |
4ce150b6 | 224 | endef |
74b5a596 | 225 | |
313e7f6f IL |
226 | # Determine target endianness. |
227 | IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \ | |
228 | grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__') | |
229 | MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) | |
230 | ||
4ce150b6 | 231 | CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) |
313e7f6f | 232 | BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ |
bcd66b10 TK |
233 | -I$(INCLUDE_DIR) -I$(CURDIR) -I$(APIDIR) \ |
234 | -I$(abspath $(OUTPUT)/../usr/include) | |
167381f3 | 235 | |
4ce150b6 IL |
236 | CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ |
237 | -Wno-compare-distinct-pointer-types | |
3bc35c63 | 238 | |
4ce150b6 IL |
239 | $(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline |
240 | $(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline | |
3bc35c63 | 241 | |
bf0f0fd9 | 242 | $(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h |
bf0f0fd9 | 243 | |
74b5a596 AN |
244 | # Build BPF object using Clang |
245 | # $1 - input .c file | |
246 | # $2 - output .o file | |
247 | # $3 - CFLAGS | |
248 | # $4 - LDFLAGS | |
249 | define CLANG_BPF_BUILD_RULE | |
2cc51d34 | 250 | $(call msg,CLNG-LLC,$(TRUNNER_BINARY),$2) |
d5ca5905 | 251 | $(Q)($(CLANG) $3 -O2 -target bpf -emit-llvm \ |
74b5a596 | 252 | -c $1 -o - || echo "BPF obj compilation failed") | \ |
83250f2b | 253 | $(LLC) -mattr=dwarfris -march=bpf -mcpu=v3 $4 -filetype=obj -o $2 |
74b5a596 | 254 | endef |
24f65050 AN |
255 | # Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32 |
256 | define CLANG_NOALU32_BPF_BUILD_RULE | |
2cc51d34 | 257 | $(call msg,CLNG-LLC,$(TRUNNER_BINARY),$2) |
d5ca5905 | 258 | $(Q)($(CLANG) $3 -O2 -target bpf -emit-llvm \ |
24f65050 AN |
259 | -c $1 -o - || echo "BPF obj compilation failed") | \ |
260 | $(LLC) -march=bpf -mcpu=v2 $4 -filetype=obj -o $2 | |
261 | endef | |
74b5a596 AN |
262 | # Similar to CLANG_BPF_BUILD_RULE, but using native Clang and bpf LLC |
263 | define CLANG_NATIVE_BPF_BUILD_RULE | |
2cc51d34 | 264 | $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) |
d5ca5905 | 265 | $(Q)($(CLANG) $3 -O2 -emit-llvm \ |
74b5a596 | 266 | -c $1 -o - || echo "BPF obj compilation failed") | \ |
83250f2b | 267 | $(LLC) -march=bpf -mcpu=v3 $4 -filetype=obj -o $2 |
74b5a596 AN |
268 | endef |
269 | # Build BPF object using GCC | |
270 | define GCC_BPF_BUILD_RULE | |
2cc51d34 | 271 | $(call msg,GCC-BPF,$(TRUNNER_BINARY),$2) |
d5ca5905 | 272 | $(Q)$(BPF_GCC) $3 $4 -O2 -c $1 -o $2 |
74b5a596 AN |
273 | endef |
274 | ||
0b9ad56b | 275 | SKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c |
f3c926a4 | 276 | |
74b5a596 AN |
277 | # Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on |
278 | # $eval()) and pass control to DEFINE_TEST_RUNNER_RULES. | |
279 | # Parameters: | |
280 | # $1 - test runner base binary name (e.g., test_progs) | |
e13a2fe6 | 281 | # $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc) |
74b5a596 AN |
282 | define DEFINE_TEST_RUNNER |
283 | ||
284 | TRUNNER_OUTPUT := $(OUTPUT)$(if $2,/)$2 | |
285 | TRUNNER_BINARY := $1$(if $2,-)$2 | |
286 | TRUNNER_TEST_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.test.o, \ | |
287 | $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c))) | |
288 | TRUNNER_EXTRA_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \ | |
289 | $$(filter %.c,$(TRUNNER_EXTRA_SOURCES))) | |
290 | TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES)) | |
291 | TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h | |
f3c926a4 AN |
292 | TRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c)) |
293 | TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, $$(TRUNNER_BPF_SRCS)) | |
294 | TRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h, \ | |
295 | $$(filter-out $(SKEL_BLACKLIST), \ | |
296 | $$(TRUNNER_BPF_SRCS))) | |
309b81f0 | 297 | TEST_GEN_FILES += $$(TRUNNER_BPF_OBJS) |
74b5a596 AN |
298 | |
299 | # Evaluate rules now with extra TRUNNER_XXX variables above already defined | |
300 | $$(eval $$(call DEFINE_TEST_RUNNER_RULES,$1,$2)) | |
301 | ||
302 | endef | |
303 | ||
304 | # Using TRUNNER_XXX variables, provided by callers of DEFINE_TEST_RUNNER and | |
305 | # set up by DEFINE_TEST_RUNNER itself, create test runner build rules with: | |
306 | # $1 - test runner base binary name (e.g., test_progs) | |
e13a2fe6 | 307 | # $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc) |
74b5a596 | 308 | define DEFINE_TEST_RUNNER_RULES |
e78e00bd | 309 | |
74b5a596 AN |
310 | ifeq ($($(TRUNNER_OUTPUT)-dir),) |
311 | $(TRUNNER_OUTPUT)-dir := y | |
312 | $(TRUNNER_OUTPUT): | |
2cc51d34 | 313 | $$(call msg,MKDIR,,$$@) |
d5ca5905 | 314 | $(Q)mkdir -p $$@ |
74b5a596 AN |
315 | endif |
316 | ||
317 | # ensure we set up BPF objects generation rule just once for a given | |
318 | # input/output directory combination | |
319 | ifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),) | |
320 | $(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y | |
321 | $(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.o: \ | |
322 | $(TRUNNER_BPF_PROGS_DIR)/%.c \ | |
323 | $(TRUNNER_BPF_PROGS_DIR)/*.h \ | |
acbd0620 | 324 | $$(INCLUDE_DIR)/vmlinux.h \ |
3ac2e20f | 325 | $(wildcard $(BPFDIR)/bpf_*.h) | $(TRUNNER_OUTPUT) |
74b5a596 AN |
326 | $$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@, \ |
327 | $(TRUNNER_BPF_CFLAGS), \ | |
328 | $(TRUNNER_BPF_LDFLAGS)) | |
f3c926a4 AN |
329 | |
330 | $(TRUNNER_BPF_SKELS): $(TRUNNER_OUTPUT)/%.skel.h: \ | |
331 | $(TRUNNER_OUTPUT)/%.o \ | |
332 | | $(BPFTOOL) $(TRUNNER_OUTPUT) | |
2cc51d34 | 333 | $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@) |
d5ca5905 | 334 | $(Q)$$(BPFTOOL) gen skeleton $$< > $$@ |
74b5a596 AN |
335 | endif |
336 | ||
337 | # ensure we set up tests.h header generation rule just once | |
338 | ifeq ($($(TRUNNER_TESTS_DIR)-tests-hdr),) | |
339 | $(TRUNNER_TESTS_DIR)-tests-hdr := y | |
340 | $(TRUNNER_TESTS_HDR): $(TRUNNER_TESTS_DIR)/*.c | |
2cc51d34 | 341 | $$(call msg,TEST-HDR,$(TRUNNER_BINARY),$$@) |
74b5a596 AN |
342 | $$(shell ( cd $(TRUNNER_TESTS_DIR); \ |
343 | echo '/* Generated header, do not edit */'; \ | |
344 | ls *.c 2> /dev/null | \ | |
345 | sed -e 's@\([^\.]*\)\.c@DEFINE_TEST(\1)@'; \ | |
346 | ) > $$@) | |
347 | endif | |
348 | ||
349 | # compile individual test files | |
350 | # Note: we cd into output directory to ensure embedded BPF object is found | |
351 | $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \ | |
352 | $(TRUNNER_TESTS_DIR)/%.c \ | |
353 | $(TRUNNER_EXTRA_HDRS) \ | |
354 | $(TRUNNER_BPF_OBJS) \ | |
f3c926a4 | 355 | $(TRUNNER_BPF_SKELS) \ |
74b5a596 | 356 | $$(BPFOBJ) | $(TRUNNER_OUTPUT) |
2cc51d34 | 357 | $$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@) |
d5ca5905 | 358 | $(Q)cd $$(@D) && $$(CC) -I. $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F) |
74b5a596 AN |
359 | |
360 | $(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \ | |
361 | %.c \ | |
362 | $(TRUNNER_EXTRA_HDRS) \ | |
363 | $(TRUNNER_TESTS_HDR) \ | |
364 | $$(BPFOBJ) | $(TRUNNER_OUTPUT) | |
2cc51d34 | 365 | $$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@) |
d5ca5905 | 366 | $(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ |
74b5a596 | 367 | |
f3c926a4 | 368 | # only copy extra resources if in flavored build |
74b5a596 AN |
369 | $(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT) |
370 | ifneq ($2,) | |
2cc51d34 | 371 | $$(call msg,EXT-COPY,$(TRUNNER_BINARY),$(TRUNNER_EXTRA_FILES)) |
d5ca5905 | 372 | $(Q)cp -a $$^ $(TRUNNER_OUTPUT)/ |
74b5a596 AN |
373 | endif |
374 | ||
375 | $(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \ | |
376 | $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \ | |
cc15a20d | 377 | $(RESOLVE_BTFIDS) \ |
74b5a596 | 378 | | $(TRUNNER_BINARY)-extras |
2cc51d34 | 379 | $$(call msg,BINARY,,$$@) |
d5ca5905 AN |
380 | $(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@ |
381 | $(Q)$(RESOLVE_BTFIDS) --no-fail --btf btf_data.o $$@ | |
74b5a596 AN |
382 | |
383 | endef | |
384 | ||
385 | # Define test_progs test runner. | |
386 | TRUNNER_TESTS_DIR := prog_tests | |
387 | TRUNNER_BPF_PROGS_DIR := progs | |
388 | TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \ | |
cd49291c AN |
389 | network_helpers.c testing_helpers.c \ |
390 | flow_dissector_load.h | |
74b5a596 AN |
391 | TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \ |
392 | $(wildcard progs/btf_dump_test_case_*.c) | |
393 | TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE | |
6910d7d3 | 394 | TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) |
e13a2fe6 | 395 | TRUNNER_BPF_LDFLAGS := -mattr=+alu32 |
74b5a596 AN |
396 | $(eval $(call DEFINE_TEST_RUNNER,test_progs)) |
397 | ||
e13a2fe6 | 398 | # Define test_progs-no_alu32 test runner. |
24f65050 | 399 | TRUNNER_BPF_BUILD_RULE := CLANG_NOALU32_BPF_BUILD_RULE |
e13a2fe6 YS |
400 | TRUNNER_BPF_LDFLAGS := |
401 | $(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32)) | |
3ef84346 | 402 | |
74b5a596 | 403 | # Define test_progs BPF-GCC-flavored test runner. |
4ce150b6 | 404 | ifneq ($(BPF_GCC),) |
74b5a596 | 405 | TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE |
313e7f6f | 406 | TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc) |
74b5a596 AN |
407 | TRUNNER_BPF_LDFLAGS := |
408 | $(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc)) | |
4ce150b6 IL |
409 | endif |
410 | ||
74b5a596 AN |
411 | # Define test_maps test runner. |
412 | TRUNNER_TESTS_DIR := map_tests | |
413 | TRUNNER_BPF_PROGS_DIR := progs | |
414 | TRUNNER_EXTRA_SOURCES := test_maps.c | |
415 | TRUNNER_EXTRA_FILES := | |
416 | TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built) | |
417 | TRUNNER_BPF_CFLAGS := | |
418 | TRUNNER_BPF_LDFLAGS := | |
419 | $(eval $(call DEFINE_TEST_RUNNER,test_maps)) | |
420 | ||
421 | # Define test_verifier test runner. | |
422 | # It is much simpler than test_maps/test_progs and sufficiently different from | |
423 | # them (e.g., test.h is using completely pattern), that it's worth just | |
424 | # explicitly defining all the rules explicitly. | |
425 | verifier/tests.h: verifier/*.c | |
e78e00bd | 426 | $(shell ( cd verifier/; \ |
2dfb4012 JK |
427 | echo '/* Generated header, do not edit */'; \ |
428 | echo '#ifdef FILL_ARRAY'; \ | |
74b5a596 | 429 | ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \ |
2dfb4012 | 430 | echo '#endif' \ |
74b5a596 AN |
431 | ) > verifier/tests.h) |
432 | $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT) | |
2cc51d34 | 433 | $(call msg,BINARY,,$@) |
d5ca5905 | 434 | $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ |
2dfb4012 | 435 | |
6bf6affe | 436 | # Make sure we are able to include and link libbpf against c++. |
7c8dce4b | 437 | $(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ) |
2cc51d34 | 438 | $(call msg,CXX,,$@) |
d5ca5905 | 439 | $(Q)$(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@ |
6bf6affe | 440 | |
8e7c2a02 AN |
441 | # Benchmark runner |
442 | $(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h | |
443 | $(call msg,CC,,$@) | |
d5ca5905 | 444 | $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ |
4eaf0b5c | 445 | $(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h |
c5d420c3 | 446 | $(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h |
c97099b0 AN |
447 | $(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \ |
448 | $(OUTPUT)/perfbuf_bench.skel.h | |
8e7c2a02 AN |
449 | $(OUTPUT)/bench.o: bench.h testing_helpers.h |
450 | $(OUTPUT)/bench: LDLIBS += -lm | |
451 | $(OUTPUT)/bench: $(OUTPUT)/bench.o $(OUTPUT)/testing_helpers.o \ | |
4eaf0b5c | 452 | $(OUTPUT)/bench_count.o \ |
c5d420c3 | 453 | $(OUTPUT)/bench_rename.o \ |
c97099b0 AN |
454 | $(OUTPUT)/bench_trigger.o \ |
455 | $(OUTPUT)/bench_ringbufs.o | |
8e7c2a02 | 456 | $(call msg,BINARY,,$@) |
d5ca5905 | 457 | $(Q)$(CC) $(LDFLAGS) -o $@ $(filter %.a %.o,$^) $(LDLIBS) |
8e7c2a02 | 458 | |
a2c9652f | 459 | EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) \ |
74b5a596 | 460 | prog_tests/tests.h map_tests/tests.h verifier/tests.h \ |
2031af28 | 461 | feature \ |
a2c9652f | 462 | $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32 bpf_gcc) |