1 # SPDX-License-Identifier: GPL-2.0
4 BPFDIR
:= $(LIBDIR
)/bpf
5 APIDIR
:= ..
/..
/..
/include/uapi
6 GENDIR
:= ..
/..
/..
/..
/include/generated
7 GENHDR
:= $(GENDIR
)/autoconf.h
9 ifneq ($(wildcard $(GENHDR
)),)
10 GENFLAGS
:= -DHAVE_GENHDR
15 LLVM_OBJCOPY ?
= llvm-objcopy
16 LLVM_READELF ?
= llvm-readelf
18 CFLAGS
+= -Wall
-O2
-I
$(APIDIR
) -I
$(LIBDIR
) -I
$(BPFDIR
) -I
$(GENDIR
) $(GENFLAGS
) -I..
/..
/..
/include
19 LDLIBS
+= -lcap
-lelf
-lrt
-lpthread
21 # Order correspond to 'make run_tests' order
22 TEST_GEN_PROGS
= test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
23 test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
24 test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
25 test_cgroup_storage test_select_reuseport test_section_names \
26 test_netcnt test_tcpnotify_user test_sock_fields test_sysctl
28 BPF_OBJ_FILES
= $(patsubst %.c
,%.o
, $(notdir $(wildcard progs
/*.c
)))
29 TEST_GEN_FILES
= $(BPF_OBJ_FILES
)
31 # Also test sub-register code-gen if LLVM has eBPF v3 processor support which
32 # contains both ALU32 and JMP32 instructions.
33 SUBREG_CODEGEN
:= $(shell echo
"int cal(int a) { return a > 0; }" | \
34 $(CLANG
) -target bpf
-O2
-emit-llvm
-S
-x c
- -o
- | \
35 $(LLC
) -mattr
=+alu32
-mcpu
=v3
2>&1 | \
37 ifneq ($(SUBREG_CODEGEN
),)
38 TEST_GEN_FILES
+= $(patsubst %.o
,alu32
/%.o
, $(BPF_OBJ_FILES
))
41 # Order correspond to 'make run_tests' order
42 TEST_PROGS
:= test_kmod.sh \
44 test_xdp_redirect.sh \
49 test_lwt_seg6local.sh \
51 test_skb_cgroup_id.sh \
52 test_flow_dissector.sh \
54 test_lwt_ip_encap.sh \
55 test_tcp_check_syncookie.sh \
59 TEST_PROGS_EXTENDED
:= with_addr.sh \
64 # Compile but not part of 'make run_tests'
65 TEST_GEN_PROGS_EXTENDED
= test_libbpf_open test_sock_addr test_skb_cgroup_id_user \
66 flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
71 # NOTE: $(OUTPUT) won't get default value if used before lib.mk
72 TEST_CUSTOM_PROGS
= $(OUTPUT
)/urandom_read
73 all: $(TEST_CUSTOM_PROGS
)
75 $(OUTPUT
)/urandom_read
: $(OUTPUT
)/%: %.c
76 $(CC
) -o
$@
$< -Wl
,--build-id
78 $(OUTPUT
)/test_maps
: map_tests
/*.c
80 BPFOBJ
:= $(OUTPUT
)/libbpf.a
82 $(TEST_GEN_PROGS
): $(BPFOBJ
)
84 $(TEST_GEN_PROGS_EXTENDED
): $(OUTPUT
)/libbpf.a
86 $(OUTPUT
)/test_dev_cgroup
: cgroup_helpers.c
87 $(OUTPUT
)/test_skb_cgroup_id_user
: cgroup_helpers.c
88 $(OUTPUT
)/test_sock
: cgroup_helpers.c
89 $(OUTPUT
)/test_sock_addr
: cgroup_helpers.c
90 $(OUTPUT
)/test_socket_cookie
: cgroup_helpers.c
91 $(OUTPUT
)/test_sockmap
: cgroup_helpers.c
92 $(OUTPUT
)/test_tcpbpf_user
: cgroup_helpers.c
93 $(OUTPUT
)/test_tcpnotify_user
: cgroup_helpers.c trace_helpers.c
94 $(OUTPUT
)/test_progs
: trace_helpers.c
95 $(OUTPUT
)/get_cgroup_id_user
: cgroup_helpers.c
96 $(OUTPUT
)/test_cgroup_storage
: cgroup_helpers.c
97 $(OUTPUT
)/test_netcnt
: cgroup_helpers.c
98 $(OUTPUT
)/test_sock_fields
: cgroup_helpers.c
99 $(OUTPUT
)/test_sysctl
: cgroup_helpers.c
103 # force a rebuild of BPFOBJ when its dependencies are updated
107 $(MAKE
) -C
$(BPFDIR
) OUTPUT
=$(OUTPUT
)/
109 PROBE
:= $(shell $(LLC
) -march
=bpf
-mcpu
=probe
-filetype
=null
/dev
/null
2>&1)
111 # Let newer LLVM versions transparently probe the kernel for availability
112 # of full BPF instruction set.
119 # Get Clang's default includes on this system, as opposed to those seen by
120 # '-target bpf'. This fixes "missing" files on some architectures/distros,
121 # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
123 # Use '-idirafter': Don't interfere with include mechanics except where the
124 # build would have failed anyways.
125 CLANG_SYS_INCLUDES
:= $(shell $(CLANG
) -v
-E
- </dev
/null
2>&1 \
126 | sed
-n
'/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
128 CLANG_FLAGS
= -I.
-I.
/include/uapi
-I..
/..
/..
/include/uapi \
129 $(CLANG_SYS_INCLUDES
) \
130 -Wno-compare-distinct-pointer-types
132 $(OUTPUT
)/test_l4lb_noinline.o
: CLANG_FLAGS
+= -fno-inline
133 $(OUTPUT
)/test_xdp_noinline.o
: CLANG_FLAGS
+= -fno-inline
135 $(OUTPUT
)/test_queue_map.o
: test_queue_stack_map.h
136 $(OUTPUT
)/test_stack_map.o
: test_queue_stack_map.h
138 $(OUTPUT
)/flow_dissector_load.o
: flow_dissector_load.h
139 $(OUTPUT
)/test_progs.o
: flow_dissector_load.h
141 BTF_LLC_PROBE
:= $(shell $(LLC
) -march
=bpf
-mattr
=help
2>&1 | grep dwarfris
)
142 BTF_PAHOLE_PROBE
:= $(shell $(BTF_PAHOLE
) --help
2>&1 | grep BTF
)
143 BTF_OBJCOPY_PROBE
:= $(shell $(LLVM_OBJCOPY
) --help
2>&1 | grep
-i
'usage.*llvm')
144 BTF_LLVM_PROBE
:= $(shell echo
"int main() { return 0; }" | \
145 $(CLANG
) -target bpf
-O2
-g
-c
-x c
- -o .
/llvm_btf_verify.o
; \
146 $(LLVM_READELF
) -S .
/llvm_btf_verify.o | grep BTF
; \
147 /bin
/rm -f .
/llvm_btf_verify.o
)
149 ifneq ($(BTF_LLVM_PROBE
),)
152 ifneq ($(BTF_LLC_PROBE
),)
153 ifneq ($(BTF_PAHOLE_PROBE
),)
154 ifneq ($(BTF_OBJCOPY_PROBE
),)
156 LLC_FLAGS
+= -mattr
=dwarfris
163 TEST_PROGS_CFLAGS
:= -I.
-I
$(OUTPUT
)
164 TEST_VERIFIER_CFLAGS
:= -I.
-I
$(OUTPUT
) -Iverifier
166 ifneq ($(SUBREG_CODEGEN
),)
167 ALU32_BUILD_DIR
= $(OUTPUT
)/alu32
168 TEST_CUSTOM_PROGS
+= $(ALU32_BUILD_DIR
)/test_progs_32
172 $(ALU32_BUILD_DIR
)/urandom_read
: $(OUTPUT
)/urandom_read
175 $(ALU32_BUILD_DIR
)/test_progs_32
: test_progs.c
$(OUTPUT
)/libbpf.a\
177 $(ALU32_BUILD_DIR
)/urandom_read
178 $(CC
) $(TEST_PROGS_CFLAGS
) $(CFLAGS
) \
179 -o
$(ALU32_BUILD_DIR
)/test_progs_32 \
180 test_progs.c trace_helpers.c prog_tests
/*.c \
181 $(OUTPUT
)/libbpf.a
$(LDLIBS
)
183 $(ALU32_BUILD_DIR
)/test_progs_32
: $(PROG_TESTS_H
)
184 $(ALU32_BUILD_DIR
)/test_progs_32
: prog_tests
/*.c
186 $(ALU32_BUILD_DIR
)/%.o
: progs
/%.c
$(ALU32_BUILD_DIR
) \
187 $(ALU32_BUILD_DIR
)/test_progs_32
188 $(CLANG
) $(CLANG_FLAGS
) \
189 -O2
-target bpf
-emit-llvm
-c
$< -o
- | \
190 $(LLC
) -march
=bpf
-mattr
=+alu32
-mcpu
=$(CPU
) $(LLC_FLAGS
) \
192 ifeq ($(DWARF2BTF
),y
)
197 # Have one program compiled without "-target bpf" to test whether libbpf loads
199 $(OUTPUT
)/test_xdp.o
: progs
/test_xdp.c
200 $(CLANG
) $(CLANG_FLAGS
) \
201 -O2
-emit-llvm
-c
$< -o
- | \
202 $(LLC
) -march
=bpf
-mcpu
=$(CPU
) $(LLC_FLAGS
) -filetype
=obj
-o
$@
203 ifeq ($(DWARF2BTF
),y
)
207 $(OUTPUT
)/%.o
: progs
/%.c
208 $(CLANG
) $(CLANG_FLAGS
) \
209 -O2
-target bpf
-emit-llvm
-c
$< -o
- | \
210 $(LLC
) -march
=bpf
-mcpu
=$(CPU
) $(LLC_FLAGS
) -filetype
=obj
-o
$@
211 ifeq ($(DWARF2BTF
),y
)
215 PROG_TESTS_H
:= $(OUTPUT
)/prog_tests
/tests.h
216 test_progs.c
: $(PROG_TESTS_H
)
217 $(OUTPUT
)/test_progs
: CFLAGS
+= $(TEST_PROGS_CFLAGS
)
218 $(OUTPUT
)/test_progs
: prog_tests
/*.c
220 PROG_TESTS_DIR
= $(OUTPUT
)/prog_tests
224 PROG_TESTS_FILES
:= $(wildcard prog_tests
/*.c
)
225 $(PROG_TESTS_H
): $(PROG_TESTS_DIR
) $(PROG_TESTS_FILES
)
226 $(shell ( cd prog_tests
/; \
227 echo
'/* Generated header, do not edit */'; \
228 echo
'#ifdef DECLARE'; \
229 ls
*.c
2> /dev
/null | \
230 sed
-e
's@\([^\.]*\)\.c@extern void test_\1(void);@'; \
232 echo
'#ifdef CALL'; \
233 ls
*.c
2> /dev
/null | \
234 sed
-e
's@\([^\.]*\)\.c@test_\1();@'; \
238 TEST_MAPS_CFLAGS
:= -I.
-I
$(OUTPUT
)
239 MAP_TESTS_DIR
= $(OUTPUT
)/map_tests
242 MAP_TESTS_H
:= $(MAP_TESTS_DIR
)/tests.h
243 test_maps.c
: $(MAP_TESTS_H
)
244 $(OUTPUT
)/test_maps
: CFLAGS
+= $(TEST_MAPS_CFLAGS
)
245 MAP_TESTS_FILES
:= $(wildcard map_tests
/*.c
)
246 $(MAP_TESTS_H
): $(MAP_TESTS_DIR
) $(MAP_TESTS_FILES
)
247 $(shell ( cd map_tests
/; \
248 echo
'/* Generated header, do not edit */'; \
249 echo
'#ifdef DECLARE'; \
250 ls
*.c
2> /dev
/null | \
251 sed
-e
's@\([^\.]*\)\.c@extern void test_\1(void);@'; \
253 echo
'#ifdef CALL'; \
254 ls
*.c
2> /dev
/null | \
255 sed
-e
's@\([^\.]*\)\.c@test_\1();@'; \
259 VERIFIER_TESTS_H
:= $(OUTPUT
)/verifier
/tests.h
260 test_verifier.c
: $(VERIFIER_TESTS_H
)
261 $(OUTPUT
)/test_verifier
: CFLAGS
+= $(TEST_VERIFIER_CFLAGS
)
263 VERIFIER_TESTS_DIR
= $(OUTPUT
)/verifier
264 $(VERIFIER_TESTS_DIR
):
267 VERIFIER_TEST_FILES
:= $(wildcard verifier
/*.c
)
268 $(OUTPUT
)/verifier
/tests.h
: $(VERIFIER_TESTS_DIR
) $(VERIFIER_TEST_FILES
)
269 $(shell ( cd verifier
/; \
270 echo
'/* Generated header, do not edit */'; \
271 echo
'#ifdef FILL_ARRAY'; \
272 ls
*.c
2> /dev
/null | \
273 sed
-e
's@\(.*\)@#include \"\1\"@'; \
275 ) > $(VERIFIER_TESTS_H
))
277 EXTRA_CLEAN
:= $(TEST_CUSTOM_PROGS
) $(ALU32_BUILD_DIR
) \
278 $(VERIFIER_TESTS_H
) $(PROG_TESTS_H
) $(MAP_TESTS_H
)