Makefile 10.4 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
BPFOBJ := $(OUTPUT)/libbpf.a
93

94
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ)
95

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
J
John Fastabend 已提交
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)/get_cgroup_id_user: cgroup_helpers.c
105
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
106
$(OUTPUT)/test_netcnt: cgroup_helpers.c
107
$(OUTPUT)/test_sock_fields: cgroup_helpers.c
108
$(OUTPUT)/test_sysctl: cgroup_helpers.c
109
$(OUTPUT)/test_cgroup_attach: cgroup_helpers.c
110

111
.PHONY: force
112 113 114 115

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

116
$(BPFOBJ): force
117
	$(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/
118

119 120 121 122
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

123 124 125 126 127 128
# 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.
129 130
define get_sys_includes
$(shell $(1) -v -E - </dev/null 2>&1 \
131
	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
132
endef
133

134
CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
135
BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) 				\
136 137
	     -I. -I./include/uapi -I$(APIDIR)				\
	     -I$(BPFDIR) -I$(abspath $(OUTPUT)/../usr/include)
138

139 140
CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
	       -Wno-compare-distinct-pointer-types
141

142 143
$(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline
$(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline
144

145 146
$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
# 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)
172
# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
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)
194
# $2 - test runner extra "flavor" (e.g., no_alu32, gcc-bpf, etc)
195
define DEFINE_TEST_RUNNER_RULES
196

197 198 199 200 201 202 203 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
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 已提交
234
	cd $$(@D) && $$(CC) $$(CFLAGS) -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)
235 236 237 238 239 240

$(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o:				\
		       %.c						\
		       $(TRUNNER_EXTRA_HDRS)				\
		       $(TRUNNER_TESTS_HDR)				\
		       $$(BPFOBJ) | $(TRUNNER_OUTPUT)
A
Andrii Nakryiko 已提交
241
	$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
242 243 244 245 246 247 248 249 250 251

$(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 已提交
252
	$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) -o $$@
253 254 255 256 257 258 259 260 261 262 263 264

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)
265
TRUNNER_BPF_LDFLAGS := -mattr=+alu32
266 267
$(eval $(call DEFINE_TEST_RUNNER,test_progs))

268 269 270
# Define test_progs-no_alu32 test runner.
TRUNNER_BPF_LDFLAGS :=
$(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32))
271

272
# Define test_progs BPF-GCC-flavored test runner.
273 274 275
ifneq ($(BPF_GCC),)
IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
			grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
276 277 278 279 280 281
MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)

TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc) $(MENDIAN)
TRUNNER_BPF_LDFLAGS :=
$(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc))
282 283
endif

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
# 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
299
	$(shell ( cd verifier/; \
300 301
		  echo '/* Generated header, do not edit */'; \
		  echo '#ifdef FILL_ARRAY'; \
302
		  ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \
303
		  echo '#endif' \
304 305
		) > verifier/tests.h)
$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
A
Andrii Nakryiko 已提交
306
	$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
307

308 309
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS)					\
	prog_tests/tests.h map_tests/tests.h verifier/tests.h		\
310
	feature $(OUTPUT)/*.o $(OUTPUT)/no_alu32 $(OUTPUT)/bpf_gcc