]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - tools/testing/selftests/bpf/Makefile
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[mirror_ubuntu-hirsute-kernel.git] / tools / testing / selftests / bpf / Makefile
1 # SPDX-License-Identifier: GPL-2.0
2 include ../../../../scripts/Kbuild.include
3 include ../../../scripts/Makefile.arch
4
5 CURDIR := $(abspath .)
6 TOOLSDIR := $(abspath ../../..)
7 LIBDIR := $(TOOLSDIR)/lib
8 BPFDIR := $(LIBDIR)/bpf
9 TOOLSINCDIR := $(TOOLSDIR)/include
10 BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
11 APIDIR := $(TOOLSINCDIR)/uapi
12 GENDIR := $(abspath ../../../../include/generated)
13 GENHDR := $(GENDIR)/autoconf.h
14
15 ifneq ($(wildcard $(GENHDR)),)
16 GENFLAGS := -DHAVE_GENHDR
17 endif
18
19 CLANG ?= clang
20 LLC ?= llc
21 LLVM_OBJCOPY ?= llvm-objcopy
22 BPF_GCC ?= $(shell command -v bpf-gcc;)
23 CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) \
24 -I$(GENDIR) -I$(TOOLSINCDIR) -I$(CURDIR) \
25 -Dbpf_prog_load=bpf_prog_test_load \
26 -Dbpf_load_program=bpf_test_load_program
27 LDLIBS += -lcap -lelf -lz -lrt -lpthread
28
29 # Order correspond to 'make run_tests' order
30 TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
31 test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
32 test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
33 test_cgroup_storage \
34 test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \
35 test_progs-no_alu32
36
37 # Also test bpf-gcc, if present
38 ifneq ($(BPF_GCC),)
39 TEST_GEN_PROGS += test_progs-bpf_gcc
40 endif
41
42 TEST_GEN_FILES =
43 TEST_FILES = test_lwt_ip_encap.o \
44 test_tc_edt.o
45
46 # Order correspond to 'make run_tests' order
47 TEST_PROGS := test_kmod.sh \
48 test_xdp_redirect.sh \
49 test_xdp_meta.sh \
50 test_xdp_veth.sh \
51 test_offload.py \
52 test_sock_addr.sh \
53 test_tunnel.sh \
54 test_lwt_seg6local.sh \
55 test_lirc_mode2.sh \
56 test_skb_cgroup_id.sh \
57 test_flow_dissector.sh \
58 test_xdp_vlan_mode_generic.sh \
59 test_xdp_vlan_mode_native.sh \
60 test_lwt_ip_encap.sh \
61 test_tcp_check_syncookie.sh \
62 test_tc_tunnel.sh \
63 test_tc_edt.sh \
64 test_xdping.sh \
65 test_bpftool_build.sh
66
67 TEST_PROGS_EXTENDED := with_addr.sh \
68 with_tunnels.sh \
69 tcp_client.py \
70 tcp_server.py \
71 test_xdp_vlan.sh
72
73 # Compile but not part of 'make run_tests'
74 TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \
75 flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
76 test_lirc_mode2_user xdping test_cpp
77
78 TEST_CUSTOM_PROGS = urandom_read
79
80 # Emit succinct information message describing current building step
81 # $1 - generic step name (e.g., CC, LINK, etc);
82 # $2 - optional "flavor" specifier; if provided, will be emitted as [flavor];
83 # $3 - target (assumed to be file); only file name will be emitted;
84 # $4 - optional extra arg, emitted as-is, if provided.
85 ifeq ($(V),1)
86 msg =
87 else
88 msg = @$(info $(1)$(if $(2), [$(2)]) $(notdir $(3)))$(if $(4), $(4))
89 endif
90
91 # override lib.mk's default rules
92 OVERRIDE_TARGETS := 1
93 override define CLEAN
94 $(call msg, CLEAN)
95 $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)
96 endef
97
98 include ../lib.mk
99
100 # Define simple and short `make test_progs`, `make test_sysctl`, etc targets
101 # to build individual tests.
102 # NOTE: Semicolon at the end is critical to override lib.mk's default static
103 # rule for binaries.
104 $(notdir $(TEST_GEN_PROGS) \
105 $(TEST_PROGS) \
106 $(TEST_PROGS_EXTENDED) \
107 $(TEST_GEN_PROGS_EXTENDED) \
108 $(TEST_CUSTOM_PROGS)): %: $(OUTPUT)/% ;
109
110 $(OUTPUT)/%:%.c
111 $(call msg, BINARY,,$@)
112 $(LINK.c) $^ $(LDLIBS) -o $@
113
114 $(OUTPUT)/urandom_read: urandom_read.c
115 $(call msg, BINARY,,$@)
116 $(CC) -o $@ $< -Wl,--build-id
117
118 $(OUTPUT)/test_stub.o: test_stub.c
119 $(call msg, CC,,$@)
120 $(CC) -c $(CFLAGS) -o $@ $<
121
122 BPFOBJ := $(OUTPUT)/libbpf.a
123
124 $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ)
125
126 $(OUTPUT)/test_dev_cgroup: cgroup_helpers.c
127 $(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c
128 $(OUTPUT)/test_sock: cgroup_helpers.c
129 $(OUTPUT)/test_sock_addr: cgroup_helpers.c
130 $(OUTPUT)/test_socket_cookie: cgroup_helpers.c
131 $(OUTPUT)/test_sockmap: cgroup_helpers.c
132 $(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c
133 $(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
134 $(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
135 $(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
136 $(OUTPUT)/test_netcnt: cgroup_helpers.c
137 $(OUTPUT)/test_sock_fields: cgroup_helpers.c
138 $(OUTPUT)/test_sysctl: cgroup_helpers.c
139
140 .PHONY: force
141
142 # force a rebuild of BPFOBJ when its dependencies are updated
143 force:
144
145 DEFAULT_BPFTOOL := $(OUTPUT)/tools/usr/local/sbin/bpftool
146 BPFTOOL ?= $(DEFAULT_BPFTOOL)
147
148 $(DEFAULT_BPFTOOL): force
149 $(MAKE) -C $(BPFTOOLDIR) DESTDIR=$(OUTPUT)/tools install
150
151 $(BPFOBJ): force
152 $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/
153
154 BPF_HELPERS := $(OUTPUT)/bpf_helper_defs.h $(wildcard $(BPFDIR)/bpf_*.h)
155 $(OUTPUT)/bpf_helper_defs.h:
156 $(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ $(OUTPUT)/bpf_helper_defs.h
157
158 # Get Clang's default includes on this system, as opposed to those seen by
159 # '-target bpf'. This fixes "missing" files on some architectures/distros,
160 # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
161 #
162 # Use '-idirafter': Don't interfere with include mechanics except where the
163 # build would have failed anyways.
164 define get_sys_includes
165 $(shell $(1) -v -E - </dev/null 2>&1 \
166 | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
167 endef
168
169 # Determine target endianness.
170 IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
171 grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
172 MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
173
174 CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
175 BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \
176 -I. -I./include/uapi -I$(APIDIR) \
177 -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include)
178
179 CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
180 -Wno-compare-distinct-pointer-types
181
182 $(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline
183 $(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline
184
185 $(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h
186
187 # Build BPF object using Clang
188 # $1 - input .c file
189 # $2 - output .o file
190 # $3 - CFLAGS
191 # $4 - LDFLAGS
192 define CLANG_BPF_BUILD_RULE
193 $(call msg, CLANG-LLC,$(TRUNNER_BINARY),$2)
194 ($(CLANG) $3 -O2 -target bpf -emit-llvm \
195 -c $1 -o - || echo "BPF obj compilation failed") | \
196 $(LLC) -mattr=dwarfris -march=bpf -mcpu=probe $4 -filetype=obj -o $2
197 endef
198 # Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32
199 define CLANG_NOALU32_BPF_BUILD_RULE
200 $(call msg, CLANG-LLC,$(TRUNNER_BINARY),$2)
201 ($(CLANG) $3 -O2 -target bpf -emit-llvm \
202 -c $1 -o - || echo "BPF obj compilation failed") | \
203 $(LLC) -march=bpf -mcpu=v2 $4 -filetype=obj -o $2
204 endef
205 # Similar to CLANG_BPF_BUILD_RULE, but using native Clang and bpf LLC
206 define CLANG_NATIVE_BPF_BUILD_RULE
207 $(call msg, CLANG-BPF,$(TRUNNER_BINARY),$2)
208 ($(CLANG) $3 -O2 -emit-llvm \
209 -c $1 -o - || echo "BPF obj compilation failed") | \
210 $(LLC) -march=bpf -mcpu=probe $4 -filetype=obj -o $2
211 endef
212 # Build BPF object using GCC
213 define GCC_BPF_BUILD_RULE
214 $(call msg, GCC-BPF,$(TRUNNER_BINARY),$2)
215 $(BPF_GCC) $3 $4 -O2 -c $1 -o $2
216 endef
217
218 SKEL_BLACKLIST := btf__% test_pinning_invalid.c
219
220 # Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on
221 # $eval()) and pass control to DEFINE_TEST_RUNNER_RULES.
222 # Parameters:
223 # $1 - test runner base binary name (e.g., test_progs)
224 # $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
225 define DEFINE_TEST_RUNNER
226
227 TRUNNER_OUTPUT := $(OUTPUT)$(if $2,/)$2
228 TRUNNER_BINARY := $1$(if $2,-)$2
229 TRUNNER_TEST_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.test.o, \
230 $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c)))
231 TRUNNER_EXTRA_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \
232 $$(filter %.c,$(TRUNNER_EXTRA_SOURCES)))
233 TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES))
234 TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h
235 TRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c))
236 TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, $$(TRUNNER_BPF_SRCS))
237 TRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h, \
238 $$(filter-out $(SKEL_BLACKLIST), \
239 $$(TRUNNER_BPF_SRCS)))
240
241 # Evaluate rules now with extra TRUNNER_XXX variables above already defined
242 $$(eval $$(call DEFINE_TEST_RUNNER_RULES,$1,$2))
243
244 endef
245
246 # Using TRUNNER_XXX variables, provided by callers of DEFINE_TEST_RUNNER and
247 # set up by DEFINE_TEST_RUNNER itself, create test runner build rules with:
248 # $1 - test runner base binary name (e.g., test_progs)
249 # $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
250 define DEFINE_TEST_RUNNER_RULES
251
252 ifeq ($($(TRUNNER_OUTPUT)-dir),)
253 $(TRUNNER_OUTPUT)-dir := y
254 $(TRUNNER_OUTPUT):
255 mkdir -p $$@
256 endif
257
258 # ensure we set up BPF objects generation rule just once for a given
259 # input/output directory combination
260 ifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),)
261 $(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y
262 $(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.o: \
263 $(TRUNNER_BPF_PROGS_DIR)/%.c \
264 $(TRUNNER_BPF_PROGS_DIR)/*.h \
265 $$(BPF_HELPERS) | $(TRUNNER_OUTPUT)
266 $$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@, \
267 $(TRUNNER_BPF_CFLAGS), \
268 $(TRUNNER_BPF_LDFLAGS))
269
270 $(TRUNNER_BPF_SKELS): $(TRUNNER_OUTPUT)/%.skel.h: \
271 $(TRUNNER_OUTPUT)/%.o \
272 | $(BPFTOOL) $(TRUNNER_OUTPUT)
273 $$(call msg, GEN-SKEL,$(TRUNNER_BINARY),$$@)
274 $$(BPFTOOL) gen skeleton $$< > $$@
275 endif
276
277 # ensure we set up tests.h header generation rule just once
278 ifeq ($($(TRUNNER_TESTS_DIR)-tests-hdr),)
279 $(TRUNNER_TESTS_DIR)-tests-hdr := y
280 $(TRUNNER_TESTS_HDR): $(TRUNNER_TESTS_DIR)/*.c
281 $$(call msg, TEST-HDR,$(TRUNNER_BINARY),$$@)
282 $$(shell ( cd $(TRUNNER_TESTS_DIR); \
283 echo '/* Generated header, do not edit */'; \
284 ls *.c 2> /dev/null | \
285 sed -e 's@\([^\.]*\)\.c@DEFINE_TEST(\1)@'; \
286 ) > $$@)
287 endif
288
289 # compile individual test files
290 # Note: we cd into output directory to ensure embedded BPF object is found
291 $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \
292 $(TRUNNER_TESTS_DIR)/%.c \
293 $(TRUNNER_EXTRA_HDRS) \
294 $(TRUNNER_BPF_OBJS) \
295 $(TRUNNER_BPF_SKELS) \
296 $$(BPFOBJ) | $(TRUNNER_OUTPUT)
297 $$(call msg, TEST-OBJ,$(TRUNNER_BINARY),$$@)
298 cd $$(@D) && $$(CC) $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)
299
300 $(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \
301 %.c \
302 $(TRUNNER_EXTRA_HDRS) \
303 $(TRUNNER_TESTS_HDR) \
304 $$(BPFOBJ) | $(TRUNNER_OUTPUT)
305 $$(call msg, EXTRA-OBJ,$(TRUNNER_BINARY),$$@)
306 $$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
307
308 # only copy extra resources if in flavored build
309 $(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT)
310 ifneq ($2,)
311 $$(call msg, EXTRAS-CP,$(TRUNNER_BINARY),$(TRUNNER_EXTRA_FILES))
312 cp -a $$^ $(TRUNNER_OUTPUT)/
313 endif
314
315 $(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \
316 $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \
317 | $(TRUNNER_BINARY)-extras
318 $$(call msg, BINARY,,$$@)
319 $$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@
320
321 endef
322
323 # Define test_progs test runner.
324 TRUNNER_TESTS_DIR := prog_tests
325 TRUNNER_BPF_PROGS_DIR := progs
326 TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \
327 flow_dissector_load.h
328 TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \
329 $(wildcard progs/btf_dump_test_case_*.c)
330 TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
331 TRUNNER_BPF_CFLAGS := -I. -I$(OUTPUT) $(BPF_CFLAGS) $(CLANG_CFLAGS)
332 TRUNNER_BPF_LDFLAGS := -mattr=+alu32
333 $(eval $(call DEFINE_TEST_RUNNER,test_progs))
334
335 # Define test_progs-no_alu32 test runner.
336 TRUNNER_BPF_BUILD_RULE := CLANG_NOALU32_BPF_BUILD_RULE
337 TRUNNER_BPF_LDFLAGS :=
338 $(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32))
339
340 # Define test_progs BPF-GCC-flavored test runner.
341 ifneq ($(BPF_GCC),)
342 TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE
343 TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc)
344 TRUNNER_BPF_LDFLAGS :=
345 $(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc))
346 endif
347
348 # Define test_maps test runner.
349 TRUNNER_TESTS_DIR := map_tests
350 TRUNNER_BPF_PROGS_DIR := progs
351 TRUNNER_EXTRA_SOURCES := test_maps.c
352 TRUNNER_EXTRA_FILES :=
353 TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built)
354 TRUNNER_BPF_CFLAGS :=
355 TRUNNER_BPF_LDFLAGS :=
356 $(eval $(call DEFINE_TEST_RUNNER,test_maps))
357
358 # Define test_verifier test runner.
359 # It is much simpler than test_maps/test_progs and sufficiently different from
360 # them (e.g., test.h is using completely pattern), that it's worth just
361 # explicitly defining all the rules explicitly.
362 verifier/tests.h: verifier/*.c
363 $(shell ( cd verifier/; \
364 echo '/* Generated header, do not edit */'; \
365 echo '#ifdef FILL_ARRAY'; \
366 ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \
367 echo '#endif' \
368 ) > verifier/tests.h)
369 $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
370 $(call msg, BINARY,,$@)
371 $(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
372
373 # Make sure we are able to include and link libbpf against c++.
374 $(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ)
375 $(call msg, CXX,,$@)
376 $(CXX) $(CFLAGS) $^ $(LDLIBS) -o $@
377
378 EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) \
379 prog_tests/tests.h map_tests/tests.h verifier/tests.h \
380 feature $(OUTPUT)/*.o $(OUTPUT)/no_alu32 $(OUTPUT)/bpf_gcc \
381 tools *.skel.h