1# SPDX-License-Identifier: GPL-2.0 2include ../../../build/Build.include 3include ../../../scripts/Makefile.arch 4include ../../../scripts/Makefile.include 5 6BPF_GCC ?= $(shell command -v bpf-gcc;) 7 8SKIP_DOCS ?= 9SKIP_LLVM ?= 10SKIP_LIBBFD ?= 11SKIP_CRYPTO ?= 12 13# Check whether bpf cpu=v4 is supported or not by clang 14ifneq ($(shell $(CLANG) --target=bpf -mcpu=help 2>&1 | grep 'v4'),) 15CLANG_CPUV4 := 1 16endif 17 18# Order correspond to 'make run_tests' order 19TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_progs \ 20 test_sockmap \ 21 test_tcpnotify_user \ 22 test_progs-no_alu32 23TEST_INST_SUBDIRS := no_alu32 24 25# Also test bpf-gcc, if present 26ifneq ($(BPF_GCC),) 27TEST_GEN_PROGS += test_progs-bpf_gcc 28TEST_INST_SUBDIRS += bpf_gcc 29endif 30 31ifneq ($(CLANG_CPUV4),) 32TEST_GEN_PROGS += test_progs-cpuv4 33TEST_INST_SUBDIRS += cpuv4 34endif 35 36TEST_FILES = xsk_prereqs.sh $(wildcard progs/btf_dump_test_case_*.c) \ 37 bpftool_btf_dump_sorted.expected \ 38 bpftool_btf_dump_unsorted.expected 39 40# Order correspond to 'make run_tests' order 41TEST_PROGS := test_bpftool_build.sh \ 42 test_doc_build.sh \ 43 test_xsk.sh \ 44 test_xdp_features.sh 45 46TEST_PROGS_EXTENDED := \ 47 ima_setup.sh verify_sig_setup.sh 48 49TEST_KMODS := bpf_testmod.ko bpf_test_no_cfi.ko bpf_test_modorder_x.ko \ 50 bpf_test_modorder_y.ko bpf_test_rqspinlock.ko 51TEST_KMOD_TARGETS = $(addprefix $(OUTPUT)/,$(TEST_KMODS)) 52 53# Compile but not part of 'make run_tests' 54TEST_GEN_PROGS_EXTENDED = \ 55 bench \ 56 flow_dissector_load \ 57 test_cpp \ 58 veristat \ 59 xdp_features \ 60 xdp_hw_metadata \ 61 xdp_synproxy \ 62 xskxceiver 63 64TEST_GEN_FILES += $(TEST_KMODS) liburandom_read.so urandom_read sign-file uprobe_multi 65 66ifneq ($(V),1) 67submake_extras := feature_display=0 68endif 69 70# override lib.mk's default rules 71OVERRIDE_TARGETS := 1 72override define CLEAN 73 $(call msg,CLEAN) 74 $(Q)$(RM) -r $(TEST_GEN_PROGS) 75 $(Q)$(RM) -r $(TEST_GEN_PROGS_EXTENDED) 76 $(Q)$(RM) -r $(TEST_GEN_FILES) 77 $(Q)$(RM) -r $(TEST_KMODS) 78 $(Q)$(RM) -r $(EXTRA_CLEAN) 79 $(Q)$(MAKE) -C test_kmods clean 80 $(Q)$(MAKE) -C libarena clean 81 $(Q)$(MAKE) docs-clean 82endef 83 84# Append build flags before lib.mk's user flags. References to 85# Makefile.buildvars definitions expand when the flags are used. 86# The arena-ASAN define is appended after lib.mk. 87CFLAGS += $(COMMON_CFLAGS) $(PCAP_CFLAGS) $(CLANG_WARN_CFLAGS) 88LDFLAGS += $(SAN_LDFLAGS) 89include ../lib.mk 90include Makefile.buildvars 91 92BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool 93HOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a 94BPF_TARGET_ENDIAN:=$(if $(IS_LITTLE_ENDIAN),--target=bpfel,--target=bpfeb) 95 96NON_CHECK_FEAT_TARGETS := clean docs-clean emit_tests 97CHECK_FEAT := $(filter-out $(NON_CHECK_FEAT_TARGETS),$(or $(MAKECMDGOALS), "none")) 98ifneq ($(CHECK_FEAT),) 99FEATURE_USER := .selftests 100FEATURE_TESTS := llvm 101FEATURE_DISPLAY := $(FEATURE_TESTS) 102 103# Makefile.feature expects OUTPUT to end with a slash 104ifeq ($(shell expr $(MAKE_VERSION) \>= 4.4), 1) 105$(let OUTPUT,$(OUTPUT)/,\ 106 $(eval include ../../../build/Makefile.feature)) 107else 108override OUTPUT := $(OUTPUT)/ 109$(eval include ../../../build/Makefile.feature) 110override OUTPUT := $(patsubst %/,%,$(OUTPUT)) 111endif 112endif 113 114ifneq ($(SKIP_LLVM),1) 115ifeq ($(feature-llvm),1) 116 LLVM_CFLAGS += -DHAVE_LLVM_SUPPORT 117 LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets 118 # both llvm-config and lib.mk add -D_GNU_SOURCE, which ends up as conflict 119 LLVM_CFLAGS += $(filter-out -D_GNU_SOURCE,$(shell $(LLVM_CONFIG) --cflags)) 120 # Cross compilation must use dynamic linking to avoid unresolved library 121 # dependencies. For native build, prefer linking statically if it's 122 # available, otherwise fallback to shared. 123 ifneq ($(ARCH), $(HOSTARCH)) 124 LLVM_LINK_STATIC := 125 else 126 LLVM_LINK_STATIC := $(shell $(LLVM_CONFIG) --link-static --libs >/dev/null 2>&1 && echo y) 127 endif 128 ifeq ($(LLVM_LINK_STATIC),y) 129 LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-static --libs $(LLVM_CONFIG_LIB_COMPONENTS)) 130 LLVM_LDLIBS += $(filter-out -lxml2,$(shell $(LLVM_CONFIG) --link-static --system-libs $(LLVM_CONFIG_LIB_COMPONENTS))) 131 LLVM_LDLIBS += -lstdc++ 132 else 133 LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-shared --libs $(LLVM_CONFIG_LIB_COMPONENTS)) 134 endif 135 LLVM_LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) 136endif 137endif 138 139# Some utility functions use LLVM libraries 140$(OUTPUT)/jit_disasm_helpers.o: CFLAGS += $(LLVM_CFLAGS) 141 142VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ 143 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 144 ../../../../vmlinux \ 145 /sys/kernel/btf/vmlinux \ 146 /boot/vmlinux-$(shell uname -r) 147VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) 148ifeq ($(VMLINUX_BTF),) 149$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)") 150endif 151 152# Define simple and short `make test_progs`, `make test_maps`, etc targets 153# to build individual tests. 154# NOTE: Semicolon at the end is critical to override lib.mk's default static 155# rule for binaries. 156$(notdir $(TEST_GEN_PROGS) $(TEST_KMODS) \ 157 $(TEST_GEN_PROGS_EXTENDED)): %: $(OUTPUT)/% ; 158 159# sort removes libbpf duplicates when not cross-building 160MAKE_DIRS := $(sort $(OUTPUT) $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \ 161 $(BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/bpftool \ 162 $(HOST_BUILD_DIR)/resolve_btfids \ 163 $(INCLUDE_DIR)) 164$(MAKE_DIRS): 165 $(call msg,MKDIR,,$@) 166 $(Q)mkdir -p $@ 167 168$(OUTPUT)/%.o: %.c 169 $(call msg,CC,,$@) 170 $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ 171 172# Keep header prerequisites off the link command: clang treats 173# bare headers as precompiled-header jobs and refuses -o. 174$(OUTPUT)/%:%.c 175 $(call msg,BINARY,,$@) 176 $(Q)$(LINK.c) $(filter-out %.h,$^) $(LDLIBS) -o $@ 177 178# LLVM's ld.lld doesn't support all the architectures, so use it only on x86 179ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 riscv)) 180LLD := lld 181else 182LLD := $(shell command -v $(LD)) 183endif 184 185# Filter out -static for liburandom_read.so and its dependent targets so that static builds 186# do not fail. Static builds leave urandom_read relying on system-wide shared libraries. 187$(OUTPUT)/liburandom_read.so: urandom_read_lib1.c urandom_read_lib2.c liburandom_read.map 188 $(call msg,LIB,,$@) 189 $(Q)$(CLANG) $(CLANG_TARGET_ARCH) \ 190 $(filter-out -static,$(COMMON_CFLAGS) $(LDFLAGS)) \ 191 $(filter %.c,$^) $(filter-out -static,$(LDLIBS)) \ 192 -Wno-unused-command-line-argument \ 193 -fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \ 194 -Wl,--version-script=liburandom_read.map \ 195 -fPIC -shared -o $@ 196 197$(OUTPUT)/urandom_read: urandom_read.c urandom_read_aux.c $(OUTPUT)/liburandom_read.so 198 $(call msg,BINARY,,$@) 199 $(Q)$(CLANG) $(CLANG_TARGET_ARCH) \ 200 $(filter-out -static,$(COMMON_CFLAGS) $(LDFLAGS)) $(filter %.c,$^) \ 201 -Wno-unused-command-line-argument \ 202 -lurandom_read $(filter-out -static,$(LDLIBS)) -L$(OUTPUT) \ 203 -fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \ 204 -Wl,-rpath=. -o $@ 205 206$(OUTPUT)/sign-file: ../../../../scripts/sign-file.c 207 $(call msg,SIGN-FILE,,$@) 208 $(Q)$(CC) $(shell $(PKG_CONFIG) --cflags libcrypto 2> /dev/null) \ 209 -I$(srctree)/tools/include/uapi/ \ 210 $< -o $@ \ 211 $(shell $(PKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto) 212 213# This should really be a grouped target, but make versions before 4.3 don't 214# support that for regular rules. However, pattern matching rules are implicitly 215# treated as grouped even with older versions of make, so as a workaround, the 216# subst() turns the rule into a pattern matching rule 217$(addprefix test_kmods/,$(subst .ko,%ko,$(TEST_KMODS))): $(VMLINUX_BTF) $(RESOLVE_BTFIDS) $(wildcard test_kmods/Makefile test_kmods/*.[ch]) 218 $(Q)$(RM) test_kmods/*.ko test_kmods/*.mod.o # force re-compilation 219 $(Q)$(MAKE) $(submake_extras) -C test_kmods \ 220 $(if $(O),O=$(abspath $(O))) \ 221 $(if $(KBUILD_OUTPUT),KBUILD_OUTPUT=$(abspath $(KBUILD_OUTPUT)))\ 222 RESOLVE_BTFIDS=$(RESOLVE_BTFIDS) \ 223 EXTRA_CFLAGS='' EXTRA_LDFLAGS='' 224 225$(TEST_KMOD_TARGETS): $(addprefix test_kmods/,$(TEST_KMODS)) 226 $(call msg,MOD,,$@) 227 $(Q)$(if $(PERMISSIVE),if [ -f test_kmods/$(@F) ]; then )cp test_kmods/$(@F) $@$(if $(PERMISSIVE),; fi) 228 229$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ) 230 231TESTING_HELPERS := $(OUTPUT)/testing_helpers.o 232CGROUP_HELPERS := $(OUTPUT)/cgroup_helpers.o 233UNPRIV_HELPERS := $(OUTPUT)/unpriv_helpers.o 234TRACE_HELPERS := $(OUTPUT)/trace_helpers.o 235JSON_WRITER := $(OUTPUT)/json_writer.o 236CAP_HELPERS := $(OUTPUT)/cap_helpers.o 237NETWORK_HELPERS := $(OUTPUT)/network_helpers.o 238 239$(OUTPUT)/test_sockmap: $(CGROUP_HELPERS) $(TESTING_HELPERS) 240$(OUTPUT)/test_tcpnotify_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) $(TRACE_HELPERS) 241$(OUTPUT)/test_sock_fields: $(CGROUP_HELPERS) $(TESTING_HELPERS) 242$(OUTPUT)/test_tag: $(TESTING_HELPERS) 243$(OUTPUT)/flow_dissector_load: $(TESTING_HELPERS) flow_dissector_load.h 244$(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS) $(UNPRIV_HELPERS) 245 246# Defined ahead of the first rule that lists it as a prerequisite. 247VERIFY_SIG_HDR := verification_cert.h 248 249# The userspace objects the runner instances link (RUNNER_OBJS, see 250# Makefile.buildvars) are built here, once, so that no runner sub-make 251# ever writes a file this Makefile also builds. 252# 253# Helper C files include headers installed to $(INCLUDE_DIR) by the 254# $(TRUNNER_BPFTOOL) and $(BPFOBJ) targets. 255RUNNER_OBJS := $(sort $(RUNNER_OBJS-test_progs) $(RUNNER_OBJS-test_maps)) 256$(RUNNER_OBJS): $(VERIFY_SIG_HDR) $(BPFOBJ) $(TRUNNER_BPFTOOL) 257$(OUTPUT)/test_progs.o: prog_tests/tests.h 258$(OUTPUT)/test_maps.o: map_tests/tests.h 259 260# find_bit.c is the only runner source outside this directory, so it 261# needs a rule of its own. 262$(OUTPUT)/find_bit.o: $(TOOLSDIR)/lib/find_bit.c 263 $(call msg,CC,,$@) 264 $(Q)$(CC) $(CFLAGS) -c $< $(LDLIBS) -o $@ 265 266$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ 267 $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool 268 $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ 269 ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" \ 270 EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \ 271 EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \ 272 OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \ 273 LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \ 274 LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/ \ 275 SKIP_LLVM=$(SKIP_LLVM) \ 276 SKIP_LIBBFD=$(SKIP_LIBBFD) \ 277 SKIP_CRYPTO=$(SKIP_CRYPTO) \ 278 prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin 279 280ifneq ($(CROSS_COMPILE),) 281$(CROSS_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ 282 $(BPFOBJ) | $(BUILD_DIR)/bpftool 283 $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ 284 ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) \ 285 EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \ 286 EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \ 287 OUTPUT=$(BUILD_DIR)/bpftool/ \ 288 LIBBPF_OUTPUT=$(BUILD_DIR)/libbpf/ \ 289 LIBBPF_DESTDIR=$(SCRATCH_DIR)/ \ 290 SKIP_LLVM=$(SKIP_LLVM) \ 291 SKIP_LIBBFD=$(SKIP_LIBBFD) \ 292 SKIP_CRYPTO=$(SKIP_CRYPTO) \ 293 prefix= DESTDIR=$(SCRATCH_DIR)/ install-bin 294endif 295 296ifneq ($(SKIP_DOCS),1) 297all: docs 298endif 299 300docs: 301 $(Q)RST2MAN_OPTS="--exit-status=1" $(MAKE) $(submake_extras) \ 302 -f Makefile.docs \ 303 prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@ 304 305docs-clean: 306 $(Q)$(MAKE) $(submake_extras) \ 307 -f Makefile.docs \ 308 prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@ 309 310$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ 311 $(APIDIR)/linux/bpf.h \ 312 | $(BUILD_DIR)/libbpf 313 $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \ 314 EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \ 315 EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \ 316 DESTDIR=$(SCRATCH_DIR) prefix= all install_headers 317 318ifneq ($(BPFOBJ),$(HOST_BPFOBJ)) 319$(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ 320 $(APIDIR)/linux/bpf.h \ 321 | $(HOST_BUILD_DIR)/libbpf 322 $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ 323 ARCH= CROSS_COMPILE= \ 324 EXTRA_CFLAGS='-g $(OPT_FLAGS) $(EXTRA_CFLAGS)' \ 325 EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' \ 326 OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \ 327 CC="$(HOSTCC)" LD="$(HOSTLD)" \ 328 DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers 329endif 330 331# vmlinux.h is first dumped to a temporary file and then compared to 332# the previous version. This helps to avoid unnecessary re-builds of 333# BPF objects. 334$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR) 335ifeq ($(VMLINUX_H),) 336 $(call msg,GEN,,$@) 337 $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $(INCLUDE_DIR)/.vmlinux.h.tmp 338 $(Q)cmp -s $(INCLUDE_DIR)/.vmlinux.h.tmp $@ || mv $(INCLUDE_DIR)/.vmlinux.h.tmp $@ 339else 340 $(call msg,CP,,$@) 341 $(Q)cp "$(VMLINUX_H)" $@ 342endif 343 344$(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids \ 345 $(TOOLSDIR)/bpf/resolve_btfids/main.c \ 346 $(TOOLSDIR)/bpf/resolve_btfids/btf_colors.c \ 347 $(TOOLSDIR)/bpf/resolve_btfids/btf_colors.h \ 348 $(TOOLSDIR)/lib/rbtree.c \ 349 $(TOOLSDIR)/lib/zalloc.c \ 350 $(TOOLSDIR)/lib/string.c \ 351 $(TOOLSDIR)/lib/ctype.c \ 352 $(TOOLSDIR)/lib/str_error_r.c 353 $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \ 354 CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" \ 355 LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \ 356 EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \ 357 HOSTPKG_CONFIG='$(PKG_CONFIG)' \ 358 OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ) 359 360# Get Clang's default includes on this system, as opposed to those seen by 361# '--target=bpf'. This fixes "missing" files on some architectures/distros, 362# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc. 363# 364# Use '-idirafter': Don't interfere with include mechanics except where the 365# build would have failed anyways. 366define get_sys_includes 367$(shell $(1) $(2) -v -E - </dev/null 2>&1 \ 368 | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ 369$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}') \ 370$(shell $(1) $(2) -dM -E - </dev/null | grep '__loongarch_grlen ' | awk '{printf("-D__BITS_PER_LONG=%d", $$3)}') \ 371$(shell $(1) $(2) -dM -E - </dev/null | grep -E 'MIPS(EL|EB)|_MIPS_SZ(PTR|LONG) |_MIPS_SIM |_ABI(O32|N32|64) ' | awk '{printf("-D%s=%s ", $$2, $$3)}') 372endef 373 374ifneq ($(CROSS_COMPILE),) 375CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%)) 376endif 377 378CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) 379CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) 380 381# genkey writes both outputs. Pattern rules group them even on make 382# versions before 4.3, preventing concurrent genkey invocations. 383# Restrict the pattern to *_key files because genkey uses fixed names. 384$(BUILD_DIR)/%_key.pem $(BUILD_DIR)/%_key.der: $(VERIFY_SIG_SETUP) 385 $(Q)mkdir -p $(BUILD_DIR) 386 $(Q)$(VERIFY_SIG_SETUP) genkey $(BUILD_DIR) 387 388# Generates a header with C array declaration, containing test_progs_verification_cert bytes 389$(VERIFY_SIG_HDR): $(VERIFICATION_CERT) 390 $(Q)(echo "unsigned char test_progs_verification_cert[] = {"; \ 391 od -v -t 'xC' -w12 $< | sed 's/ \(\S\+\)/ 0x\1,/g;s/^\S\+/ /;$$d'; \ 392 echo "};"; \ 393 echo "unsigned int test_progs_verification_cert_len = $$(wc -c < $<);") > $@ 394 395LIBARENA_MAKE_ARGS = \ 396 BPFTOOL="$(BPFTOOL)" \ 397 INCLUDE_DIR="$(INCLUDE_DIR)" \ 398 LIBBPF_INCLUDE="$(HOST_INCLUDE_DIR)" \ 399 BPFOBJ="$(BPFOBJ)" \ 400 LDLIBS="$(LDLIBS) -lzstd" \ 401 CLANG="$(CLANG)" \ 402 BPF_CFLAGS="$(BPF_CFLAGS) $(CLANG_CFLAGS)" \ 403 BPF_TARGET_ENDIAN="$(BPF_TARGET_ENDIAN)" \ 404 Q="$(Q)" 405 406LIBARENA_COMMON_DEPS := $(wildcard libarena/Makefile \ 407 libarena/include/* \ 408 libarena/include/libarena/* \ 409 libarena/src/*) 410LIBARENA_BPF_DEPS := $(LIBARENA_COMMON_DEPS) $(wildcard libarena/selftests/*) 411LIBARENA_BENCH_BPF_DEPS := $(LIBARENA_COMMON_DEPS) $(wildcard libarena/benchs/*) 412 413LIBARENA_BENCH_SKEL := libarena/libarena_bench.skel.h 414 415$(LIBARENA_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BPF_DEPS) 416 +$(MAKE) -C libarena libarena.skel.h $(LIBARENA_MAKE_ARGS) 417 418$(LIBARENA_BENCH_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BENCH_BPF_DEPS) | $(LIBARENA_SKEL) 419 +$(MAKE) -C libarena benchmarks $(LIBARENA_MAKE_ARGS) 420 421ifneq ($(CLANG_HAS_ARENA_ASAN),) 422$(LIBARENA_ASAN_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BPF_DEPS) 423 +$(MAKE) -C libarena libarena_asan.skel.h $(LIBARENA_MAKE_ARGS) 424endif 425 426# #![no_std] looks for compiler_builtins too. Nothing of it is used. 427ifneq ($(RUST_CORE),) 428$(RUST_CORE): $(RUST_CORE_SRC) 429 $(call msg,RUSTC,,$@) 430 $(Q)mkdir -p $(@D) 431 +$(Q)$(RUSTC_BPF) -A warnings --edition 2024 --crate-name core --out-dir $(@D) $< 432 +$(Q)echo '#![feature(compiler_builtins)] #![compiler_builtins] #![no_std]' | \ 433 $(RUSTC_BPF) -A warnings --crate-name compiler_builtins --out-dir $(@D) - 434endif 435 436# Generated test list headers 437 438define gen_tests_hdr 439 $(call msg,TEST-HDR,,$@) 440 $(Q)(echo '/* Generated header, do not edit */'; \ 441 sed -n -E 's/^void (serial_)?test_([a-zA-Z0-9_]+)\((void)?\).*/DEFINE_TEST(\2)/p' \ 442 $(@D)/*.c | sort) > $@ 443endef 444 445prog_tests/tests.h: $(wildcard prog_tests/*.c) 446 $(gen_tests_hdr) 447 448map_tests/tests.h: $(wildcard map_tests/*.c) 449 $(gen_tests_hdr) 450 451# Test runner instances, one sub-make each (see Makefile.runner). 452 453# Share LLVM probe results with runners. Pass CC explicitly to 454# runners so it does not affect libbpf's compiler selection. 455export LLVM_LDLIBS LLVM_LDFLAGS 456 457# Pass assembled flags on the command line so runner assignments 458# cannot append them again. 459RUNNER_MAKE := $(MAKE) --no-print-directory -f Makefile.runner \ 460 OUTPUT=$(OUTPUT) CC='$(CC)' CLANG='$(CLANG)' \ 461 CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' 462 463# Shared inputs prepared before runner sub-makes start. 464# Also build veristat, which test_veristat executes. 465RUNNER_PREREQS := $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(BPFTOOL) \ 466 $(TRUNNER_BPFTOOL) $(RESOLVE_BTFIDS) \ 467 $(OUTPUT)/veristat \ 468 $(VERIFY_SIG_HDR) $(PRIVATE_KEY) $(VERIFICATION_CERT) \ 469 $(LIBARENA_SKEL) $(LIBARENA_ASAN_SKEL) \ 470 prog_tests/tests.h map_tests/tests.h \ 471 $(RUNNER_OBJS) $(RUST_CORE) 472 473# Runtime fixtures for each test_progs flavor. 474RUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \ 475 $(OUTPUT)/liburandom_read.so \ 476 $(OUTPUT)/xdp_synproxy \ 477 $(OUTPUT)/sign-file \ 478 $(OUTPUT)/uprobe_multi \ 479 $(TEST_KMOD_TARGETS) \ 480 ima_setup.sh \ 481 $(VERIFY_SIG_SETUP) \ 482 $(wildcard progs/btf_dump_test_case_*.c) \ 483 $(wildcard progs/*.bpf.o) \ 484 bpftool_btf_dump_sorted.expected \ 485 bpftool_btf_dump_unsorted.expected 486 487# Prepare fixtures in parallel with runner compilation. 488# Copy into flavor and out-of-tree directories; the in-tree 489# default runner uses the originals. 490RUNNER_EXTRA_DIRS := $(addprefix $(OUTPUT)/,$(TEST_INST_SUBDIRS)) 491ifneq ($(realpath $(OUTPUT)),$(CURDIR)) 492RUNNER_EXTRA_DIRS += $(OUTPUT) 493test_progs: $(OUTPUT)/runner-extras 494else 495test_progs: $(RUNNER_EXTRA_FILES) 496endif 497RUNNER_EXTRAS := $(addsuffix /runner-extras,$(RUNNER_EXTRA_DIRS)) 498 499.PHONY: $(RUNNER_EXTRAS) 500$(RUNNER_EXTRAS): $(RUNNER_EXTRA_FILES) 501 $(Q)mkdir -p $(@D) 502 $(Q)rsync -aq $(if $(PERMISSIVE),--ignore-missing-args) \ 503 $(RUNNER_EXTRA_FILES) $(@D)/ 504 505all: $(RUNNER_EXTRAS) 506$(addprefix test_progs-,$(TEST_INST_SUBDIRS)): test_progs-%: \ 507 $(OUTPUT)/%/runner-extras 508 509# The main Makefile cannot tell whether $(OUTPUT)/test_progs is stale - 510# only the runner sub-make knows its full dependency graph. FORCE makes 511# the delegating rules below always run; their dependents still rebuild 512# on mtime only. 513FORCE: 514 515# Build default BPF outputs here for standalone consumers and install. 516# Standalone consumers depend on individual skeletons; unflavored 517# runners depend on the complete set before their sub-makes start. 518RDIR := $(OUTPUT) 519FLAVOR := 520BINARY := test_progs 521BPF_CC := $(CLANG) 522BPF_CC_MSG := CLNG-BPF 523BPF_SYS_INCLUDES := $(CLANG_SYS_INCLUDES) 524BPF_CC_FLAGS := -O2 $(BPF_TARGET_ENDIAN) -mcpu=v3 525BPF_DEFINES := -DENABLE_ATOMICS_TESTS 526include Makefile.skel 527 528DEFAULT_RUNNER_ARGS := RUNNER=test_progs FLAVOR= TESTS_DIR=prog_tests \ 529 BPF_CC='$(BPF_CC)' BPF_CC_MSG=$(BPF_CC_MSG) \ 530 BPF_SYS_INCLUDES='$(BPF_SYS_INCLUDES)' \ 531 BPF_CC_FLAGS='$(BPF_CC_FLAGS)' BPF_DEFINES=$(BPF_DEFINES) 532CLANG_RUNNER_ARGS := BPF_CC='$(CLANG)' BPF_CC_MSG=CLNG-BPF \ 533 BPF_SYS_INCLUDES='$(CLANG_SYS_INCLUDES)' 534 535$(OUTPUT)/test_progs: $(RUNNER_PREREQS) $(BPF_OBJS) $(ALL_SKELS) FORCE 536 +$(Q)$(RUNNER_MAKE) $(DEFAULT_RUNNER_ARGS) 537 538$(OUTPUT)/test_progs-no_alu32: $(RUNNER_PREREQS) FORCE 539 +$(Q)$(RUNNER_MAKE) RUNNER=test_progs FLAVOR=no_alu32 TESTS_DIR=prog_tests \ 540 $(CLANG_RUNNER_ARGS) BPF_CC_FLAGS='-O2 $(BPF_TARGET_ENDIAN) -mcpu=v2' 541 542ifneq ($(CLANG_CPUV4),) 543$(OUTPUT)/test_progs-cpuv4: $(RUNNER_PREREQS) FORCE 544 +$(Q)$(RUNNER_MAKE) RUNNER=test_progs FLAVOR=cpuv4 TESTS_DIR=prog_tests \ 545 $(CLANG_RUNNER_ARGS) BPF_CC_FLAGS='-O2 $(BPF_TARGET_ENDIAN) -mcpu=v4' \ 546 BPF_DEFINES=-DENABLE_ATOMICS_TESTS 547endif 548 549ifneq ($(BPF_GCC),) 550# Sys includes come from the *host* gcc, not $(BPF_GCC), as the rule 551# this replaces had it. 552GCC_SYS_INCLUDES := $(call get_sys_includes,gcc,) 553 554$(OUTPUT)/test_progs-bpf_gcc: $(RUNNER_PREREQS) FORCE 555 +$(Q)$(RUNNER_MAKE) RUNNER=test_progs FLAVOR=bpf_gcc TESTS_DIR=prog_tests \ 556 BPF_CC='$(BPF_GCC)' BPF_CC_MSG=GCC-BPF \ 557 BPF_SYS_INCLUDES='$(GCC_SYS_INCLUDES)' \ 558 BPF_CC_FLAGS='-DBPF_NO_PRESERVE_ACCESS_INDEX -Wno-attributes -O2' 559endif 560 561# test_maps compiles map_tests/*.c against the default flavor's skeletons 562$(OUTPUT)/test_maps: $(RUNNER_PREREQS) $(BPF_OBJS) \ 563 $(ALL_SKELS) FORCE 564 +$(Q)$(RUNNER_MAKE) RUNNER=test_maps FLAVOR= TESTS_DIR=map_tests 565 566TEST_GEN_FILES += $(BPF_OBJS) 567 568# Define test_verifier test runner. 569# It is much simpler than test_maps/test_progs and sufficiently different from 570# them (e.g., test.h is using completely pattern), that it's worth just 571# explicitly defining all the rules explicitly. 572verifier/tests.h: verifier/*.c 573 $(Q)( cd verifier/; \ 574 echo '/* Generated header, do not edit */'; \ 575 echo '#ifdef FILL_ARRAY'; \ 576 ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \ 577 echo '#endif' \ 578 ) > verifier/tests.h 579$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT) 580 $(call msg,BINARY,,$@) 581 $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ 582 583# Keep xskxceiver independent from test_progs object dependencies. 584$(OUTPUT)/xskxceiver: xskxceiver.c xsk.c network_helpers.c \ 585 $(TOOLSDIR)/lib/find_bit.c prog_tests/test_xsk.c \ 586 xskxceiver.h xsk.h network_helpers.h \ 587 prog_tests/test_xsk.h test_progs.h bpf_util.h \ 588 $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT) 589 $(call msg,BINARY,,$@) 590 $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ 591 592$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c xsk.c network_helpers.c \ 593 $(TOOLSDIR)/lib/find_bit.c xdp_metadata.h \ 594 xsk.h network_helpers.h test_progs.h bpf_util.h \ 595 $(OUTPUT)/xdp_hw_metadata.skel.h $(BPFOBJ) | $(OUTPUT) 596 $(call msg,BINARY,,$@) 597 $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ 598 599$(OUTPUT)/xdp_features: xdp_features.c network_helpers.c xdp_features.h \ 600 network_helpers.h \ 601 test_progs.h bpf_util.h $(OUTPUT)/xdp_features.skel.h \ 602 $(BPFOBJ) | $(OUTPUT) 603 $(call msg,BINARY,,$@) 604 $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ 605 606# Make sure we are able to include and link libbpf against c++. 607CXXFLAGS += $(CFLAGS) 608CXXFLAGS := $(subst -D_GNU_SOURCE=,,$(CXXFLAGS)) 609CXXFLAGS := $(subst -std=gnu11,-std=gnu++11,$(CXXFLAGS)) 610$(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ) 611 $(call msg,CXX,,$@) 612 $(Q)$(CXX) $(CXXFLAGS) $(filter %.a %.o %.cpp,$^) $(LDLIBS) -o $@ 613 614# Benchmark runner. Every benchs/bench_*.c is compiled and linked in. 615BENCH_OBJS := $(sort $(patsubst benchs/%.c,$(OUTPUT)/%.o,$(wildcard benchs/bench_*.c))) 616$(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h $(BPFOBJ) 617 $(call msg,CC,,$@) 618 $(Q)$(CC) $(CFLAGS) -O2 -c $(filter %.c,$^) $(LDLIBS) -o $@ $(call skip_on_fail,BENCH) 619$(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h 620$(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h 621$(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \ 622 $(OUTPUT)/perfbuf_bench.skel.h 623$(OUTPUT)/bench_bloom_filter_map.o: $(OUTPUT)/bloom_filter_bench.skel.h 624$(OUTPUT)/bench_bpf_loop.o: $(OUTPUT)/bpf_loop_bench.skel.h 625$(OUTPUT)/bench_bpf_for.o: $(OUTPUT)/bpf_for_bench.skel.h 626$(OUTPUT)/bench_strncmp.o: $(OUTPUT)/strncmp_bench.skel.h 627$(OUTPUT)/bench_bpf_hashmap_full_update.o: $(OUTPUT)/bpf_hashmap_full_update_bench.skel.h 628$(OUTPUT)/bench_local_storage.o: $(OUTPUT)/local_storage_bench.skel.h 629$(OUTPUT)/bench_local_storage_rcu_tasks_trace.o: $(OUTPUT)/local_storage_rcu_tasks_trace_bench.skel.h 630$(OUTPUT)/bench_local_storage_create.o: $(OUTPUT)/bench_local_storage_create.skel.h 631$(OUTPUT)/bench_bpf_hashmap_lookup.o: $(OUTPUT)/bpf_hashmap_lookup.skel.h 632$(OUTPUT)/bench_htab_mem.o: $(OUTPUT)/htab_mem_bench.skel.h 633$(OUTPUT)/bench_bpf_crypto.o: $(OUTPUT)/crypto_bench.skel.h 634$(OUTPUT)/bench_sockmap.o: $(OUTPUT)/bench_sockmap_prog.skel.h 635$(OUTPUT)/bench_lpm_trie_map.o: $(OUTPUT)/lpm_trie_bench.skel.h $(OUTPUT)/lpm_trie_map.skel.h 636$(OUTPUT)/bench_bpf_nop.o: $(OUTPUT)/bpf_nop_bench.skel.h bench_bpf_timing.h 637$(OUTPUT)/bench_xdp_lb.o: $(OUTPUT)/xdp_lb_bench.skel.h bench_bpf_timing.h 638$(OUTPUT)/bench_libarena.o: $(LIBARENA_BENCH_SKEL) 639$(OUTPUT)/bench_bpf_timing.o: bench_bpf_timing.h 640$(OUTPUT)/bench.o: bench.h testing_helpers.h $(BPFOBJ) 641$(OUTPUT)/bench: LDLIBS += -lm 642$(OUTPUT)/bench: $(OUTPUT)/bench.o \ 643 $(TESTING_HELPERS) \ 644 $(TRACE_HELPERS) \ 645 $(CGROUP_HELPERS) \ 646 $(BENCH_OBJS) \ 647 $(OUTPUT)/usdt_1.o \ 648 $(OUTPUT)/usdt_2.o 649 $(call msg,BINARY,,$@) 650 $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ $(call skip_on_fail,LINK,,(some benchmarks may have been skipped)) 651 652# This works around GCC warning about snprintf truncating strings like: 653# 654# char a[PATH_MAX], b[PATH_MAX]; 655# snprintf(a, "%s/foo", b); // triggers -Wformat-truncation 656$(OUTPUT)/veristat.o: CFLAGS += -Wno-format-truncation 657$(OUTPUT)/veristat.o: $(BPFOBJ) 658$(OUTPUT)/veristat: $(OUTPUT)/veristat.o 659 $(call msg,BINARY,,$@) 660 $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ 661 662# Linking uprobe_multi can fail due to relocation overflows on mips. 663$(OUTPUT)/uprobe_multi: CFLAGS += $(if $(filter mips, $(ARCH)),-mxgot) 664$(OUTPUT)/uprobe_multi: uprobe_multi.c uprobe_multi.ld 665 $(call msg,BINARY,,$@) 666 $(Q)$(CC) $(CFLAGS) -Wl,-T,uprobe_multi.ld -O0 $(LDFLAGS) \ 667 $(filter-out %.ld,$^) $(LDLIBS) -o $@ 668 669EXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) \ 670 prog_tests/tests.h map_tests/tests.h verifier/tests.h \ 671 feature bpftool $(TEST_KMOD_TARGETS) \ 672 $(addprefix $(OUTPUT)/,*.o *.d *.skel.h *.lskel.h *.subskel.h \ 673 *.BTF *.BTF_ids *.BTF.base \ 674 no_alu32 cpuv4 bpf_gcc \ 675 liburandom_read.so) \ 676 $(OUTPUT)/FEATURE-DUMP.selftests 677 678.PHONY: docs docs-clean 679 680# Delete partially updated (corrupted) files on error 681.DELETE_ON_ERROR: 682 683# When permissive, tell rsync to ignore missing source arguments so that 684# partial builds do not abort installation. 685ifneq ($(PERMISSIVE),) 686override define INSTALL_SINGLE_RULE 687 $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)) 688 $(if $(INSTALL_LIST),rsync -a --copy-unsafe-links --ignore-missing-args $(INSTALL_LIST) $(INSTALL_PATH)/) 689endef 690endif 691 692DEFAULT_INSTALL_RULE := $(INSTALL_RULE) 693override define INSTALL_RULE 694 $(DEFAULT_INSTALL_RULE) 695 @mkdir -p $(INSTALL_PATH)/tools/sbin 696 @rsync -a $(if $(PERMISSIVE),--ignore-missing-args) $(TRUNNER_BPFTOOL) $(INSTALL_PATH)/tools/sbin/ 697 @rsync -a $(if $(PERMISSIVE),--ignore-missing-args) $(OUTPUT)/*.BTF $(INSTALL_PATH)/ 698 @for DIR in $(TEST_INST_SUBDIRS); do \ 699 mkdir -p $(INSTALL_PATH)/$$DIR; \ 700 rsync -a $(if $(PERMISSIVE),--ignore-missing-args) \ 701 $(OUTPUT)/$$DIR/*.bpf.o $(OUTPUT)/$$DIR/*.BTF \ 702 $(INSTALL_PATH)/$$DIR; \ 703 done 704endef 705 706libarena: $(LIBARENA_SKEL) 707 708ifneq ($(CLANG_HAS_ARENA_ASAN),) 709libarena_asan: $(LIBARENA_ASAN_SKEL) 710endif 711