xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/bpf/Makefile (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
2*053f45beSAndroid Build Coastguard Workerinclude ../../../build/Build.include
3*053f45beSAndroid Build Coastguard Workerinclude ../../../scripts/Makefile.arch
4*053f45beSAndroid Build Coastguard Workerinclude ../../../scripts/Makefile.include
5*053f45beSAndroid Build Coastguard Worker
6*053f45beSAndroid Build Coastguard WorkerCXX ?= $(CROSS_COMPILE)g++
7*053f45beSAndroid Build Coastguard Worker
8*053f45beSAndroid Build Coastguard WorkerCURDIR := $(abspath .)
9*053f45beSAndroid Build Coastguard WorkerTOOLSDIR := $(abspath ../../..)
10*053f45beSAndroid Build Coastguard WorkerLIBDIR := $(TOOLSDIR)/lib
11*053f45beSAndroid Build Coastguard WorkerBPFDIR := $(LIBDIR)/bpf
12*053f45beSAndroid Build Coastguard WorkerTOOLSINCDIR := $(TOOLSDIR)/include
13*053f45beSAndroid Build Coastguard WorkerBPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
14*053f45beSAndroid Build Coastguard WorkerAPIDIR := $(TOOLSINCDIR)/uapi
15*053f45beSAndroid Build Coastguard WorkerGENDIR := $(abspath ../../../../include/generated)
16*053f45beSAndroid Build Coastguard WorkerGENHDR := $(GENDIR)/autoconf.h
17*053f45beSAndroid Build Coastguard WorkerHOSTPKG_CONFIG := pkg-config
18*053f45beSAndroid Build Coastguard Worker
19*053f45beSAndroid Build Coastguard Workerifneq ($(wildcard $(GENHDR)),)
20*053f45beSAndroid Build Coastguard Worker  GENFLAGS := -DHAVE_GENHDR
21*053f45beSAndroid Build Coastguard Workerendif
22*053f45beSAndroid Build Coastguard Worker
23*053f45beSAndroid Build Coastguard WorkerBPF_GCC		?= $(shell command -v bpf-gcc;)
24*053f45beSAndroid Build Coastguard WorkerSAN_CFLAGS	?=
25*053f45beSAndroid Build Coastguard WorkerCFLAGS += -g -O0 -rdynamic -Wall -Werror $(GENFLAGS) $(SAN_CFLAGS)	\
26*053f45beSAndroid Build Coastguard Worker	  -I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR)		\
27*053f45beSAndroid Build Coastguard Worker	  -I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT)
28*053f45beSAndroid Build Coastguard WorkerLDFLAGS += $(SAN_CFLAGS)
29*053f45beSAndroid Build Coastguard WorkerLDLIBS += -lelf -lz -lrt -lpthread
30*053f45beSAndroid Build Coastguard Worker
31*053f45beSAndroid Build Coastguard Worker# Silence some warnings when compiled with clang
32*053f45beSAndroid Build Coastguard Workerifneq ($(LLVM),)
33*053f45beSAndroid Build Coastguard WorkerCFLAGS += -Wno-unused-command-line-argument
34*053f45beSAndroid Build Coastguard Workerendif
35*053f45beSAndroid Build Coastguard Worker
36*053f45beSAndroid Build Coastguard Worker# Order correspond to 'make run_tests' order
37*053f45beSAndroid Build Coastguard WorkerTEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
38*053f45beSAndroid Build Coastguard Worker	test_verifier_log test_dev_cgroup \
39*053f45beSAndroid Build Coastguard Worker	test_sock test_sockmap get_cgroup_id_user \
40*053f45beSAndroid Build Coastguard Worker	test_cgroup_storage \
41*053f45beSAndroid Build Coastguard Worker	test_tcpnotify_user test_sysctl \
42*053f45beSAndroid Build Coastguard Worker	test_progs-no_alu32
43*053f45beSAndroid Build Coastguard Worker
44*053f45beSAndroid Build Coastguard Worker# Also test bpf-gcc, if present
45*053f45beSAndroid Build Coastguard Workerifneq ($(BPF_GCC),)
46*053f45beSAndroid Build Coastguard WorkerTEST_GEN_PROGS += test_progs-bpf_gcc
47*053f45beSAndroid Build Coastguard Workerendif
48*053f45beSAndroid Build Coastguard Worker
49*053f45beSAndroid Build Coastguard WorkerTEST_GEN_FILES = test_lwt_ip_encap.bpf.o test_tc_edt.bpf.o
50*053f45beSAndroid Build Coastguard WorkerTEST_FILES = xsk_prereqs.sh $(wildcard progs/btf_dump_test_case_*.c)
51*053f45beSAndroid Build Coastguard Worker
52*053f45beSAndroid Build Coastguard Worker# Order correspond to 'make run_tests' order
53*053f45beSAndroid Build Coastguard WorkerTEST_PROGS := test_kmod.sh \
54*053f45beSAndroid Build Coastguard Worker	test_xdp_redirect.sh \
55*053f45beSAndroid Build Coastguard Worker	test_xdp_redirect_multi.sh \
56*053f45beSAndroid Build Coastguard Worker	test_xdp_meta.sh \
57*053f45beSAndroid Build Coastguard Worker	test_xdp_veth.sh \
58*053f45beSAndroid Build Coastguard Worker	test_offload.py \
59*053f45beSAndroid Build Coastguard Worker	test_sock_addr.sh \
60*053f45beSAndroid Build Coastguard Worker	test_tunnel.sh \
61*053f45beSAndroid Build Coastguard Worker	test_lwt_seg6local.sh \
62*053f45beSAndroid Build Coastguard Worker	test_lirc_mode2.sh \
63*053f45beSAndroid Build Coastguard Worker	test_skb_cgroup_id.sh \
64*053f45beSAndroid Build Coastguard Worker	test_flow_dissector.sh \
65*053f45beSAndroid Build Coastguard Worker	test_xdp_vlan_mode_generic.sh \
66*053f45beSAndroid Build Coastguard Worker	test_xdp_vlan_mode_native.sh \
67*053f45beSAndroid Build Coastguard Worker	test_lwt_ip_encap.sh \
68*053f45beSAndroid Build Coastguard Worker	test_tcp_check_syncookie.sh \
69*053f45beSAndroid Build Coastguard Worker	test_tc_tunnel.sh \
70*053f45beSAndroid Build Coastguard Worker	test_tc_edt.sh \
71*053f45beSAndroid Build Coastguard Worker	test_xdping.sh \
72*053f45beSAndroid Build Coastguard Worker	test_bpftool_build.sh \
73*053f45beSAndroid Build Coastguard Worker	test_bpftool.sh \
74*053f45beSAndroid Build Coastguard Worker	test_bpftool_metadata.sh \
75*053f45beSAndroid Build Coastguard Worker	test_doc_build.sh \
76*053f45beSAndroid Build Coastguard Worker	test_xsk.sh
77*053f45beSAndroid Build Coastguard Worker
78*053f45beSAndroid Build Coastguard WorkerTEST_PROGS_EXTENDED := with_addr.sh \
79*053f45beSAndroid Build Coastguard Worker	with_tunnels.sh ima_setup.sh verify_sig_setup.sh \
80*053f45beSAndroid Build Coastguard Worker	test_xdp_vlan.sh test_bpftool.py
81*053f45beSAndroid Build Coastguard Worker
82*053f45beSAndroid Build Coastguard Worker# Compile but not part of 'make run_tests'
83*053f45beSAndroid Build Coastguard WorkerTEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \
84*053f45beSAndroid Build Coastguard Worker	flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
85*053f45beSAndroid Build Coastguard Worker	test_lirc_mode2_user xdping test_cpp runqslower bench bpf_testmod.ko \
86*053f45beSAndroid Build Coastguard Worker	xskxceiver xdp_redirect_multi xdp_synproxy veristat
87*053f45beSAndroid Build Coastguard Worker
88*053f45beSAndroid Build Coastguard WorkerTEST_CUSTOM_PROGS = $(OUTPUT)/urandom_read $(OUTPUT)/sign-file
89*053f45beSAndroid Build Coastguard WorkerTEST_GEN_FILES += liburandom_read.so
90*053f45beSAndroid Build Coastguard Worker
91*053f45beSAndroid Build Coastguard Worker# Emit succinct information message describing current building step
92*053f45beSAndroid Build Coastguard Worker# $1 - generic step name (e.g., CC, LINK, etc);
93*053f45beSAndroid Build Coastguard Worker# $2 - optional "flavor" specifier; if provided, will be emitted as [flavor];
94*053f45beSAndroid Build Coastguard Worker# $3 - target (assumed to be file); only file name will be emitted;
95*053f45beSAndroid Build Coastguard Worker# $4 - optional extra arg, emitted as-is, if provided.
96*053f45beSAndroid Build Coastguard Workerifeq ($(V),1)
97*053f45beSAndroid Build Coastguard WorkerQ =
98*053f45beSAndroid Build Coastguard Workermsg =
99*053f45beSAndroid Build Coastguard Workerelse
100*053f45beSAndroid Build Coastguard WorkerQ = @
101*053f45beSAndroid Build Coastguard Workermsg = @printf '  %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))";
102*053f45beSAndroid Build Coastguard WorkerMAKEFLAGS += --no-print-directory
103*053f45beSAndroid Build Coastguard Workersubmake_extras := feature_display=0
104*053f45beSAndroid Build Coastguard Workerendif
105*053f45beSAndroid Build Coastguard Worker
106*053f45beSAndroid Build Coastguard Worker# override lib.mk's default rules
107*053f45beSAndroid Build Coastguard WorkerOVERRIDE_TARGETS := 1
108*053f45beSAndroid Build Coastguard Workeroverride define CLEAN
109*053f45beSAndroid Build Coastguard Worker	$(call msg,CLEAN)
110*053f45beSAndroid Build Coastguard Worker	$(Q)$(RM) -r $(TEST_GEN_PROGS)
111*053f45beSAndroid Build Coastguard Worker	$(Q)$(RM) -r $(TEST_GEN_PROGS_EXTENDED)
112*053f45beSAndroid Build Coastguard Worker	$(Q)$(RM) -r $(TEST_GEN_FILES)
113*053f45beSAndroid Build Coastguard Worker	$(Q)$(RM) -r $(EXTRA_CLEAN)
114*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) -C bpf_testmod clean
115*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) docs-clean
116*053f45beSAndroid Build Coastguard Workerendef
117*053f45beSAndroid Build Coastguard Worker
118*053f45beSAndroid Build Coastguard Workerinclude ../lib.mk
119*053f45beSAndroid Build Coastguard Worker
120*053f45beSAndroid Build Coastguard WorkerSCRATCH_DIR := $(OUTPUT)/tools
121*053f45beSAndroid Build Coastguard WorkerBUILD_DIR := $(SCRATCH_DIR)/build
122*053f45beSAndroid Build Coastguard WorkerINCLUDE_DIR := $(SCRATCH_DIR)/include
123*053f45beSAndroid Build Coastguard WorkerBPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a
124*053f45beSAndroid Build Coastguard Workerifneq ($(CROSS_COMPILE),)
125*053f45beSAndroid Build Coastguard WorkerHOST_BUILD_DIR		:= $(BUILD_DIR)/host
126*053f45beSAndroid Build Coastguard WorkerHOST_SCRATCH_DIR	:= $(OUTPUT)/host-tools
127*053f45beSAndroid Build Coastguard WorkerHOST_INCLUDE_DIR	:= $(HOST_SCRATCH_DIR)/include
128*053f45beSAndroid Build Coastguard Workerelse
129*053f45beSAndroid Build Coastguard WorkerHOST_BUILD_DIR		:= $(BUILD_DIR)
130*053f45beSAndroid Build Coastguard WorkerHOST_SCRATCH_DIR	:= $(SCRATCH_DIR)
131*053f45beSAndroid Build Coastguard WorkerHOST_INCLUDE_DIR	:= $(INCLUDE_DIR)
132*053f45beSAndroid Build Coastguard Workerendif
133*053f45beSAndroid Build Coastguard WorkerHOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a
134*053f45beSAndroid Build Coastguard WorkerRESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids
135*053f45beSAndroid Build Coastguard WorkerRUNQSLOWER_OUTPUT := $(BUILD_DIR)/runqslower/
136*053f45beSAndroid Build Coastguard Worker
137*053f45beSAndroid Build Coastguard WorkerVMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux)				\
138*053f45beSAndroid Build Coastguard Worker		     $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)	\
139*053f45beSAndroid Build Coastguard Worker		     ../../../../vmlinux				\
140*053f45beSAndroid Build Coastguard Worker		     /sys/kernel/btf/vmlinux				\
141*053f45beSAndroid Build Coastguard Worker		     /boot/vmlinux-$(shell uname -r)
142*053f45beSAndroid Build Coastguard WorkerVMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
143*053f45beSAndroid Build Coastguard Workerifeq ($(VMLINUX_BTF),)
144*053f45beSAndroid Build Coastguard Worker$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
145*053f45beSAndroid Build Coastguard Workerendif
146*053f45beSAndroid Build Coastguard Worker
147*053f45beSAndroid Build Coastguard Worker# Define simple and short `make test_progs`, `make test_sysctl`, etc targets
148*053f45beSAndroid Build Coastguard Worker# to build individual tests.
149*053f45beSAndroid Build Coastguard Worker# NOTE: Semicolon at the end is critical to override lib.mk's default static
150*053f45beSAndroid Build Coastguard Worker# rule for binaries.
151*053f45beSAndroid Build Coastguard Worker$(notdir $(TEST_GEN_PROGS)						\
152*053f45beSAndroid Build Coastguard Worker	 $(TEST_PROGS)							\
153*053f45beSAndroid Build Coastguard Worker	 $(TEST_PROGS_EXTENDED)						\
154*053f45beSAndroid Build Coastguard Worker	 $(TEST_GEN_PROGS_EXTENDED)					\
155*053f45beSAndroid Build Coastguard Worker	 $(TEST_CUSTOM_PROGS)): %: $(OUTPUT)/% ;
156*053f45beSAndroid Build Coastguard Worker
157*053f45beSAndroid Build Coastguard Worker# sort removes libbpf duplicates when not cross-building
158*053f45beSAndroid Build Coastguard WorkerMAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf	       \
159*053f45beSAndroid Build Coastguard Worker	       $(HOST_BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/resolve_btfids      \
160*053f45beSAndroid Build Coastguard Worker	       $(RUNQSLOWER_OUTPUT) $(INCLUDE_DIR))
161*053f45beSAndroid Build Coastguard Worker$(MAKE_DIRS):
162*053f45beSAndroid Build Coastguard Worker	$(call msg,MKDIR,,$@)
163*053f45beSAndroid Build Coastguard Worker	$(Q)mkdir -p $@
164*053f45beSAndroid Build Coastguard Worker
165*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/%.o: %.c
166*053f45beSAndroid Build Coastguard Worker	$(call msg,CC,,$@)
167*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@
168*053f45beSAndroid Build Coastguard Worker
169*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/%:%.c
170*053f45beSAndroid Build Coastguard Worker	$(call msg,BINARY,,$@)
171*053f45beSAndroid Build Coastguard Worker	$(Q)$(LINK.c) $^ $(LDLIBS) -o $@
172*053f45beSAndroid Build Coastguard Worker
173*053f45beSAndroid Build Coastguard Worker# LLVM's ld.lld doesn't support all the architectures, so use it only on x86
174*053f45beSAndroid Build Coastguard Workerifeq ($(SRCARCH),x86)
175*053f45beSAndroid Build Coastguard WorkerLLD := lld
176*053f45beSAndroid Build Coastguard Workerelse
177*053f45beSAndroid Build Coastguard WorkerLLD := ld
178*053f45beSAndroid Build Coastguard Workerendif
179*053f45beSAndroid Build Coastguard Worker
180*053f45beSAndroid Build Coastguard Worker# Filter out -static for liburandom_read.so and its dependent targets so that static builds
181*053f45beSAndroid Build Coastguard Worker# do not fail. Static builds leave urandom_read relying on system-wide shared libraries.
182*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/liburandom_read.so: urandom_read_lib1.c urandom_read_lib2.c
183*053f45beSAndroid Build Coastguard Worker	$(call msg,LIB,,$@)
184*053f45beSAndroid Build Coastguard Worker	$(Q)$(CLANG) $(filter-out -static,$(CFLAGS) $(LDFLAGS)) $^ $(LDLIBS)   \
185*053f45beSAndroid Build Coastguard Worker		     -fuse-ld=$(LLD) -Wl,-znoseparate-code -fPIC -shared -o $@
186*053f45beSAndroid Build Coastguard Worker
187*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/urandom_read: urandom_read.c urandom_read_aux.c $(OUTPUT)/liburandom_read.so
188*053f45beSAndroid Build Coastguard Worker	$(call msg,BINARY,,$@)
189*053f45beSAndroid Build Coastguard Worker	$(Q)$(CLANG) $(filter-out -static,$(CFLAGS) $(LDFLAGS)) $(filter %.c,$^) \
190*053f45beSAndroid Build Coastguard Worker		     liburandom_read.so $(LDLIBS)			       \
191*053f45beSAndroid Build Coastguard Worker		     -fuse-ld=$(LLD) -Wl,-znoseparate-code		       \
192*053f45beSAndroid Build Coastguard Worker		     -Wl,-rpath=. -Wl,--build-id=sha1 -o $@
193*053f45beSAndroid Build Coastguard Worker
194*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/sign-file: ../../../../scripts/sign-file.c
195*053f45beSAndroid Build Coastguard Worker	$(call msg,SIGN-FILE,,$@)
196*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(shell $(HOSTPKG_CONFIG)--cflags libcrypto 2> /dev/null) \
197*053f45beSAndroid Build Coastguard Worker		  $< -o $@ \
198*053f45beSAndroid Build Coastguard Worker		  $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
199*053f45beSAndroid Build Coastguard Worker
200*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bpf_testmod.ko: $(VMLINUX_BTF) $(wildcard bpf_testmod/Makefile bpf_testmod/*.[ch])
201*053f45beSAndroid Build Coastguard Worker	$(call msg,MOD,,$@)
202*053f45beSAndroid Build Coastguard Worker	$(Q)$(RM) bpf_testmod/bpf_testmod.ko # force re-compilation
203*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras) -C bpf_testmod
204*053f45beSAndroid Build Coastguard Worker	$(Q)cp bpf_testmod/bpf_testmod.ko $@
205*053f45beSAndroid Build Coastguard Worker
206*053f45beSAndroid Build Coastguard WorkerDEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
207*053f45beSAndroid Build Coastguard Worker
208*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) $(RUNQSLOWER_OUTPUT)
209*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower	       \
210*053f45beSAndroid Build Coastguard Worker		    OUTPUT=$(RUNQSLOWER_OUTPUT) VMLINUX_BTF=$(VMLINUX_BTF)     \
211*053f45beSAndroid Build Coastguard Worker		    BPFTOOL_OUTPUT=$(HOST_BUILD_DIR)/bpftool/		       \
212*053f45beSAndroid Build Coastguard Worker		    BPFOBJ_OUTPUT=$(BUILD_DIR)/libbpf			       \
213*053f45beSAndroid Build Coastguard Worker		    BPFOBJ=$(BPFOBJ) BPF_INCLUDE=$(INCLUDE_DIR) &&	       \
214*053f45beSAndroid Build Coastguard Worker		    cp $(RUNQSLOWER_OUTPUT)runqslower $@
215*053f45beSAndroid Build Coastguard Worker
216*053f45beSAndroid Build Coastguard WorkerTEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPFTOOL)
217*053f45beSAndroid Build Coastguard Worker
218*053f45beSAndroid Build Coastguard Worker$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ)
219*053f45beSAndroid Build Coastguard Worker
220*053f45beSAndroid Build Coastguard WorkerCGROUP_HELPERS	:= $(OUTPUT)/cgroup_helpers.o
221*053f45beSAndroid Build Coastguard WorkerTESTING_HELPERS	:= $(OUTPUT)/testing_helpers.o
222*053f45beSAndroid Build Coastguard WorkerTRACE_HELPERS	:= $(OUTPUT)/trace_helpers.o
223*053f45beSAndroid Build Coastguard WorkerCAP_HELPERS	:= $(OUTPUT)/cap_helpers.o
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_dev_cgroup: $(CGROUP_HELPERS) $(TESTING_HELPERS)
226*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_skb_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS)
227*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_sock: $(CGROUP_HELPERS) $(TESTING_HELPERS)
228*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_sock_addr: $(CGROUP_HELPERS) $(TESTING_HELPERS)
229*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_sockmap: $(CGROUP_HELPERS) $(TESTING_HELPERS)
230*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_tcpnotify_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) $(TRACE_HELPERS)
231*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/get_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS)
232*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_cgroup_storage: $(CGROUP_HELPERS) $(TESTING_HELPERS)
233*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_sock_fields: $(CGROUP_HELPERS) $(TESTING_HELPERS)
234*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_sysctl: $(CGROUP_HELPERS) $(TESTING_HELPERS)
235*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_tag: $(TESTING_HELPERS)
236*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_lirc_mode2_user: $(TESTING_HELPERS)
237*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/xdping: $(TESTING_HELPERS)
238*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/flow_dissector_load: $(TESTING_HELPERS)
239*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_maps: $(TESTING_HELPERS)
240*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS)
241*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/xsk.o: $(BPFOBJ)
242*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/xskxceiver: $(OUTPUT)/xsk.o
243*053f45beSAndroid Build Coastguard Worker
244*053f45beSAndroid Build Coastguard WorkerBPFTOOL ?= $(DEFAULT_BPFTOOL)
245*053f45beSAndroid Build Coastguard Worker$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile)    \
246*053f45beSAndroid Build Coastguard Worker		    $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
247*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras)  -C $(BPFTOOLDIR)			       \
248*053f45beSAndroid Build Coastguard Worker		    ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) 	       \
249*053f45beSAndroid Build Coastguard Worker		    EXTRA_CFLAGS='-g -O0'				       \
250*053f45beSAndroid Build Coastguard Worker		    OUTPUT=$(HOST_BUILD_DIR)/bpftool/			       \
251*053f45beSAndroid Build Coastguard Worker		    LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/		       \
252*053f45beSAndroid Build Coastguard Worker		    LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/			       \
253*053f45beSAndroid Build Coastguard Worker		    prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin
254*053f45beSAndroid Build Coastguard Worker
255*053f45beSAndroid Build Coastguard Workerall: docs
256*053f45beSAndroid Build Coastguard Worker
257*053f45beSAndroid Build Coastguard Workerdocs:
258*053f45beSAndroid Build Coastguard Worker	$(Q)RST2MAN_OPTS="--exit-status=1" $(MAKE) $(submake_extras)	\
259*053f45beSAndroid Build Coastguard Worker	            -f Makefile.docs					\
260*053f45beSAndroid Build Coastguard Worker	            prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@
261*053f45beSAndroid Build Coastguard Worker
262*053f45beSAndroid Build Coastguard Workerdocs-clean:
263*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras)					\
264*053f45beSAndroid Build Coastguard Worker	            -f Makefile.docs					\
265*053f45beSAndroid Build Coastguard Worker	            prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@
266*053f45beSAndroid Build Coastguard Worker
267*053f45beSAndroid Build Coastguard Worker$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)		       \
268*053f45beSAndroid Build Coastguard Worker	   $(APIDIR)/linux/bpf.h					       \
269*053f45beSAndroid Build Coastguard Worker	   | $(BUILD_DIR)/libbpf
270*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \
271*053f45beSAndroid Build Coastguard Worker		    EXTRA_CFLAGS='-g -O0'				       \
272*053f45beSAndroid Build Coastguard Worker		    DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
273*053f45beSAndroid Build Coastguard Worker
274*053f45beSAndroid Build Coastguard Workerifneq ($(BPFOBJ),$(HOST_BPFOBJ))
275*053f45beSAndroid Build Coastguard Worker$(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)		       \
276*053f45beSAndroid Build Coastguard Worker		$(APIDIR)/linux/bpf.h					       \
277*053f45beSAndroid Build Coastguard Worker		| $(HOST_BUILD_DIR)/libbpf
278*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR)                             \
279*053f45beSAndroid Build Coastguard Worker		    EXTRA_CFLAGS='-g -O0' ARCH= CROSS_COMPILE=		       \
280*053f45beSAndroid Build Coastguard Worker		    OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \
281*053f45beSAndroid Build Coastguard Worker		    DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers
282*053f45beSAndroid Build Coastguard Workerendif
283*053f45beSAndroid Build Coastguard Worker
284*053f45beSAndroid Build Coastguard Worker$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
285*053f45beSAndroid Build Coastguard Workerifeq ($(VMLINUX_H),)
286*053f45beSAndroid Build Coastguard Worker	$(call msg,GEN,,$@)
287*053f45beSAndroid Build Coastguard Worker	$(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
288*053f45beSAndroid Build Coastguard Workerelse
289*053f45beSAndroid Build Coastguard Worker	$(call msg,CP,,$@)
290*053f45beSAndroid Build Coastguard Worker	$(Q)cp "$(VMLINUX_H)" $@
291*053f45beSAndroid Build Coastguard Workerendif
292*053f45beSAndroid Build Coastguard Worker
293*053f45beSAndroid Build Coastguard Worker$(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids	\
294*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/bpf/resolve_btfids/main.c	\
295*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/lib/rbtree.c			\
296*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/lib/zalloc.c			\
297*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/lib/string.c			\
298*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/lib/ctype.c			\
299*053f45beSAndroid Build Coastguard Worker		       $(TOOLSDIR)/lib/str_error_r.c
300*053f45beSAndroid Build Coastguard Worker	$(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids	\
301*053f45beSAndroid Build Coastguard Worker		CC=$(HOSTCC) LD=$(HOSTLD) AR=$(HOSTAR) \
302*053f45beSAndroid Build Coastguard Worker		LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \
303*053f45beSAndroid Build Coastguard Worker		OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ)
304*053f45beSAndroid Build Coastguard Worker
305*053f45beSAndroid Build Coastguard Worker# Get Clang's default includes on this system, as opposed to those seen by
306*053f45beSAndroid Build Coastguard Worker# '-target bpf'. This fixes "missing" files on some architectures/distros,
307*053f45beSAndroid Build Coastguard Worker# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
308*053f45beSAndroid Build Coastguard Worker#
309*053f45beSAndroid Build Coastguard Worker# Use '-idirafter': Don't interfere with include mechanics except where the
310*053f45beSAndroid Build Coastguard Worker# build would have failed anyways.
311*053f45beSAndroid Build Coastguard Workerdefine get_sys_includes
312*053f45beSAndroid Build Coastguard Worker$(shell $(1) -v -E - </dev/null 2>&1 \
313*053f45beSAndroid Build Coastguard Worker	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
314*053f45beSAndroid Build Coastguard Worker$(shell $(1) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
315*053f45beSAndroid Build Coastguard Workerendef
316*053f45beSAndroid Build Coastguard Worker
317*053f45beSAndroid Build Coastguard Worker# Determine target endianness.
318*053f45beSAndroid Build Coastguard WorkerIS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
319*053f45beSAndroid Build Coastguard Worker			grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
320*053f45beSAndroid Build Coastguard WorkerMENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
321*053f45beSAndroid Build Coastguard Worker
322*053f45beSAndroid Build Coastguard WorkerCLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
323*053f45beSAndroid Build Coastguard WorkerBPF_CFLAGS = -g -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) 		\
324*053f45beSAndroid Build Coastguard Worker	     -I$(INCLUDE_DIR) -I$(CURDIR) -I$(APIDIR)			\
325*053f45beSAndroid Build Coastguard Worker	     -I$(abspath $(OUTPUT)/../usr/include)
326*053f45beSAndroid Build Coastguard Worker
327*053f45beSAndroid Build Coastguard WorkerCLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
328*053f45beSAndroid Build Coastguard Worker	       -Wno-compare-distinct-pointer-types
329*053f45beSAndroid Build Coastguard Worker
330*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline
331*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline
332*053f45beSAndroid Build Coastguard Worker
333*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h
334*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/cgroup_getset_retval_hooks.o: cgroup_getset_retval_hooks.h
335*053f45beSAndroid Build Coastguard Worker
336*053f45beSAndroid Build Coastguard Worker# Build BPF object using Clang
337*053f45beSAndroid Build Coastguard Worker# $1 - input .c file
338*053f45beSAndroid Build Coastguard Worker# $2 - output .o file
339*053f45beSAndroid Build Coastguard Worker# $3 - CFLAGS
340*053f45beSAndroid Build Coastguard Workerdefine CLANG_BPF_BUILD_RULE
341*053f45beSAndroid Build Coastguard Worker	$(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2)
342*053f45beSAndroid Build Coastguard Worker	$(Q)$(CLANG) $3 -O2 -target bpf -c $1 -mcpu=v3 -o $2
343*053f45beSAndroid Build Coastguard Workerendef
344*053f45beSAndroid Build Coastguard Worker# Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32
345*053f45beSAndroid Build Coastguard Workerdefine CLANG_NOALU32_BPF_BUILD_RULE
346*053f45beSAndroid Build Coastguard Worker	$(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2)
347*053f45beSAndroid Build Coastguard Worker	$(Q)$(CLANG) $3 -O2 -target bpf -c $1 -mcpu=v2 -o $2
348*053f45beSAndroid Build Coastguard Workerendef
349*053f45beSAndroid Build Coastguard Worker# Build BPF object using GCC
350*053f45beSAndroid Build Coastguard Workerdefine GCC_BPF_BUILD_RULE
351*053f45beSAndroid Build Coastguard Worker	$(call msg,GCC-BPF,$(TRUNNER_BINARY),$2)
352*053f45beSAndroid Build Coastguard Worker	$(Q)$(BPF_GCC) $3 -O2 -c $1 -o $2
353*053f45beSAndroid Build Coastguard Workerendef
354*053f45beSAndroid Build Coastguard Worker
355*053f45beSAndroid Build Coastguard WorkerSKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c
356*053f45beSAndroid Build Coastguard Worker
357*053f45beSAndroid Build Coastguard WorkerLINKED_SKELS := test_static_linked.skel.h linked_funcs.skel.h		\
358*053f45beSAndroid Build Coastguard Worker		linked_vars.skel.h linked_maps.skel.h 			\
359*053f45beSAndroid Build Coastguard Worker		test_subskeleton.skel.h test_subskeleton_lib.skel.h	\
360*053f45beSAndroid Build Coastguard Worker		test_usdt.skel.h
361*053f45beSAndroid Build Coastguard Worker
362*053f45beSAndroid Build Coastguard WorkerLSKELS := fentry_test.c fexit_test.c fexit_sleep.c \
363*053f45beSAndroid Build Coastguard Worker	test_ringbuf.c atomics.c trace_printk.c trace_vprintk.c \
364*053f45beSAndroid Build Coastguard Worker	map_ptr_kern.c core_kern.c core_kern_overflow.c
365*053f45beSAndroid Build Coastguard Worker# Generate both light skeleton and libbpf skeleton for these
366*053f45beSAndroid Build Coastguard WorkerLSKELS_EXTRA := test_ksyms_module.c test_ksyms_weak.c kfunc_call_test.c \
367*053f45beSAndroid Build Coastguard Worker	kfunc_call_test_subprog.c
368*053f45beSAndroid Build Coastguard WorkerSKEL_BLACKLIST += $$(LSKELS)
369*053f45beSAndroid Build Coastguard Worker
370*053f45beSAndroid Build Coastguard Workertest_static_linked.skel.h-deps := test_static_linked1.bpf.o test_static_linked2.bpf.o
371*053f45beSAndroid Build Coastguard Workerlinked_funcs.skel.h-deps := linked_funcs1.bpf.o linked_funcs2.bpf.o
372*053f45beSAndroid Build Coastguard Workerlinked_vars.skel.h-deps := linked_vars1.bpf.o linked_vars2.bpf.o
373*053f45beSAndroid Build Coastguard Workerlinked_maps.skel.h-deps := linked_maps1.bpf.o linked_maps2.bpf.o
374*053f45beSAndroid Build Coastguard Worker# In the subskeleton case, we want the test_subskeleton_lib.subskel.h file
375*053f45beSAndroid Build Coastguard Worker# but that's created as a side-effect of the skel.h generation.
376*053f45beSAndroid Build Coastguard Workertest_subskeleton.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o test_subskeleton.bpf.o
377*053f45beSAndroid Build Coastguard Workertest_subskeleton_lib.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o
378*053f45beSAndroid Build Coastguard Workertest_usdt.skel.h-deps := test_usdt.bpf.o test_usdt_multispec.bpf.o
379*053f45beSAndroid Build Coastguard Worker
380*053f45beSAndroid Build Coastguard WorkerLINKED_BPF_SRCS := $(patsubst %.bpf.o,%.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
381*053f45beSAndroid Build Coastguard Worker
382*053f45beSAndroid Build Coastguard Worker# Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on
383*053f45beSAndroid Build Coastguard Worker# $eval()) and pass control to DEFINE_TEST_RUNNER_RULES.
384*053f45beSAndroid Build Coastguard Worker# Parameters:
385*053f45beSAndroid Build Coastguard Worker# $1 - test runner base binary name (e.g., test_progs)
386*053f45beSAndroid Build Coastguard Worker# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
387*053f45beSAndroid Build Coastguard Workerdefine DEFINE_TEST_RUNNER
388*053f45beSAndroid Build Coastguard Worker
389*053f45beSAndroid Build Coastguard WorkerTRUNNER_OUTPUT := $(OUTPUT)$(if $2,/)$2
390*053f45beSAndroid Build Coastguard WorkerTRUNNER_BINARY := $1$(if $2,-)$2
391*053f45beSAndroid Build Coastguard WorkerTRUNNER_TEST_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.test.o,	\
392*053f45beSAndroid Build Coastguard Worker				 $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c)))
393*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o,		\
394*053f45beSAndroid Build Coastguard Worker				 $$(filter %.c,$(TRUNNER_EXTRA_SOURCES)))
395*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES))
396*053f45beSAndroid Build Coastguard WorkerTRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h
397*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c))
398*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.bpf.o, $$(TRUNNER_BPF_SRCS))
399*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h,	\
400*053f45beSAndroid Build Coastguard Worker				 $$(filter-out $(SKEL_BLACKLIST) $(LINKED_BPF_SRCS),\
401*053f45beSAndroid Build Coastguard Worker					       $$(TRUNNER_BPF_SRCS)))
402*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_LSKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.lskel.h, $$(LSKELS) $$(LSKELS_EXTRA))
403*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_SKELS_LINKED := $$(addprefix $$(TRUNNER_OUTPUT)/,$(LINKED_SKELS))
404*053f45beSAndroid Build Coastguard WorkerTEST_GEN_FILES += $$(TRUNNER_BPF_OBJS)
405*053f45beSAndroid Build Coastguard Worker
406*053f45beSAndroid Build Coastguard Worker# Evaluate rules now with extra TRUNNER_XXX variables above already defined
407*053f45beSAndroid Build Coastguard Worker$$(eval $$(call DEFINE_TEST_RUNNER_RULES,$1,$2))
408*053f45beSAndroid Build Coastguard Worker
409*053f45beSAndroid Build Coastguard Workerendef
410*053f45beSAndroid Build Coastguard Worker
411*053f45beSAndroid Build Coastguard Worker# Using TRUNNER_XXX variables, provided by callers of DEFINE_TEST_RUNNER and
412*053f45beSAndroid Build Coastguard Worker# set up by DEFINE_TEST_RUNNER itself, create test runner build rules with:
413*053f45beSAndroid Build Coastguard Worker# $1 - test runner base binary name (e.g., test_progs)
414*053f45beSAndroid Build Coastguard Worker# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
415*053f45beSAndroid Build Coastguard Workerdefine DEFINE_TEST_RUNNER_RULES
416*053f45beSAndroid Build Coastguard Worker
417*053f45beSAndroid Build Coastguard Workerifeq ($($(TRUNNER_OUTPUT)-dir),)
418*053f45beSAndroid Build Coastguard Worker$(TRUNNER_OUTPUT)-dir := y
419*053f45beSAndroid Build Coastguard Worker$(TRUNNER_OUTPUT):
420*053f45beSAndroid Build Coastguard Worker	$$(call msg,MKDIR,,$$@)
421*053f45beSAndroid Build Coastguard Worker	$(Q)mkdir -p $$@
422*053f45beSAndroid Build Coastguard Workerendif
423*053f45beSAndroid Build Coastguard Worker
424*053f45beSAndroid Build Coastguard Worker# ensure we set up BPF objects generation rule just once for a given
425*053f45beSAndroid Build Coastguard Worker# input/output directory combination
426*053f45beSAndroid Build Coastguard Workerifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),)
427*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y
428*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.bpf.o:				\
429*053f45beSAndroid Build Coastguard Worker		     $(TRUNNER_BPF_PROGS_DIR)/%.c			\
430*053f45beSAndroid Build Coastguard Worker		     $(TRUNNER_BPF_PROGS_DIR)/*.h			\
431*053f45beSAndroid Build Coastguard Worker		     $$(INCLUDE_DIR)/vmlinux.h				\
432*053f45beSAndroid Build Coastguard Worker		     $(wildcard $(BPFDIR)/bpf_*.h)			\
433*053f45beSAndroid Build Coastguard Worker		     $(wildcard $(BPFDIR)/*.bpf.h)			\
434*053f45beSAndroid Build Coastguard Worker		     | $(TRUNNER_OUTPUT) $$(BPFOBJ)
435*053f45beSAndroid Build Coastguard Worker	$$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@,			\
436*053f45beSAndroid Build Coastguard Worker					  $(TRUNNER_BPF_CFLAGS))
437*053f45beSAndroid Build Coastguard Worker
438*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
439*053f45beSAndroid Build Coastguard Worker	$$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
440*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.linked1.o) $$<
441*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.linked2.o) $$(<:.o=.linked1.o)
442*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.linked3.o) $$(<:.o=.linked2.o)
443*053f45beSAndroid Build Coastguard Worker	$(Q)diff $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
444*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$@
445*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$(@:.skel.h=.subskel.h)
446*053f45beSAndroid Build Coastguard Worker
447*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BPF_LSKELS): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
448*053f45beSAndroid Build Coastguard Worker	$$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
449*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$<
450*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o)
451*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o)
452*053f45beSAndroid Build Coastguard Worker	$(Q)diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
453*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@
454*053f45beSAndroid Build Coastguard Worker
455*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BPF_SKELS_LINKED): $(TRUNNER_BPF_OBJS) $(BPFTOOL) | $(TRUNNER_OUTPUT)
456*053f45beSAndroid Build Coastguard Worker	$$(call msg,LINK-BPF,$(TRUNNER_BINARY),$$(@:.skel.h=.bpf.o))
457*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked1.o) $$(addprefix $(TRUNNER_OUTPUT)/,$$($$(@F)-deps))
458*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked1.o)
459*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen object $$(@:.skel.h=.linked3.o) $$(@:.skel.h=.linked2.o)
460*053f45beSAndroid Build Coastguard Worker	$(Q)diff $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked3.o)
461*053f45beSAndroid Build Coastguard Worker	$$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
462*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen skeleton $$(@:.skel.h=.linked3.o) name $$(notdir $$(@:.skel.h=)) > $$@
463*053f45beSAndroid Build Coastguard Worker	$(Q)$$(BPFTOOL) gen subskeleton $$(@:.skel.h=.linked3.o) name $$(notdir $$(@:.skel.h=)) > $$(@:.skel.h=.subskel.h)
464*053f45beSAndroid Build Coastguard Workerendif
465*053f45beSAndroid Build Coastguard Worker
466*053f45beSAndroid Build Coastguard Worker# ensure we set up tests.h header generation rule just once
467*053f45beSAndroid Build Coastguard Workerifeq ($($(TRUNNER_TESTS_DIR)-tests-hdr),)
468*053f45beSAndroid Build Coastguard Worker$(TRUNNER_TESTS_DIR)-tests-hdr := y
469*053f45beSAndroid Build Coastguard Worker$(TRUNNER_TESTS_HDR): $(TRUNNER_TESTS_DIR)/*.c
470*053f45beSAndroid Build Coastguard Worker	$$(call msg,TEST-HDR,$(TRUNNER_BINARY),$$@)
471*053f45beSAndroid Build Coastguard Worker	$$(shell (echo '/* Generated header, do not edit */';					\
472*053f45beSAndroid Build Coastguard Worker		  sed -n -E 's/^void (serial_)?test_([a-zA-Z0-9_]+)\((void)?\).*/DEFINE_TEST(\2)/p'	\
473*053f45beSAndroid Build Coastguard Worker			$(TRUNNER_TESTS_DIR)/*.c | sort ;	\
474*053f45beSAndroid Build Coastguard Worker		 ) > $$@)
475*053f45beSAndroid Build Coastguard Workerendif
476*053f45beSAndroid Build Coastguard Worker
477*053f45beSAndroid Build Coastguard Worker# compile individual test files
478*053f45beSAndroid Build Coastguard Worker# Note: we cd into output directory to ensure embedded BPF object is found
479*053f45beSAndroid Build Coastguard Worker$(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o:			\
480*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_TESTS_DIR)/%.c				\
481*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_EXTRA_HDRS)				\
482*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_BPF_OBJS)				\
483*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_BPF_SKELS)				\
484*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_BPF_LSKELS)				\
485*053f45beSAndroid Build Coastguard Worker		      $(TRUNNER_BPF_SKELS_LINKED)			\
486*053f45beSAndroid Build Coastguard Worker		      $$(BPFOBJ) | $(TRUNNER_OUTPUT)
487*053f45beSAndroid Build Coastguard Worker	$$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@)
488*053f45beSAndroid Build Coastguard Worker	$(Q)cd $$(@D) && $$(CC) -I. $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)
489*053f45beSAndroid Build Coastguard Worker
490*053f45beSAndroid Build Coastguard Worker$(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o:				\
491*053f45beSAndroid Build Coastguard Worker		       %.c						\
492*053f45beSAndroid Build Coastguard Worker		       $(TRUNNER_EXTRA_HDRS)				\
493*053f45beSAndroid Build Coastguard Worker		       $(TRUNNER_TESTS_HDR)				\
494*053f45beSAndroid Build Coastguard Worker		       $$(BPFOBJ) | $(TRUNNER_OUTPUT)
495*053f45beSAndroid Build Coastguard Worker	$$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@)
496*053f45beSAndroid Build Coastguard Worker	$(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
497*053f45beSAndroid Build Coastguard Worker
498*053f45beSAndroid Build Coastguard Worker# non-flavored in-srctree builds receive special treatment, in particular, we
499*053f45beSAndroid Build Coastguard Worker# do not need to copy extra resources (see e.g. test_btf_dump_case())
500*053f45beSAndroid Build Coastguard Worker$(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT)
501*053f45beSAndroid Build Coastguard Workerifneq ($2:$(OUTPUT),:$(shell pwd))
502*053f45beSAndroid Build Coastguard Worker	$$(call msg,EXT-COPY,$(TRUNNER_BINARY),$(TRUNNER_EXTRA_FILES))
503*053f45beSAndroid Build Coastguard Worker	$(Q)rsync -aq $$^ $(TRUNNER_OUTPUT)/
504*053f45beSAndroid Build Coastguard Workerendif
505*053f45beSAndroid Build Coastguard Worker
506*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS)			\
507*053f45beSAndroid Build Coastguard Worker			     $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ)		\
508*053f45beSAndroid Build Coastguard Worker			     $(RESOLVE_BTFIDS)				\
509*053f45beSAndroid Build Coastguard Worker			     | $(TRUNNER_BINARY)-extras
510*053f45beSAndroid Build Coastguard Worker	$$(call msg,BINARY,,$$@)
511*053f45beSAndroid Build Coastguard Worker	$(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@
512*053f45beSAndroid Build Coastguard Worker	$(Q)$(RESOLVE_BTFIDS) --btf $(TRUNNER_OUTPUT)/btf_data.bpf.o $$@
513*053f45beSAndroid Build Coastguard Worker	$(Q)ln -sf $(if $2,..,.)/tools/build/bpftool/bootstrap/bpftool $(if $2,$2/)bpftool
514*053f45beSAndroid Build Coastguard Worker
515*053f45beSAndroid Build Coastguard Workerendef
516*053f45beSAndroid Build Coastguard Worker
517*053f45beSAndroid Build Coastguard Worker# Define test_progs test runner.
518*053f45beSAndroid Build Coastguard WorkerTRUNNER_TESTS_DIR := prog_tests
519*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_PROGS_DIR := progs
520*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c	\
521*053f45beSAndroid Build Coastguard Worker			 network_helpers.c testing_helpers.c		\
522*053f45beSAndroid Build Coastguard Worker			 btf_helpers.c flow_dissector_load.h		\
523*053f45beSAndroid Build Coastguard Worker			 cap_helpers.c
524*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko	\
525*053f45beSAndroid Build Coastguard Worker		       $(OUTPUT)/liburandom_read.so			\
526*053f45beSAndroid Build Coastguard Worker		       $(OUTPUT)/xdp_synproxy				\
527*053f45beSAndroid Build Coastguard Worker		       $(OUTPUT)/sign-file				\
528*053f45beSAndroid Build Coastguard Worker		       ima_setup.sh verify_sig_setup.sh			\
529*053f45beSAndroid Build Coastguard Worker		       $(wildcard progs/btf_dump_test_case_*.c)
530*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
531*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) -DENABLE_ATOMICS_TESTS
532*053f45beSAndroid Build Coastguard Worker$(eval $(call DEFINE_TEST_RUNNER,test_progs))
533*053f45beSAndroid Build Coastguard Worker
534*053f45beSAndroid Build Coastguard Worker# Define test_progs-no_alu32 test runner.
535*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_BUILD_RULE := CLANG_NOALU32_BPF_BUILD_RULE
536*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS)
537*053f45beSAndroid Build Coastguard Worker$(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32))
538*053f45beSAndroid Build Coastguard Worker
539*053f45beSAndroid Build Coastguard Worker# Define test_progs BPF-GCC-flavored test runner.
540*053f45beSAndroid Build Coastguard Workerifneq ($(BPF_GCC),)
541*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE
542*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc)
543*053f45beSAndroid Build Coastguard Worker$(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc))
544*053f45beSAndroid Build Coastguard Workerendif
545*053f45beSAndroid Build Coastguard Worker
546*053f45beSAndroid Build Coastguard Worker# Define test_maps test runner.
547*053f45beSAndroid Build Coastguard WorkerTRUNNER_TESTS_DIR := map_tests
548*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_PROGS_DIR := progs
549*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_SOURCES := test_maps.c
550*053f45beSAndroid Build Coastguard WorkerTRUNNER_EXTRA_FILES :=
551*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built)
552*053f45beSAndroid Build Coastguard WorkerTRUNNER_BPF_CFLAGS :=
553*053f45beSAndroid Build Coastguard Worker$(eval $(call DEFINE_TEST_RUNNER,test_maps))
554*053f45beSAndroid Build Coastguard Worker
555*053f45beSAndroid Build Coastguard Worker# Define test_verifier test runner.
556*053f45beSAndroid Build Coastguard Worker# It is much simpler than test_maps/test_progs and sufficiently different from
557*053f45beSAndroid Build Coastguard Worker# them (e.g., test.h is using completely pattern), that it's worth just
558*053f45beSAndroid Build Coastguard Worker# explicitly defining all the rules explicitly.
559*053f45beSAndroid Build Coastguard Workerverifier/tests.h: verifier/*.c
560*053f45beSAndroid Build Coastguard Worker	$(shell ( cd verifier/; \
561*053f45beSAndroid Build Coastguard Worker		  echo '/* Generated header, do not edit */'; \
562*053f45beSAndroid Build Coastguard Worker		  echo '#ifdef FILL_ARRAY'; \
563*053f45beSAndroid Build Coastguard Worker		  ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \
564*053f45beSAndroid Build Coastguard Worker		  echo '#endif' \
565*053f45beSAndroid Build Coastguard Worker		) > verifier/tests.h)
566*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
567*053f45beSAndroid Build Coastguard Worker	$(call msg,BINARY,,$@)
568*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
569*053f45beSAndroid Build Coastguard Worker
570*053f45beSAndroid Build Coastguard Worker# Make sure we are able to include and link libbpf against c++.
571*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ)
572*053f45beSAndroid Build Coastguard Worker	$(call msg,CXX,,$@)
573*053f45beSAndroid Build Coastguard Worker	$(Q)$(CXX) $(CFLAGS) $(filter %.a %.o %.cpp,$^) $(LDLIBS) -o $@
574*053f45beSAndroid Build Coastguard Worker
575*053f45beSAndroid Build Coastguard Worker# Benchmark runner
576*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h $(BPFOBJ)
577*053f45beSAndroid Build Coastguard Worker	$(call msg,CC,,$@)
578*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(CFLAGS) -O2 -c $(filter %.c,$^) $(LDLIBS) -o $@
579*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h
580*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h
581*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \
582*053f45beSAndroid Build Coastguard Worker			    $(OUTPUT)/perfbuf_bench.skel.h
583*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_bloom_filter_map.o: $(OUTPUT)/bloom_filter_bench.skel.h
584*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_bpf_loop.o: $(OUTPUT)/bpf_loop_bench.skel.h
585*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_strncmp.o: $(OUTPUT)/strncmp_bench.skel.h
586*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_bpf_hashmap_full_update.o: $(OUTPUT)/bpf_hashmap_full_update_bench.skel.h
587*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_local_storage.o: $(OUTPUT)/local_storage_bench.skel.h
588*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench_local_storage_rcu_tasks_trace.o: $(OUTPUT)/local_storage_rcu_tasks_trace_bench.skel.h
589*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench.o: bench.h testing_helpers.h $(BPFOBJ)
590*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench: LDLIBS += -lm
591*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/bench: $(OUTPUT)/bench.o \
592*053f45beSAndroid Build Coastguard Worker		 $(TESTING_HELPERS) \
593*053f45beSAndroid Build Coastguard Worker		 $(TRACE_HELPERS) \
594*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_count.o \
595*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_rename.o \
596*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_trigger.o \
597*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_ringbufs.o \
598*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_bloom_filter_map.o \
599*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_bpf_loop.o \
600*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_strncmp.o \
601*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_bpf_hashmap_full_update.o \
602*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_local_storage.o \
603*053f45beSAndroid Build Coastguard Worker		 $(OUTPUT)/bench_local_storage_rcu_tasks_trace.o
604*053f45beSAndroid Build Coastguard Worker	$(call msg,BINARY,,$@)
605*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
606*053f45beSAndroid Build Coastguard Worker
607*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/veristat.o: $(BPFOBJ)
608*053f45beSAndroid Build Coastguard Worker$(OUTPUT)/veristat: $(OUTPUT)/veristat.o
609*053f45beSAndroid Build Coastguard Worker	$(call msg,BINARY,,$@)
610*053f45beSAndroid Build Coastguard Worker	$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
611*053f45beSAndroid Build Coastguard Worker
612*053f45beSAndroid Build Coastguard WorkerEXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) $(HOST_SCRATCH_DIR)	\
613*053f45beSAndroid Build Coastguard Worker	prog_tests/tests.h map_tests/tests.h verifier/tests.h		\
614*053f45beSAndroid Build Coastguard Worker	feature bpftool							\
615*053f45beSAndroid Build Coastguard Worker	$(addprefix $(OUTPUT)/,*.o *.skel.h *.lskel.h *.subskel.h	\
616*053f45beSAndroid Build Coastguard Worker			       no_alu32 bpf_gcc bpf_testmod.ko		\
617*053f45beSAndroid Build Coastguard Worker			       liburandom_read.so)
618*053f45beSAndroid Build Coastguard Worker
619*053f45beSAndroid Build Coastguard Worker.PHONY: docs docs-clean
620