1 # SPDX-License-Identifier: GPL-2.0
2 include ..
/..
/..
/..
/scripts
/Kbuild.
include
3 include ..
/..
/..
/scripts
/Makefile.arch
6 BPFDIR
:= $(LIBDIR
)/bpf
7 APIDIR
:= ..
/..
/..
/include/uapi
8 GENDIR
:= ..
/..
/..
/..
/include/generated
9 GENHDR
:= $(GENDIR
)/autoconf.h
11 ifneq ($(wildcard $(GENHDR
)),)
12 GENFLAGS
:= -DHAVE_GENHDR
17 LLVM_OBJCOPY ?
= llvm-objcopy
18 LLVM_READELF ?
= llvm-readelf
20 CFLAGS
+= -g
-Wall
-O2
-I
$(APIDIR
) -I
$(LIBDIR
) -I
$(BPFDIR
) -I
$(GENDIR
) $(GENFLAGS
) -I..
/..
/..
/include \
21 -Dbpf_prog_load
=bpf_prog_test_load \
22 -Dbpf_load_program
=bpf_test_load_program
23 LDLIBS
+= -lcap
-lelf
-lrt
-lpthread
25 # Order correspond to 'make run_tests' order
26 TEST_GEN_PROGS
= test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
27 test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
28 test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
29 test_cgroup_storage test_select_reuseport test_section_names \
30 test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \
31 test_btf_dump test_cgroup_attach xdping test_sockopt test_sockopt_sk \
32 test_sockopt_multi test_tcp_rtt
34 BPF_OBJ_FILES
= $(patsubst %.c
,%.o
, $(notdir $(wildcard progs
/*.c
)))
35 TEST_GEN_FILES
= $(BPF_OBJ_FILES
)
37 # Also test sub-register code-gen if LLVM has eBPF v3 processor support which
38 # contains both ALU32 and JMP32 instructions.
39 SUBREG_CODEGEN
:= $(shell echo
"int cal(int a) { return a > 0; }" | \
40 $(CLANG
) -target bpf
-O2
-emit-llvm
-S
-x c
- -o
- | \
41 $(LLC
) -mattr
=+alu32
-mcpu
=v3
2>&1 | \
43 ifneq ($(SUBREG_CODEGEN
),)
44 TEST_GEN_FILES
+= $(patsubst %.o
,alu32
/%.o
, $(BPF_OBJ_FILES
))
47 # Order correspond to 'make run_tests' order
48 TEST_PROGS
:= test_kmod.sh \
50 test_xdp_redirect.sh \
56 test_lwt_seg6local.sh \
58 test_skb_cgroup_id.sh \
59 test_flow_dissector.sh \
60 test_xdp_vlan_mode_generic.sh \
61 test_xdp_vlan_mode_native.sh \
62 test_lwt_ip_encap.sh \
63 test_tcp_check_syncookie.sh \
68 TEST_PROGS_EXTENDED
:= with_addr.sh \
73 # Compile but not part of 'make run_tests'
74 TEST_GEN_PROGS_EXTENDED
= test_libbpf_open test_sock_addr test_skb_cgroup_id_user \
75 flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
80 # NOTE: $(OUTPUT) won't get default value if used before lib.mk
81 TEST_CUSTOM_PROGS
= $(OUTPUT
)/urandom_read
82 all: $(TEST_CUSTOM_PROGS
)
84 $(OUTPUT
)/urandom_read
: $(OUTPUT
)/%: %.c
85 $(CC
) -o
$@
$< -Wl
,--build-id
87 $(OUTPUT
)/test_stub.o
: test_stub.c
88 $(CC
) $(TEST_PROGS_CFLAGS
) $(CFLAGS
) -c
-o
$@
$<
90 BPFOBJ
:= $(OUTPUT
)/libbpf.a
92 $(TEST_GEN_PROGS
): $(OUTPUT
)/test_stub.o
$(BPFOBJ
)
94 $(TEST_GEN_PROGS_EXTENDED
): $(OUTPUT
)/test_stub.o
$(OUTPUT
)/libbpf.a
96 $(OUTPUT
)/test_dev_cgroup
: cgroup_helpers.c
97 $(OUTPUT
)/test_skb_cgroup_id_user
: cgroup_helpers.c
98 $(OUTPUT
)/test_sock
: cgroup_helpers.c
99 $(OUTPUT
)/test_sock_addr
: cgroup_helpers.c
100 $(OUTPUT
)/test_socket_cookie
: cgroup_helpers.c
101 $(OUTPUT
)/test_sockmap
: cgroup_helpers.c
102 $(OUTPUT
)/test_tcpbpf_user
: cgroup_helpers.c
103 $(OUTPUT
)/test_tcpnotify_user
: cgroup_helpers.c trace_helpers.c
104 $(OUTPUT
)/test_progs
: trace_helpers.c
105 $(OUTPUT
)/get_cgroup_id_user
: cgroup_helpers.c
106 $(OUTPUT
)/test_cgroup_storage
: cgroup_helpers.c
107 $(OUTPUT
)/test_netcnt
: cgroup_helpers.c
108 $(OUTPUT
)/test_sock_fields
: cgroup_helpers.c
109 $(OUTPUT
)/test_sysctl
: cgroup_helpers.c
110 $(OUTPUT
)/test_cgroup_attach
: cgroup_helpers.c
111 $(OUTPUT
)/test_sockopt
: cgroup_helpers.c
112 $(OUTPUT
)/test_sockopt_sk
: cgroup_helpers.c
113 $(OUTPUT
)/test_sockopt_multi
: cgroup_helpers.c
114 $(OUTPUT
)/test_tcp_rtt
: cgroup_helpers.c
118 # force a rebuild of BPFOBJ when its dependencies are updated
122 $(MAKE
) -C
$(BPFDIR
) OUTPUT
=$(OUTPUT
)/
124 PROBE
:= $(shell $(LLC
) -march
=bpf
-mcpu
=probe
-filetype
=null
/dev
/null
2>&1)
126 # Let newer LLVM versions transparently probe the kernel for availability
127 # of full BPF instruction set.
134 # Get Clang's default includes on this system, as opposed to those seen by
135 # '-target bpf'. This fixes "missing" files on some architectures/distros,
136 # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
138 # Use '-idirafter': Don't interfere with include mechanics except where the
139 # build would have failed anyways.
140 CLANG_SYS_INCLUDES
:= $(shell $(CLANG
) -v
-E
- </dev
/null
2>&1 \
141 | sed
-n
'/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
143 CLANG_FLAGS
= -I.
-I.
/include/uapi
-I..
/..
/..
/include/uapi \
144 $(CLANG_SYS_INCLUDES
) \
145 -Wno-compare-distinct-pointer-types \
146 -D__TARGET_ARCH_
$(SRCARCH
)
148 $(OUTPUT
)/test_l4lb_noinline.o
: CLANG_FLAGS
+= -fno-inline
149 $(OUTPUT
)/test_xdp_noinline.o
: CLANG_FLAGS
+= -fno-inline
151 $(OUTPUT
)/test_queue_map.o
: test_queue_stack_map.h
152 $(OUTPUT
)/test_stack_map.o
: test_queue_stack_map.h
154 $(OUTPUT
)/flow_dissector_load.o
: flow_dissector_load.h
155 $(OUTPUT
)/test_progs.o
: flow_dissector_load.h
157 BTF_LLC_PROBE
:= $(shell $(LLC
) -march
=bpf
-mattr
=help
2>&1 | grep dwarfris
)
158 BTF_PAHOLE_PROBE
:= $(shell $(BTF_PAHOLE
) --help
2>&1 | grep BTF
)
159 BTF_OBJCOPY_PROBE
:= $(shell $(LLVM_OBJCOPY
) --help
2>&1 | grep
-i
'usage.*llvm')
160 BTF_LLVM_PROBE
:= $(shell echo
"int main() { return 0; }" | \
161 $(CLANG
) -target bpf
-O2
-g
-c
-x c
- -o .
/llvm_btf_verify.o
; \
162 $(LLVM_READELF
) -S .
/llvm_btf_verify.o | grep BTF
; \
163 /bin
/rm -f .
/llvm_btf_verify.o
)
165 ifneq ($(BTF_LLVM_PROBE
),)
168 ifneq ($(BTF_LLC_PROBE
),)
169 ifneq ($(BTF_PAHOLE_PROBE
),)
170 ifneq ($(BTF_OBJCOPY_PROBE
),)
172 LLC_FLAGS
+= -mattr
=dwarfris
179 TEST_PROGS_CFLAGS
:= -I.
-I
$(OUTPUT
)
180 TEST_MAPS_CFLAGS
:= -I.
-I
$(OUTPUT
)
181 TEST_VERIFIER_CFLAGS
:= -I.
-I
$(OUTPUT
) -Iverifier
183 ifneq ($(SUBREG_CODEGEN
),)
184 ALU32_BUILD_DIR
= $(OUTPUT
)/alu32
185 TEST_CUSTOM_PROGS
+= $(ALU32_BUILD_DIR
)/test_progs_32
189 $(ALU32_BUILD_DIR
)/urandom_read
: $(OUTPUT
)/urandom_read |
$(ALU32_BUILD_DIR
)
192 $(ALU32_BUILD_DIR
)/test_progs_32
: test_progs.c
$(OUTPUT
)/libbpf.a\
193 $(ALU32_BUILD_DIR
)/urandom_read \
195 $(CC
) $(TEST_PROGS_CFLAGS
) $(CFLAGS
) \
196 -o
$(ALU32_BUILD_DIR
)/test_progs_32 \
197 test_progs.c test_stub.c trace_helpers.c prog_tests
/*.c \
198 $(OUTPUT
)/libbpf.a
$(LDLIBS
)
200 $(ALU32_BUILD_DIR
)/test_progs_32
: $(PROG_TESTS_H
)
201 $(ALU32_BUILD_DIR
)/test_progs_32
: prog_tests
/*.c
203 $(ALU32_BUILD_DIR
)/%.o
: progs
/%.c
$(ALU32_BUILD_DIR
)/test_progs_32 \
205 ($(CLANG
) $(CLANG_FLAGS
) -O2
-target bpf
-emit-llvm
-c
$< -o
- || \
206 echo
"clang failed") | \
207 $(LLC
) -march
=bpf
-mattr
=+alu32
-mcpu
=$(CPU
) $(LLC_FLAGS
) \
209 ifeq ($(DWARF2BTF
),y
)
214 # Have one program compiled without "-target bpf" to test whether libbpf loads
216 $(OUTPUT
)/test_xdp.o
: progs
/test_xdp.c
217 ($(CLANG
) $(CLANG_FLAGS
) -O2
-emit-llvm
-c
$< -o
- || \
218 echo
"clang failed") | \
219 $(LLC
) -march
=bpf
-mcpu
=$(CPU
) $(LLC_FLAGS
) -filetype
=obj
-o
$@
220 ifeq ($(DWARF2BTF
),y
)
224 $(OUTPUT
)/%.o
: progs
/%.c
225 ($(CLANG
) $(CLANG_FLAGS
) -O2
-target bpf
-emit-llvm
-c
$< -o
- || \
226 echo
"clang failed") | \
227 $(LLC
) -march
=bpf
-mcpu
=$(CPU
) $(LLC_FLAGS
) -filetype
=obj
-o
$@
228 ifeq ($(DWARF2BTF
),y
)
232 PROG_TESTS_DIR
= $(OUTPUT
)/prog_tests
235 PROG_TESTS_H
:= $(PROG_TESTS_DIR
)/tests.h
236 PROG_TESTS_FILES
:= $(wildcard prog_tests
/*.c
)
237 test_progs.c
: $(PROG_TESTS_H
)
238 $(OUTPUT
)/test_progs
: CFLAGS
+= $(TEST_PROGS_CFLAGS
)
239 $(OUTPUT
)/test_progs
: test_progs.c
$(PROG_TESTS_H
) $(PROG_TESTS_FILES
)
240 $(PROG_TESTS_H
): $(PROG_TESTS_FILES
) |
$(PROG_TESTS_DIR
)
241 $(shell ( cd prog_tests
/; \
242 echo
'/* Generated header, do not edit */'; \
243 echo
'#ifdef DECLARE'; \
244 ls
*.c
2> /dev
/null | \
245 sed
-e
's@\([^\.]*\)\.c@extern void test_\1(void);@'; \
247 echo
'#ifdef CALL'; \
248 ls
*.c
2> /dev
/null | \
249 sed
-e
's@\([^\.]*\)\.c@test_\1();@'; \
253 MAP_TESTS_DIR
= $(OUTPUT
)/map_tests
256 MAP_TESTS_H
:= $(MAP_TESTS_DIR
)/tests.h
257 MAP_TESTS_FILES
:= $(wildcard map_tests
/*.c
)
258 test_maps.c
: $(MAP_TESTS_H
)
259 $(OUTPUT
)/test_maps
: CFLAGS
+= $(TEST_MAPS_CFLAGS
)
260 $(OUTPUT
)/test_maps
: test_maps.c
$(MAP_TESTS_H
) $(MAP_TESTS_FILES
)
261 $(MAP_TESTS_H
): $(MAP_TESTS_FILES
) |
$(MAP_TESTS_DIR
)
262 $(shell ( cd map_tests
/; \
263 echo
'/* Generated header, do not edit */'; \
264 echo
'#ifdef DECLARE'; \
265 ls
*.c
2> /dev
/null | \
266 sed
-e
's@\([^\.]*\)\.c@extern void test_\1(void);@'; \
268 echo
'#ifdef CALL'; \
269 ls
*.c
2> /dev
/null | \
270 sed
-e
's@\([^\.]*\)\.c@test_\1();@'; \
274 VERIFIER_TESTS_DIR
= $(OUTPUT
)/verifier
275 $(VERIFIER_TESTS_DIR
):
277 VERIFIER_TESTS_H
:= $(VERIFIER_TESTS_DIR
)/tests.h
278 VERIFIER_TEST_FILES
:= $(wildcard verifier
/*.c
)
279 test_verifier.c
: $(VERIFIER_TESTS_H
)
280 $(OUTPUT
)/test_verifier
: CFLAGS
+= $(TEST_VERIFIER_CFLAGS
)
281 $(OUTPUT
)/test_verifier
: test_verifier.c
$(VERIFIER_TESTS_H
)
282 $(VERIFIER_TESTS_H
): $(VERIFIER_TEST_FILES
) |
$(VERIFIER_TESTS_DIR
)
283 $(shell ( cd verifier
/; \
284 echo
'/* Generated header, do not edit */'; \
285 echo
'#ifdef FILL_ARRAY'; \
286 ls
*.c
2> /dev
/null | \
287 sed
-e
's@\(.*\)@#include \"\1\"@'; \
289 ) > $(VERIFIER_TESTS_H
))
291 EXTRA_CLEAN
:= $(TEST_CUSTOM_PROGS
) $(ALU32_BUILD_DIR
) \
292 $(VERIFIER_TESTS_H
) $(PROG_TESTS_H
) $(MAP_TESTS_H
) \