Makefile 10.5 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
2
include ../../../../scripts/Kbuild.include
3
include ../../../scripts/Makefile.arch
4

5 6
CURDIR := $(abspath .)
LIBDIR := $(abspath ../../../lib)
7
BPFDIR := $(LIBDIR)/bpf
8 9 10
TOOLSDIR := $(abspath ../../../include)
APIDIR := $(TOOLSDIR)/uapi
GENDIR := $(abspath ../../../../include/generated)
11
GENHDR := $(GENDIR)/autoconf.h
12

13 14 15 16
ifneq ($(wildcard $(GENHDR)),)
  GENFLAGS := -DHAVE_GENHDR
endif

17 18 19
CLANG		?= clang
LLC		?= llc
LLVM_OBJCOPY	?= llvm-objcopy
20
BPF_GCC		?= $(shell command -v bpf-gcc;)
21 22 23
CFLAGS += -g -Wall -O2 $(GENFLAGS) -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR)	\
	  -I$(GENDIR) -I$(TOOLSDIR) -I$(CURDIR)				\
	  -Dbpf_prog_load=bpf_prog_test_load				\
24
	  -Dbpf_load_program=bpf_test_load_program
25
LDLIBS += -lcap -lelf -lrt -lpthread
26

27
# Order correspond to 'make run_tests' order
28
TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
29
	test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
30
	test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
31
	test_cgroup_storage test_select_reuseport \
32
	test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \
33
	test_cgroup_attach xdping test_progs-no_alu32
34

35
# Also test bpf-gcc, if present
36
ifneq ($(BPF_GCC),)
37
TEST_GEN_PROGS += test_progs-bpf_gcc
38 39
endif

40 41 42
TEST_GEN_FILES =
TEST_FILES =

43 44 45 46
# Order correspond to 'make run_tests' order
TEST_PROGS := test_kmod.sh \
	test_xdp_redirect.sh \
	test_xdp_meta.sh \
47
	test_xdp_veth.sh \
48
	test_offload.py \
W
William Tu 已提交
49
	test_sock_addr.sh \
50
	test_tunnel.sh \
51
	test_lwt_seg6local.sh \
52
	test_lirc_mode2.sh \
53
	test_skb_cgroup_id.sh \
54
	test_flow_dissector.sh \
55 56
	test_xdp_vlan_mode_generic.sh \
	test_xdp_vlan_mode_native.sh \
57
	test_lwt_ip_encap.sh \
58
	test_tcp_check_syncookie.sh \
59
	test_tc_tunnel.sh \
60
	test_tc_edt.sh \
61 62
	test_xdping.sh \
	test_bpftool_build.sh
63

64
TEST_PROGS_EXTENDED := with_addr.sh \
65
	with_tunnels.sh \
66
	tcp_client.py \
67 68
	tcp_server.py \
	test_xdp_vlan.sh
69

70
# Compile but not part of 'make run_tests'
71
TEST_GEN_PROGS_EXTENDED = test_sock_addr test_skb_cgroup_id_user \
72 73
	flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
	test_lirc_mode2_user
74

75 76
TEST_CUSTOM_PROGS = urandom_read

77 78
include ../lib.mk

79 80 81 82 83 84 85 86 87 88
# Define simple and short `make test_progs`, `make test_sysctl`, etc targets
# to build individual tests.
# NOTE: Semicolon at the end is critical to override lib.mk's default static
# rule for binaries.
$(notdir $(TEST_GEN_PROGS)						\
	 $(TEST_PROGS)							\
	 $(TEST_PROGS_EXTENDED)						\
	 $(TEST_GEN_PROGS_EXTENDED)					\
	 $(TEST_CUSTOM_PROGS)): %: $(OUTPUT)/% ;

89
$(OUTPUT)/urandom_read: urandom_read.c
90
	$(CC) -o $@ $< -Wl,--build-id
91

92 93 94
$(OUTPUT)/test_stub.o: test_stub.c
	$(CC) -c $(CFLAGS) -o $@ $<

95
BPFOBJ := $(OUTPUT)/libbpf.a
96

97
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ)
98

99
$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c
100
$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c
101
$(OUTPUT)/test_sock: cgroup_helpers.c
102
$(OUTPUT)/test_sock_addr: cgroup_helpers.c
103
$(OUTPUT)/test_socket_cookie: cgroup_helpers.c
J
John Fastabend 已提交
104
$(OUTPUT)/test_sockmap: cgroup_helpers.c
105
$(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c
106
$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
107
$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
108
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
109
$(OUTPUT)/test_netcnt: cgroup_helpers.c
110
$(OUTPUT)/test_sock_fields: cgroup_helpers.c
111
$(OUTPUT)/test_sysctl: cgroup_helpers.c
112
$(OUTPUT)/test_cgroup_attach: cgroup_helpers.c
113

114
.PHONY: force
115 116 117 118

# force a rebuild of BPFOBJ when its dependencies are updated
force:

119
$(BPFOBJ): force
120
	$(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/
121

122 123 124 125
BPF_HELPERS := $(BPFDIR)/bpf_helper_defs.h $(wildcard $(BPFDIR)/bpf_*.h)
$(BPFDIR)/bpf_helper_defs.h:
	$(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/ bpf_helper_defs.h

126 127 128 129 130 131
# Get Clang's default includes on this system, as opposed to those seen by
# '-target bpf'. This fixes "missing" files on some architectures/distros,
# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
#
# Use '-idirafter': Don't interfere with include mechanics except where the
# build would have failed anyways.
132 133
define get_sys_includes
$(shell $(1) -v -E - </dev/null 2>&1 \
134
	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
135
endef
136

137 138 139 140 141
# Determine target endianness.
IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
			grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)

142
CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
143
BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) 			\
144 145
	     -I. -I./include/uapi -I$(APIDIR)				\
	     -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include)
146

147 148
CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
	       -Wno-compare-distinct-pointer-types
149

150 151
$(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline
$(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline
152

153 154
$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
# Build BPF object using Clang
# $1 - input .c file
# $2 - output .o file
# $3 - CFLAGS
# $4 - LDFLAGS
define CLANG_BPF_BUILD_RULE
	($(CLANG) $3 -O2 -target bpf -emit-llvm				\
		-c $1 -o - || echo "BPF obj compilation failed") | 	\
	$(LLC) -march=bpf -mcpu=probe $4 -filetype=obj -o $2
endef
# Similar to CLANG_BPF_BUILD_RULE, but using native Clang and bpf LLC
define CLANG_NATIVE_BPF_BUILD_RULE
	($(CLANG) $3 -O2 -emit-llvm					\
		-c $1 -o - || echo "BPF obj compilation failed") | 	\
	$(LLC) -march=bpf -mcpu=probe $4 -filetype=obj -o $2
endef
# Build BPF object using GCC
define GCC_BPF_BUILD_RULE
	$(BPF_GCC) $3 $4 -O2 -c $1 -o $2
endef

# Set up extra TRUNNER_XXX "temporary" variables in the environment (relies on
# $eval()) and pass control to DEFINE_TEST_RUNNER_RULES.
# Parameters:
# $1 - test runner base binary name (e.g., test_progs)
180
# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
define DEFINE_TEST_RUNNER

TRUNNER_OUTPUT := $(OUTPUT)$(if $2,/)$2
TRUNNER_BINARY := $1$(if $2,-)$2
TRUNNER_TEST_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.test.o,	\
				 $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c)))
TRUNNER_EXTRA_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o,		\
				 $$(filter %.c,$(TRUNNER_EXTRA_SOURCES)))
TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES))
TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h
TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o,		\
				$$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c)))

# Evaluate rules now with extra TRUNNER_XXX variables above already defined
$$(eval $$(call DEFINE_TEST_RUNNER_RULES,$1,$2))

endef

# Using TRUNNER_XXX variables, provided by callers of DEFINE_TEST_RUNNER and
# set up by DEFINE_TEST_RUNNER itself, create test runner build rules with:
# $1 - test runner base binary name (e.g., test_progs)
202
# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
203
define DEFINE_TEST_RUNNER_RULES
204

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
ifeq ($($(TRUNNER_OUTPUT)-dir),)
$(TRUNNER_OUTPUT)-dir := y
$(TRUNNER_OUTPUT):
	mkdir -p $$@
endif

# ensure we set up BPF objects generation rule just once for a given
# input/output directory combination
ifeq ($($(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs),)
$(TRUNNER_BPF_PROGS_DIR)$(if $2,-)$2-bpfobjs := y
$(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.o:				\
		     $(TRUNNER_BPF_PROGS_DIR)/%.c			\
		     $(TRUNNER_BPF_PROGS_DIR)/*.h			\
		     $$(BPF_HELPERS) | $(TRUNNER_OUTPUT)
	$$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@,			\
					  $(TRUNNER_BPF_CFLAGS),	\
					  $(TRUNNER_BPF_LDFLAGS))
endif

# ensure we set up tests.h header generation rule just once
ifeq ($($(TRUNNER_TESTS_DIR)-tests-hdr),)
$(TRUNNER_TESTS_DIR)-tests-hdr := y
$(TRUNNER_TESTS_HDR): $(TRUNNER_TESTS_DIR)/*.c
	$$(shell ( cd $(TRUNNER_TESTS_DIR);				\
		  echo '/* Generated header, do not edit */';		\
		  ls *.c 2> /dev/null |					\
			sed -e 's@\([^\.]*\)\.c@DEFINE_TEST(\1)@';	\
		 ) > $$@)
endif

# compile individual test files
# Note: we cd into output directory to ensure embedded BPF object is found
$(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o:			\
		      $(TRUNNER_TESTS_DIR)/%.c				\
		      $(TRUNNER_EXTRA_HDRS)				\
		      $(TRUNNER_BPF_OBJS)				\
		      $$(BPFOBJ) | $(TRUNNER_OUTPUT)
A
Andrii Nakryiko 已提交
242
	cd $$(@D) && $$(CC) $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)
243 244 245 246 247 248

$(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o:				\
		       %.c						\
		       $(TRUNNER_EXTRA_HDRS)				\
		       $(TRUNNER_TESTS_HDR)				\
		       $$(BPFOBJ) | $(TRUNNER_OUTPUT)
A
Andrii Nakryiko 已提交
249
	$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
250 251 252 253 254 255 256 257 258 259

$(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT)
ifneq ($2,)
	# only copy extra resources if in flavored build
	cp -a $$^ $(TRUNNER_OUTPUT)/
endif

$(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS)			\
			     $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ)		\
			     | $(TRUNNER_BINARY)-extras
A
Andrii Nakryiko 已提交
260
	$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@
261 262 263 264 265 266 267 268 269 270 271 272

endef

# Define test_progs test runner.
TRUNNER_TESTS_DIR := prog_tests
TRUNNER_BPF_PROGS_DIR := progs
TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c	\
			 flow_dissector_load.h
TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read				\
		       $(wildcard progs/btf_dump_test_case_*.c)
TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
TRUNNER_BPF_CFLAGS := -I. -I$(OUTPUT) $(BPF_CFLAGS) $(CLANG_CFLAGS)
273
TRUNNER_BPF_LDFLAGS := -mattr=+alu32
274 275
$(eval $(call DEFINE_TEST_RUNNER,test_progs))

276 277 278
# Define test_progs-no_alu32 test runner.
TRUNNER_BPF_LDFLAGS :=
$(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32))
279

280
# Define test_progs BPF-GCC-flavored test runner.
281
ifneq ($(BPF_GCC),)
282
TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE
283
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc)
284 285
TRUNNER_BPF_LDFLAGS :=
$(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc))
286 287
endif

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
# Define test_maps test runner.
TRUNNER_TESTS_DIR := map_tests
TRUNNER_BPF_PROGS_DIR := progs
TRUNNER_EXTRA_SOURCES := test_maps.c
TRUNNER_EXTRA_FILES :=
TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built)
TRUNNER_BPF_CFLAGS :=
TRUNNER_BPF_LDFLAGS :=
$(eval $(call DEFINE_TEST_RUNNER,test_maps))

# Define test_verifier test runner.
# It is much simpler than test_maps/test_progs and sufficiently different from
# them (e.g., test.h is using completely pattern), that it's worth just
# explicitly defining all the rules explicitly.
verifier/tests.h: verifier/*.c
303
	$(shell ( cd verifier/; \
304 305
		  echo '/* Generated header, do not edit */'; \
		  echo '#ifdef FILL_ARRAY'; \
306
		  ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \
307
		  echo '#endif' \
308 309
		) > verifier/tests.h)
$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
A
Andrii Nakryiko 已提交
310
	$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
311

312 313
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS)					\
	prog_tests/tests.h map_tests/tests.h verifier/tests.h		\
314
	feature $(OUTPUT)/*.o $(OUTPUT)/no_alu32 $(OUTPUT)/bpf_gcc