mirror of
https://github.com/torvalds/linux.git
synced 2026-09-26 01:52:03 +02:00
perf c2c:
- Add 'function view' in perf c2c report TUI (switched by pressing 'TAB'
in the cacheline view) to organize samples around functions rather than
cachelines in 3-level hierarchy:
Level 1: Read-side function (sorted by estimated Cycles %)
Level 2: Contending writer functions (sorted by Store count)
Level 3: Shared cacheline addresses
Users can navigate the entries and fold/unfold using 'e' key. An example
output would look like below:
Shared Data Functions Table (19 entries, sorted on Cycles %)
Cycles Store
% count Function / Contending function / Cacheline
----------------------------------------------------------------------
+ 35.67% 876 + [k] cpupri_set
+ 24.31% 424 + [k] pull_rt_task
- 16.53% 555 - [k] dequeue_pushable_task
145 - [k] pull_rt_task
145 0xff2d0082809da080
139 - [k] enqueue_pushable_task
70 0xff2d00a2071f9640
69 0xff2d0082809da000
python module support:
- Extend "perf" python module so that it can be fully functional. The goal
is to run scripts directly, not by 'perf script' command. This would give
better performance as well as more control to build standalone programs
with UI.
- Add LiveSession helper (perf_live.py) to enable live event collection
directly from Python using perf.evlist and perf.parse_events.
perf stat:
- Add --hide-zero-events option to suppress zero-count events.
- Reject conflicting --field-separator and --json-output options.
- Fix duplicate event output with --for-each-cgroup.
perf sched latency:
- Add -H/--histogram and --hist-mode (log|linear) options to show scheduler
wait latency histograms.
- Add --time option to filter analysis by time span in 'perf sched latency'.
ARM CoreSight:
- Synthesize callchains for instruction samples from CoreSight trace
using thread stack ('--itrace=g...').
- Support call indentation ('perf script -F +callindent') to display call
depth hierarchy on branch samples.
- Decode ETE (Embedded Trace Extension) exception packets.
Build system:
- Add 'make install-build-deps' target to install required packages.
- Parallelize JSON and metric pre-computation in jevents.py for faster builds.
Vendor event/metric updates:
- Add Intel Nova Lake events and update tables for existing models.
- Update AMD Zen 5 and Zen 6 core events.
- Update Arm64 Tegra410 metrics and PowerPC hcalls.
Internal changes and fixes:
- Harden trace-event and synthetic event parsing against corrupted data.
- Fix unwinding of multi-threaded processes in libdw unwinder.
- Fix memory leaks in various commands and python bindings.
- Speed up 'perf test' shell tests.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQSo2x5BnqMqsoHtzsmMstVUGiXMgwUCaojCVQAKCRCMstVUGiXM
gxZLAP9u7Bqhfcrc1KKS9RcxBaiYwsPOIgbtdrDDCSiLtdz0EwEAk1UCSXodUsaR
45nbx01h+h7cUWk2HM735f4RXRfO/AE=
=GLJH
-----END PGP SIGNATURE-----
Merge tag 'perf-tools-for-v7.3-2026-08-21' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools
Pull perf tools updates from Namhyung Kim:
"perf c2c:
- Add 'function view' in perf c2c report TUI (switched by pressing
'TAB' in the cacheline view) to organize samples around functions
rather than cachelines in 3-level hierarchy:
Level 1: Read-side function (sorted by estimated Cycles %)
Level 2: Contending writer functions (sorted by Store count)
Level 3: Shared cacheline addresses
Users can navigate the entries and fold/unfold using 'e' key. An
example output would look like below:
Shared Data Functions Table (19 entries, sorted on Cycles %)
Cycles Store
% count Function / Contending function / Cacheline
----------------------------------------------------------------------
+ 35.67% 876 + [k] cpupri_set
+ 24.31% 424 + [k] pull_rt_task
- 16.53% 555 - [k] dequeue_pushable_task
145 - [k] pull_rt_task
145 0xff2d0082809da080
139 - [k] enqueue_pushable_task
70 0xff2d00a2071f9640
69 0xff2d0082809da000
python module support:
- Extend "perf" python module so that it can be fully functional. The
goal is to run scripts directly, not by 'perf script' command. This
would give better performance as well as more control to build
standalone programs with UI.
- Add LiveSession helper (perf_live.py) to enable live event
collection directly from Python using perf.evlist and
perf.parse_events.
perf stat:
- Add --hide-zero-events option to suppress zero-count events
- Reject conflicting --field-separator and --json-output options
- Fix duplicate event output with --for-each-cgroup
perf sched latency:
- Add -H/--histogram and --hist-mode (log|linear) options to show
scheduler wait latency histograms
- Add --time option to filter analysis by time span in 'perf sched
latency'
ARM CoreSight:
- Synthesize callchains for instruction samples from CoreSight trace
using thread stack ('--itrace=g...')
- Support call indentation ('perf script -F +callindent') to display
call depth hierarchy on branch samples
- Decode ETE (Embedded Trace Extension) exception packets
Build system:
- Add 'make install-build-deps' target to install required packages
- Parallelize JSON and metric pre-computation in jevents.py for
faster builds
Vendor event/metric updates:
- Add Intel Nova Lake events and update tables for existing models
- Update AMD Zen 5 and Zen 6 core events
- Update Arm64 Tegra410 metrics and PowerPC hcalls
Internal changes and fixes:
- Harden trace-event and synthetic event parsing against corrupted
data
- Fix unwinding of multi-threaded processes in libdw unwinder
- Fix memory leaks in various commands and python bindings
- Speed up 'perf test' shell tests"
* tag 'perf-tools-for-v7.3-2026-08-21' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: (232 commits)
perf vendor events arm64: Fix Tegra410 Olympus event 0x0197
perf vendor events arm64: fix swapped MetricGroup for Tegra410 L1 prefetcher metrics
perf evlist: Warn when 'sleep' workload is used without system-wide (-a) option
perf c2c: document function view in perf-c2c man page
perf c2c: add function view browser UI and cacheline detail
perf c2c: build and finalize the function view hierarchy
perf c2c: add function view hierarchy entry creation
perf c2c: add function view stats merge and memory management
perf c2c: add HPP list parsing for function view columns
perf c2c: add column rendering for function view
perf c2c: add function view model skeleton
perf c2c: extract shared data structures into util/c2c.h
perf test sample-parsing: Validate PERF_FORMAT_GROUP values without LOST
perf dso: Replace assert with runtime check in dso__read_symbol()
perf dso: Guard against cache underflow on short reads in dso_cache__memcpy()
perf dso: Use stored fd error instead of stale errno in file_read() and file_size()
perf dso: Guard close() against invalid fd in dso__decompress_kmodule_path()
perf dso: Guard against errno==0 when dso__get_filename() returns NULL
perf build: install-build-deps: add RHEL family devel package mapping
perf build: Remove leftover feature tests for removed cxx and clang support
...
1082 lines
43 KiB
Makefile
1082 lines
43 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
include ../../../build/Build.include
|
|
include ../../../scripts/Makefile.arch
|
|
include ../../../scripts/Makefile.include
|
|
|
|
OBJCOPY ?= $(CROSS_COMPILE)objcopy
|
|
|
|
CURDIR := $(abspath .)
|
|
TOOLSDIR := $(abspath ../../..)
|
|
LIBDIR := $(TOOLSDIR)/lib
|
|
BPFDIR := $(LIBDIR)/bpf
|
|
TOOLSINCDIR := $(TOOLSDIR)/include
|
|
TOOLSARCHINCDIR := $(TOOLSDIR)/arch/$(SRCARCH)/include
|
|
BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
|
|
APIDIR := $(TOOLSINCDIR)/uapi
|
|
ifneq ($(O),)
|
|
GENDIR := $(O)/include/generated
|
|
else
|
|
GENDIR := $(abspath ../../../../include/generated)
|
|
endif
|
|
GENHDR := $(GENDIR)/autoconf.h
|
|
PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config
|
|
|
|
ifneq ($(wildcard $(GENHDR)),)
|
|
GENFLAGS := -DHAVE_GENHDR
|
|
endif
|
|
|
|
BPF_GCC ?= $(shell command -v bpf-gcc;)
|
|
ifdef ASAN
|
|
SAN_CFLAGS ?= -fsanitize=address -fno-omit-frame-pointer
|
|
else
|
|
SAN_CFLAGS ?=
|
|
endif
|
|
SAN_LDFLAGS ?= $(SAN_CFLAGS)
|
|
RELEASE ?=
|
|
OPT_FLAGS ?= $(if $(RELEASE),-O2,-O0)
|
|
|
|
LIBELF_CFLAGS := $(shell $(PKG_CONFIG) libelf --cflags 2>/dev/null)
|
|
LIBELF_LIBS := $(shell $(PKG_CONFIG) libelf --libs 2>/dev/null || echo -lelf)
|
|
|
|
SKIP_DOCS ?=
|
|
SKIP_LLVM ?=
|
|
SKIP_LIBBFD ?=
|
|
SKIP_CRYPTO ?=
|
|
|
|
# When BPF_STRICT_BUILD is 1, any BPF object, skeleton, test object, or
|
|
# benchmark compilation failure is fatal. Set to 0 to tolerate failures
|
|
# and continue building the remaining tests.
|
|
BPF_STRICT_BUILD ?= 1
|
|
PERMISSIVE := $(filter 0,$(BPF_STRICT_BUILD))
|
|
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
endif
|
|
|
|
COMMON_CFLAGS = -g $(OPT_FLAGS) -rdynamic -std=gnu11 \
|
|
-Wall -Werror -fno-omit-frame-pointer \
|
|
-Wno-unused-but-set-variable \
|
|
$(GENFLAGS) $(SAN_CFLAGS) $(LIBELF_CFLAGS) \
|
|
-I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \
|
|
-I$(TOOLSINCDIR) -I$(TOOLSARCHINCDIR) -I$(APIDIR) -I$(OUTPUT) \
|
|
-I$(CURDIR)/libarena/include
|
|
LDFLAGS += $(SAN_LDFLAGS)
|
|
LDLIBS += $(LIBELF_LIBS) -lz -lrt -lpthread
|
|
|
|
PCAP_CFLAGS := $(shell $(PKG_CONFIG) --cflags libpcap 2>/dev/null && echo "-DTRAFFIC_MONITOR=1")
|
|
PCAP_LIBS := $(shell $(PKG_CONFIG) --libs libpcap 2>/dev/null)
|
|
LDLIBS += $(PCAP_LIBS)
|
|
CFLAGS += $(COMMON_CFLAGS) $(PCAP_CFLAGS)
|
|
|
|
# Some utility functions use LLVM libraries
|
|
jit_disasm_helpers.c-CFLAGS = $(LLVM_CFLAGS)
|
|
|
|
ifneq ($(LLVM),)
|
|
# Silence some warnings when compiled with clang
|
|
CFLAGS += -Wno-unused-command-line-argument
|
|
endif
|
|
|
|
# Check whether bpf cpu=v4 is supported or not by clang
|
|
ifneq ($(shell $(CLANG) --target=bpf -mcpu=help 2>&1 | grep 'v4'),)
|
|
CLANG_CPUV4 := 1
|
|
endif
|
|
|
|
# Check whether clang supports BPF address sanitizer (requires LLVM 22+)
|
|
CLANG_HAS_ARENA_ASAN := $(shell echo 'int x;' | \
|
|
$(CLANG) --target=bpf -fsanitize=kernel-address \
|
|
-mllvm -asan-shadow-addr-space=1 \
|
|
-x c -c - -o /dev/null 2>/dev/null && echo 1)
|
|
|
|
# Order correspond to 'make run_tests' order
|
|
TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_progs \
|
|
test_sockmap \
|
|
test_tcpnotify_user \
|
|
test_progs-no_alu32
|
|
TEST_INST_SUBDIRS := no_alu32
|
|
|
|
# Also test bpf-gcc, if present
|
|
ifneq ($(BPF_GCC),)
|
|
TEST_GEN_PROGS += test_progs-bpf_gcc
|
|
TEST_INST_SUBDIRS += bpf_gcc
|
|
|
|
# The following tests contain C code that, although technically legal,
|
|
# triggers GCC warnings that cannot be disabled: declaration of
|
|
# anonymous struct types in function parameter lists.
|
|
progs/btf_dump_test_case_bitfields.c-bpf_gcc-CFLAGS := -Wno-error
|
|
progs/btf_dump_test_case_namespacing.c-bpf_gcc-CFLAGS := -Wno-error
|
|
progs/btf_dump_test_case_packing.c-bpf_gcc-CFLAGS := -Wno-error
|
|
progs/btf_dump_test_case_padding.c-bpf_gcc-CFLAGS := -Wno-error
|
|
progs/btf_dump_test_case_syntax.c-bpf_gcc-CFLAGS := -Wno-error
|
|
|
|
endif
|
|
|
|
ifneq ($(CLANG_CPUV4),)
|
|
TEST_GEN_PROGS += test_progs-cpuv4
|
|
TEST_INST_SUBDIRS += cpuv4
|
|
endif
|
|
|
|
TEST_FILES = xsk_prereqs.sh $(wildcard progs/btf_dump_test_case_*.c)
|
|
|
|
# Order correspond to 'make run_tests' order
|
|
TEST_PROGS := test_kmod.sh \
|
|
test_lirc_mode2.sh \
|
|
test_bpftool_build.sh \
|
|
test_doc_build.sh \
|
|
test_xsk.sh \
|
|
test_xdp_features.sh
|
|
|
|
TEST_PROGS_EXTENDED := \
|
|
ima_setup.sh verify_sig_setup.sh
|
|
|
|
TEST_KMODS := bpf_testmod.ko bpf_test_no_cfi.ko bpf_test_modorder_x.ko \
|
|
bpf_test_modorder_y.ko bpf_test_rqspinlock.ko
|
|
TEST_KMOD_TARGETS = $(addprefix $(OUTPUT)/,$(TEST_KMODS))
|
|
|
|
# Compile but not part of 'make run_tests'
|
|
TEST_GEN_PROGS_EXTENDED = \
|
|
bench \
|
|
flow_dissector_load \
|
|
test_cpp \
|
|
test_lirc_mode2_user \
|
|
veristat \
|
|
xdp_features \
|
|
xdp_hw_metadata \
|
|
xdp_synproxy \
|
|
xskxceiver
|
|
|
|
TEST_GEN_FILES += $(TEST_KMODS) liburandom_read.so urandom_read sign-file uprobe_multi
|
|
|
|
ifneq ($(V),1)
|
|
submake_extras := feature_display=0
|
|
endif
|
|
|
|
# override lib.mk's default rules
|
|
OVERRIDE_TARGETS := 1
|
|
override define CLEAN
|
|
$(call msg,CLEAN)
|
|
$(Q)$(RM) -r $(TEST_GEN_PROGS)
|
|
$(Q)$(RM) -r $(TEST_GEN_PROGS_EXTENDED)
|
|
$(Q)$(RM) -r $(TEST_GEN_FILES)
|
|
$(Q)$(RM) -r $(TEST_KMODS)
|
|
$(Q)$(RM) -r $(EXTRA_CLEAN)
|
|
$(Q)$(MAKE) -C test_kmods clean
|
|
$(Q)$(MAKE) -C libarena clean
|
|
$(Q)$(MAKE) docs-clean
|
|
endef
|
|
|
|
include ../lib.mk
|
|
|
|
NON_CHECK_FEAT_TARGETS := clean docs-clean emit_tests
|
|
CHECK_FEAT := $(filter-out $(NON_CHECK_FEAT_TARGETS),$(or $(MAKECMDGOALS), "none"))
|
|
ifneq ($(CHECK_FEAT),)
|
|
FEATURE_USER := .selftests
|
|
FEATURE_TESTS := llvm
|
|
FEATURE_DISPLAY := $(FEATURE_TESTS)
|
|
|
|
# Makefile.feature expects OUTPUT to end with a slash
|
|
ifeq ($(shell expr $(MAKE_VERSION) \>= 4.4), 1)
|
|
$(let OUTPUT,$(OUTPUT)/,\
|
|
$(eval include ../../../build/Makefile.feature))
|
|
else
|
|
override OUTPUT := $(OUTPUT)/
|
|
$(eval include ../../../build/Makefile.feature)
|
|
override OUTPUT := $(patsubst %/,%,$(OUTPUT))
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(SKIP_LLVM),1)
|
|
ifeq ($(feature-llvm),1)
|
|
LLVM_CFLAGS += -DHAVE_LLVM_SUPPORT
|
|
LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets
|
|
# both llvm-config and lib.mk add -D_GNU_SOURCE, which ends up as conflict
|
|
LLVM_CFLAGS += $(filter-out -D_GNU_SOURCE,$(shell $(LLVM_CONFIG) --cflags))
|
|
# Cross compilation must use dynamic linking to avoid unresolved library
|
|
# dependencies. For native build, prefer linking statically if it's
|
|
# available, otherwise fallback to shared.
|
|
ifneq ($(ARCH), $(HOSTARCH))
|
|
LLVM_LINK_STATIC :=
|
|
else
|
|
LLVM_LINK_STATIC := $(shell $(LLVM_CONFIG) --link-static --libs >/dev/null 2>&1 && echo y)
|
|
endif
|
|
ifeq ($(LLVM_LINK_STATIC),y)
|
|
LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-static --libs $(LLVM_CONFIG_LIB_COMPONENTS))
|
|
LLVM_LDLIBS += $(filter-out -lxml2,$(shell $(LLVM_CONFIG) --link-static --system-libs $(LLVM_CONFIG_LIB_COMPONENTS)))
|
|
LLVM_LDLIBS += -lstdc++
|
|
else
|
|
LLVM_LDLIBS += $(shell $(LLVM_CONFIG) --link-shared --libs $(LLVM_CONFIG_LIB_COMPONENTS))
|
|
endif
|
|
LLVM_LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags)
|
|
endif
|
|
endif
|
|
|
|
SCRATCH_DIR := $(OUTPUT)/tools
|
|
BUILD_DIR := $(SCRATCH_DIR)/build
|
|
INCLUDE_DIR := $(SCRATCH_DIR)/include
|
|
BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a
|
|
ifneq ($(CROSS_COMPILE),)
|
|
HOST_BUILD_DIR := $(BUILD_DIR)/host
|
|
HOST_SCRATCH_DIR := $(OUTPUT)/host-tools
|
|
HOST_INCLUDE_DIR := $(HOST_SCRATCH_DIR)/include
|
|
else
|
|
HOST_BUILD_DIR := $(BUILD_DIR)
|
|
HOST_SCRATCH_DIR := $(SCRATCH_DIR)
|
|
HOST_INCLUDE_DIR := $(INCLUDE_DIR)
|
|
endif
|
|
HOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a
|
|
RESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids
|
|
VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
|
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
|
../../../../vmlinux \
|
|
/sys/kernel/btf/vmlinux \
|
|
/boot/vmlinux-$(shell uname -r)
|
|
VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
|
ifeq ($(VMLINUX_BTF),)
|
|
$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
|
|
endif
|
|
|
|
# Define simple and short `make test_progs`, `make test_maps`, 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_KMODS) \
|
|
$(TEST_GEN_PROGS_EXTENDED)): %: $(OUTPUT)/% ;
|
|
|
|
# sort removes libbpf duplicates when not cross-building
|
|
MAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \
|
|
$(BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/bpftool \
|
|
$(HOST_BUILD_DIR)/resolve_btfids \
|
|
$(INCLUDE_DIR))
|
|
$(MAKE_DIRS):
|
|
$(call msg,MKDIR,,$@)
|
|
$(Q)mkdir -p $@
|
|
|
|
$(OUTPUT)/%.o: %.c
|
|
$(call msg,CC,,$@)
|
|
$(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@
|
|
|
|
$(OUTPUT)/%:%.c
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(LINK.c) $^ $(LDLIBS) -o $@
|
|
|
|
# LLVM's ld.lld doesn't support all the architectures, so use it only on x86
|
|
ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 riscv))
|
|
LLD := lld
|
|
else
|
|
LLD := $(shell command -v $(LD))
|
|
endif
|
|
|
|
# Filter out -static for liburandom_read.so and its dependent targets so that static builds
|
|
# do not fail. Static builds leave urandom_read relying on system-wide shared libraries.
|
|
$(OUTPUT)/liburandom_read.so: urandom_read_lib1.c urandom_read_lib2.c liburandom_read.map
|
|
$(call msg,LIB,,$@)
|
|
$(Q)$(CLANG) $(CLANG_TARGET_ARCH) \
|
|
$(filter-out -static,$(COMMON_CFLAGS) $(LDFLAGS)) \
|
|
$(filter %.c,$^) $(filter-out -static,$(LDLIBS)) \
|
|
-Wno-unused-command-line-argument \
|
|
-fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \
|
|
-Wl,--version-script=liburandom_read.map \
|
|
-fPIC -shared -o $@
|
|
|
|
$(OUTPUT)/urandom_read: urandom_read.c urandom_read_aux.c $(OUTPUT)/liburandom_read.so
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CLANG) $(CLANG_TARGET_ARCH) \
|
|
$(filter-out -static,$(COMMON_CFLAGS) $(LDFLAGS)) $(filter %.c,$^) \
|
|
-Wno-unused-command-line-argument \
|
|
-lurandom_read $(filter-out -static,$(LDLIBS)) -L$(OUTPUT) \
|
|
-fuse-ld=$(LLD) -Wl,-znoseparate-code -Wl,--build-id=sha1 \
|
|
-Wl,-rpath=. -o $@
|
|
|
|
$(OUTPUT)/sign-file: ../../../../scripts/sign-file.c
|
|
$(call msg,SIGN-FILE,,$@)
|
|
$(Q)$(CC) $(shell $(PKG_CONFIG) --cflags libcrypto 2> /dev/null) \
|
|
-I$(srctree)/tools/include/uapi/ \
|
|
$< -o $@ \
|
|
$(shell $(PKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
|
|
|
# This should really be a grouped target, but make versions before 4.3 don't
|
|
# support that for regular rules. However, pattern matching rules are implicitly
|
|
# treated as grouped even with older versions of make, so as a workaround, the
|
|
# subst() turns the rule into a pattern matching rule
|
|
$(addprefix test_kmods/,$(subst .ko,%ko,$(TEST_KMODS))): $(VMLINUX_BTF) $(RESOLVE_BTFIDS) $(wildcard test_kmods/Makefile test_kmods/*.[ch])
|
|
$(Q)$(RM) test_kmods/*.ko test_kmods/*.mod.o # force re-compilation
|
|
$(Q)$(MAKE) $(submake_extras) -C test_kmods \
|
|
$(if $(O),O=$(abspath $(O))) \
|
|
$(if $(KBUILD_OUTPUT),KBUILD_OUTPUT=$(abspath $(KBUILD_OUTPUT)))\
|
|
RESOLVE_BTFIDS=$(RESOLVE_BTFIDS) \
|
|
EXTRA_CFLAGS='' EXTRA_LDFLAGS=''
|
|
|
|
$(TEST_KMOD_TARGETS): $(addprefix test_kmods/,$(TEST_KMODS))
|
|
$(call msg,MOD,,$@)
|
|
$(Q)$(if $(PERMISSIVE),if [ -f test_kmods/$(@F) ]; then )cp test_kmods/$(@F) $@$(if $(PERMISSIVE),; fi)
|
|
|
|
|
|
DEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
|
|
ifneq ($(CROSS_COMPILE),)
|
|
CROSS_BPFTOOL := $(SCRATCH_DIR)/sbin/bpftool
|
|
TRUNNER_BPFTOOL := $(CROSS_BPFTOOL)
|
|
USE_BOOTSTRAP := ""
|
|
else
|
|
TRUNNER_BPFTOOL := $(DEFAULT_BPFTOOL)
|
|
USE_BOOTSTRAP := "bootstrap/"
|
|
endif
|
|
|
|
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ)
|
|
|
|
TESTING_HELPERS := $(OUTPUT)/testing_helpers.o
|
|
CGROUP_HELPERS := $(OUTPUT)/cgroup_helpers.o
|
|
UNPRIV_HELPERS := $(OUTPUT)/unpriv_helpers.o
|
|
TRACE_HELPERS := $(OUTPUT)/trace_helpers.o
|
|
JSON_WRITER := $(OUTPUT)/json_writer.o
|
|
CAP_HELPERS := $(OUTPUT)/cap_helpers.o
|
|
NETWORK_HELPERS := $(OUTPUT)/network_helpers.o
|
|
|
|
$(OUTPUT)/test_sockmap: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
|
$(OUTPUT)/test_tcpnotify_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) $(TRACE_HELPERS)
|
|
$(OUTPUT)/test_sock_fields: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
|
$(OUTPUT)/test_tag: $(TESTING_HELPERS)
|
|
$(OUTPUT)/test_lirc_mode2_user: $(TESTING_HELPERS)
|
|
$(OUTPUT)/flow_dissector_load: $(TESTING_HELPERS)
|
|
$(OUTPUT)/test_maps: $(TESTING_HELPERS)
|
|
$(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS) $(UNPRIV_HELPERS)
|
|
$(OUTPUT)/xsk.o: $(BPFOBJ)
|
|
|
|
BPFTOOL ?= $(DEFAULT_BPFTOOL)
|
|
$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
|
$(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
|
|
$(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
|
|
ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" \
|
|
EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \
|
|
EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \
|
|
OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \
|
|
LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
|
|
LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/ \
|
|
SKIP_LLVM=$(SKIP_LLVM) \
|
|
SKIP_LIBBFD=$(SKIP_LIBBFD) \
|
|
SKIP_CRYPTO=$(SKIP_CRYPTO) \
|
|
prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin
|
|
|
|
ifneq ($(CROSS_COMPILE),)
|
|
$(CROSS_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
|
$(BPFOBJ) | $(BUILD_DIR)/bpftool
|
|
$(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
|
|
ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) \
|
|
EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \
|
|
EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \
|
|
OUTPUT=$(BUILD_DIR)/bpftool/ \
|
|
LIBBPF_OUTPUT=$(BUILD_DIR)/libbpf/ \
|
|
LIBBPF_DESTDIR=$(SCRATCH_DIR)/ \
|
|
SKIP_LLVM=$(SKIP_LLVM) \
|
|
SKIP_LIBBFD=$(SKIP_LIBBFD) \
|
|
SKIP_CRYPTO=$(SKIP_CRYPTO) \
|
|
prefix= DESTDIR=$(SCRATCH_DIR)/ install-bin
|
|
endif
|
|
|
|
ifneq ($(SKIP_DOCS),1)
|
|
all: docs
|
|
endif
|
|
|
|
docs:
|
|
$(Q)RST2MAN_OPTS="--exit-status=1" $(MAKE) $(submake_extras) \
|
|
-f Makefile.docs \
|
|
prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@
|
|
|
|
docs-clean:
|
|
$(Q)$(MAKE) $(submake_extras) \
|
|
-f Makefile.docs \
|
|
prefix= OUTPUT=$(OUTPUT)/ DESTDIR=$(OUTPUT)/ $@
|
|
|
|
$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
|
|
$(APIDIR)/linux/bpf.h \
|
|
| $(BUILD_DIR)/libbpf
|
|
$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \
|
|
EXTRA_CFLAGS='-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \
|
|
EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \
|
|
DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
|
|
|
|
ifneq ($(BPFOBJ),$(HOST_BPFOBJ))
|
|
$(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
|
|
$(APIDIR)/linux/bpf.h \
|
|
| $(HOST_BUILD_DIR)/libbpf
|
|
$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \
|
|
ARCH= CROSS_COMPILE= \
|
|
EXTRA_CFLAGS='-g $(OPT_FLAGS) $(EXTRA_CFLAGS)' \
|
|
EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' \
|
|
OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
|
|
CC="$(HOSTCC)" LD="$(HOSTLD)" \
|
|
DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers
|
|
endif
|
|
|
|
# vmlinux.h is first dumped to a temporary file and then compared to
|
|
# the previous version. This helps to avoid unnecessary re-builds of
|
|
# $(TRUNNER_BPF_OBJS)
|
|
$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
|
|
ifeq ($(VMLINUX_H),)
|
|
$(call msg,GEN,,$@)
|
|
$(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $(INCLUDE_DIR)/.vmlinux.h.tmp
|
|
$(Q)cmp -s $(INCLUDE_DIR)/.vmlinux.h.tmp $@ || mv $(INCLUDE_DIR)/.vmlinux.h.tmp $@
|
|
else
|
|
$(call msg,CP,,$@)
|
|
$(Q)cp "$(VMLINUX_H)" $@
|
|
endif
|
|
|
|
$(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids \
|
|
$(TOOLSDIR)/bpf/resolve_btfids/main.c \
|
|
$(TOOLSDIR)/lib/rbtree.c \
|
|
$(TOOLSDIR)/lib/zalloc.c \
|
|
$(TOOLSDIR)/lib/string.c \
|
|
$(TOOLSDIR)/lib/ctype.c \
|
|
$(TOOLSDIR)/lib/str_error_r.c
|
|
$(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \
|
|
CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" \
|
|
LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \
|
|
EXTRA_LDFLAGS='$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' \
|
|
HOSTPKG_CONFIG='$(PKG_CONFIG)' \
|
|
OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ)
|
|
|
|
# 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.
|
|
define get_sys_includes
|
|
$(shell $(1) $(2) -v -E - </dev/null 2>&1 \
|
|
| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
|
|
$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}') \
|
|
$(shell $(1) $(2) -dM -E - </dev/null | grep '__loongarch_grlen ' | awk '{printf("-D__BITS_PER_LONG=%d", $$3)}') \
|
|
$(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)}')
|
|
endef
|
|
|
|
# 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)
|
|
BPF_TARGET_ENDIAN:=$(if $(IS_LITTLE_ENDIAN),--target=bpfel,--target=bpfeb)
|
|
|
|
ifneq ($(CROSS_COMPILE),)
|
|
CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))
|
|
endif
|
|
|
|
CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
|
|
BPF_CFLAGS = -g -Wall -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \
|
|
-I$(INCLUDE_DIR) -I$(CURDIR) -I$(APIDIR) \
|
|
-I$(TOOLSINCDIR) -I$(CURDIR)/libarena/include \
|
|
-I$(abspath $(OUTPUT)/../usr/include) \
|
|
-std=gnu11 \
|
|
-fno-strict-aliasing \
|
|
-Wno-microsoft-anon-tag \
|
|
-fms-extensions \
|
|
-Wno-compare-distinct-pointer-types \
|
|
-Wno-initializer-overrides \
|
|
#
|
|
# TODO: enable me -Wsign-compare
|
|
|
|
CLANG_CFLAGS = $(CLANG_SYS_INCLUDES)
|
|
|
|
$(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline
|
|
$(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline
|
|
|
|
$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h
|
|
$(OUTPUT)/cgroup_getset_retval_hooks.o: cgroup_getset_retval_hooks.h
|
|
|
|
# Build BPF object using Clang
|
|
# $1 - input .c file
|
|
# $2 - output .o file
|
|
# $3 - CFLAGS
|
|
# $4 - binary name
|
|
define CLANG_BPF_BUILD_RULE
|
|
$(call msg,CLNG-BPF,$4,$2)
|
|
$(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v3 -o $2 $(if $(PERMISSIVE),|| \
|
|
($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2))
|
|
endef
|
|
# Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32
|
|
define CLANG_NOALU32_BPF_BUILD_RULE
|
|
$(call msg,CLNG-BPF,$4,$2)
|
|
$(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v2 -o $2 $(if $(PERMISSIVE),|| \
|
|
($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2))
|
|
endef
|
|
# Similar to CLANG_BPF_BUILD_RULE, but with cpu-v4
|
|
define CLANG_CPUV4_BPF_BUILD_RULE
|
|
$(call msg,CLNG-BPF,$4,$2)
|
|
$(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v4 -o $2 $(if $(PERMISSIVE),|| \
|
|
($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2))
|
|
endef
|
|
# Build BPF object using GCC
|
|
define GCC_BPF_BUILD_RULE
|
|
$(call msg,GCC-BPF,$4,$2)
|
|
$(Q)$(BPF_GCC) $3 -DBPF_NO_PRESERVE_ACCESS_INDEX -Wno-attributes -O2 -c $1 -o $2 $(if $(PERMISSIVE),|| \
|
|
($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2))
|
|
endef
|
|
|
|
SKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c
|
|
|
|
LINKED_SKELS := test_static_linked.skel.h linked_funcs.skel.h \
|
|
linked_vars.skel.h linked_maps.skel.h \
|
|
test_subskeleton.skel.h test_subskeleton_lib.skel.h \
|
|
test_usdt.skel.h tracing_multi.skel.h \
|
|
tracing_multi_module.skel.h \
|
|
tracing_multi_intersect.skel.h \
|
|
tracing_multi_session.skel.h
|
|
|
|
LSKELS := fexit_sleep.c trace_printk.c trace_vprintk.c map_ptr_kern.c \
|
|
core_kern.c core_kern_overflow.c test_ringbuf.c \
|
|
test_ringbuf_n.c test_ringbuf_map_key.c test_ringbuf_write.c \
|
|
test_ringbuf_overwrite.c
|
|
|
|
LSKELS_SIGNED := fentry_test.c fexit_test.c atomics.c
|
|
|
|
# Generate both light skeleton and libbpf skeleton for these
|
|
LSKELS_EXTRA := test_ksyms_module.c test_ksyms_weak.c kfunc_call_test.c \
|
|
kfunc_call_test_subprog.c test_global_percpu_data.c
|
|
SKEL_BLACKLIST += $$(LSKELS) $$(LSKELS_SIGNED)
|
|
|
|
test_static_linked.skel.h-deps := test_static_linked1.bpf.o test_static_linked2.bpf.o
|
|
linked_funcs.skel.h-deps := linked_funcs1.bpf.o linked_funcs2.bpf.o
|
|
linked_vars.skel.h-deps := linked_vars1.bpf.o linked_vars2.bpf.o
|
|
linked_maps.skel.h-deps := linked_maps1.bpf.o linked_maps2.bpf.o
|
|
# In the subskeleton case, we want the test_subskeleton_lib.subskel.h file
|
|
# but that's created as a side-effect of the skel.h generation.
|
|
test_subskeleton.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o test_subskeleton.bpf.o
|
|
test_subskeleton_lib.skel.h-deps := test_subskeleton_lib2.bpf.o test_subskeleton_lib.bpf.o
|
|
test_usdt.skel.h-deps := test_usdt.bpf.o test_usdt_multispec.bpf.o
|
|
xsk_xdp_progs.skel.h-deps := xsk_xdp_progs.bpf.o
|
|
xdp_hw_metadata.skel.h-deps := xdp_hw_metadata.bpf.o
|
|
xdp_features.skel.h-deps := xdp_features.bpf.o
|
|
tracing_multi.skel.h-deps := tracing_multi_attach.bpf.o tracing_multi_check.bpf.o
|
|
tracing_multi_module.skel.h-deps := tracing_multi_attach_module.bpf.o tracing_multi_check.bpf.o
|
|
tracing_multi_intersect.skel.h-deps := tracing_multi_intersect_attach.bpf.o tracing_multi_check.bpf.o
|
|
tracing_multi_session.skel.h-deps := tracing_multi_session_attach.bpf.o tracing_multi_check.bpf.o
|
|
|
|
LINKED_BPF_OBJS := $(foreach skel,$(LINKED_SKELS),$($(skel)-deps))
|
|
LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.c,$(LINKED_BPF_OBJS))
|
|
|
|
HEADERS_FOR_BPF_OBJS := $(wildcard $(BPFDIR)/*.bpf.h) \
|
|
$(wildcard $(CURDIR)/libarena/include/*.[ch]) \
|
|
$(addprefix $(BPFDIR)/, bpf_core_read.h \
|
|
bpf_endian.h \
|
|
bpf_helpers.h \
|
|
bpf_tracing.h)
|
|
|
|
# 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)
|
|
# $2 - test runner extra "flavor" (e.g., no_alu32, cpuv4, bpf_gcc, etc)
|
|
define DEFINE_TEST_RUNNER
|
|
|
|
LSKEL_SIGN := -S -k $(PRIVATE_KEY) -i $(VERIFICATION_CERT)
|
|
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_LIB_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \
|
|
$$(filter %.c,$(TRUNNER_LIB_SOURCES)))
|
|
TRUNNER_EXTRA_HDRS := $$(filter %.h,$(TRUNNER_EXTRA_SOURCES))
|
|
TRUNNER_TESTS_HDR := $(TRUNNER_TESTS_DIR)/tests.h
|
|
TRUNNER_BPF_SRCS := $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c))
|
|
TRUNNER_BPF_OBJS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.bpf.o, $$(TRUNNER_BPF_SRCS))
|
|
TRUNNER_BPF_SKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.skel.h, \
|
|
$$(filter-out $(SKEL_BLACKLIST) $(LINKED_BPF_SRCS),\
|
|
$$(TRUNNER_BPF_SRCS)))
|
|
TRUNNER_BPF_LSKELS := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.lskel.h, $$(LSKELS) $$(LSKELS_EXTRA))
|
|
TRUNNER_BPF_SKELS_LINKED := $$(addprefix $$(TRUNNER_OUTPUT)/,$(LINKED_SKELS))
|
|
TRUNNER_BPF_LSKELS_SIGNED := $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.lskel.h, $$(LSKELS_SIGNED))
|
|
TEST_GEN_FILES += $$(TRUNNER_BPF_OBJS)
|
|
|
|
# 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)
|
|
# $2 - test runner extra "flavor" (e.g., no_alu32, cpuv4, bpf_gcc, etc)
|
|
define DEFINE_TEST_RUNNER_RULES
|
|
|
|
# Permissive build behaviour (skip-on-failure compile, partial-link) only
|
|
# applies to test_progs and its flavors; runners that use strong cross-object
|
|
# references (e.g. test_maps) keep strict semantics even when permissive.
|
|
# The check is inlined per-runner so $1 is substituted at $(call) time and
|
|
# the result is baked into each rule's recipe.
|
|
|
|
ifeq ($($(TRUNNER_OUTPUT)-dir),)
|
|
$(TRUNNER_OUTPUT)-dir := y
|
|
$(TRUNNER_OUTPUT):
|
|
$$(call msg,MKDIR,,$$@)
|
|
$(Q)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)/%.bpf.o: \
|
|
$(TRUNNER_BPF_PROGS_DIR)/%.c \
|
|
$(TRUNNER_BPF_PROGS_DIR)/*.h \
|
|
$$(INCLUDE_DIR)/vmlinux.h \
|
|
$(HEADERS_FOR_BPF_OBJS) \
|
|
| $(TRUNNER_OUTPUT) $$(BPFOBJ)
|
|
$$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@, \
|
|
$(TRUNNER_BPF_CFLAGS) \
|
|
$$($$<-CFLAGS) \
|
|
$$($$<-$2-CFLAGS),$(TRUNNER_BINARY))
|
|
|
|
$(TRUNNER_BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
|
|
$(Q)$(if $(PERMISSIVE),if [ ! -f $$< ]; then \
|
|
$$(RM) $$@ $$(@:.skel.h=.subskel.h); \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
exit 0; \
|
|
fi;) \
|
|
printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY)] $$(notdir $$@)' 1>&2; \
|
|
$$(BPFTOOL) gen object $$(<:.o=.linked1.o) $$< && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.linked2.o) $$(<:.o=.linked1.o) && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.linked3.o) $$(<:.o=.linked2.o) && \
|
|
diff $$(<:.o=.linked2.o) $$(<:.o=.linked3.o) && \
|
|
$$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$@ && \
|
|
$$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$(@:.skel.h=.subskel.h) $(if $(PERMISSIVE),|| { \
|
|
$$(RM) $$@ $$(@:.skel.h=.subskel.h); \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
}) && \
|
|
rm -f $$(<:.o=.linked1.o) $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
|
|
|
|
$(TRUNNER_BPF_LSKELS): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
|
|
$(Q)$(if $(PERMISSIVE),if [ ! -f $$< ]; then \
|
|
$$(RM) $$@; \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
exit 0; \
|
|
fi;) \
|
|
printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY)] $$(notdir $$@)' 1>&2; \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$< && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o) && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o) && \
|
|
diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o) && \
|
|
$$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@ $(if $(PERMISSIVE),|| { \
|
|
$$(RM) $$@; \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
}) && \
|
|
rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
|
|
|
|
$(TRUNNER_BPF_LSKELS_SIGNED): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
|
|
$(Q)$(if $(PERMISSIVE),if [ ! -f $$< ]; then \
|
|
$$(RM) $$@; \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
exit 0; \
|
|
fi;) \
|
|
printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY) (signed)] $$(notdir $$@)' 1>&2; \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$< && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o) && \
|
|
$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o) && \
|
|
diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o) && \
|
|
$$(BPFTOOL) gen skeleton $(LSKEL_SIGN) $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@ $(if $(PERMISSIVE),|| { \
|
|
$$(RM) $$@; \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
}) && \
|
|
rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
|
|
|
|
$(LINKED_BPF_OBJS): %: $(TRUNNER_OUTPUT)/%
|
|
|
|
# .SECONDEXPANSION here allows to correctly expand %-deps variables as prerequisites
|
|
.SECONDEXPANSION:
|
|
$(TRUNNER_BPF_SKELS_LINKED): $(TRUNNER_OUTPUT)/%: $$$$(%-deps) $(BPFTOOL) | $(TRUNNER_OUTPUT)
|
|
$(Q)$(if $(PERMISSIVE),for f in $$(addprefix $(TRUNNER_OUTPUT)/,$$($$(@F)-deps)); do \
|
|
if [ ! -f $$$$f ]; then \
|
|
$$(RM) $$@ $$(@:.skel.h=.subskel.h); \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
exit 0; \
|
|
fi; \
|
|
done;) \
|
|
printf ' %-12s %s\n' 'LINK-BPF' '[$(TRUNNER_BINARY)] $$(notdir $$(@:.skel.h=.bpf.o))' 1>&2; \
|
|
$$(BPFTOOL) gen object $$(@:.skel.h=.linked1.o) $$(addprefix $(TRUNNER_OUTPUT)/,$$($$(@F)-deps)) && \
|
|
$$(BPFTOOL) gen object $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked1.o) && \
|
|
$$(BPFTOOL) gen object $$(@:.skel.h=.linked3.o) $$(@:.skel.h=.linked2.o) && \
|
|
diff $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked3.o) && \
|
|
printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY)] $$(notdir $$@)' 1>&2 && \
|
|
$$(BPFTOOL) gen skeleton $$(@:.skel.h=.linked3.o) name $$(notdir $$(@:.skel.h=)) > $$@ && \
|
|
$$(BPFTOOL) gen subskeleton $$(@:.skel.h=.linked3.o) name $$(notdir $$(@:.skel.h=)) > $$(@:.skel.h=.subskel.h) $(if $(PERMISSIVE),|| { \
|
|
$$(RM) $$@ $$(@:.skel.h=.subskel.h); \
|
|
printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
|
|
}) && \
|
|
rm -f $$(@:.skel.h=.linked1.o) $$(@:.skel.h=.linked2.o) $$(@:.skel.h=.linked3.o)
|
|
|
|
# When the compiler generates a %.d file, only skel basenames (not
|
|
# full paths) are specified as prerequisites for corresponding %.o
|
|
# file. vpath directives below instruct make to search for skel files
|
|
# in TRUNNER_OUTPUT, if they are not present in the working directory.
|
|
vpath %.skel.h $(TRUNNER_OUTPUT)
|
|
vpath %.lskel.h $(TRUNNER_OUTPUT)
|
|
vpath %.subskel.h $(TRUNNER_OUTPUT)
|
|
|
|
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
|
|
$$(call msg,TEST-HDR,$(TRUNNER_BINARY),$$@)
|
|
$$(shell (echo '/* Generated header, do not edit */'; \
|
|
sed -n -E 's/^void (serial_)?test_([a-zA-Z0-9_]+)\((void)?\).*/DEFINE_TEST(\2)/p' \
|
|
$(TRUNNER_TESTS_DIR)/*.c | sort ; \
|
|
) > $$@)
|
|
endif
|
|
|
|
$(TRUNNER_OUTPUT)/resolve_btfids.test.o: $(RESOLVE_BTFIDS) $(TRUNNER_OUTPUT)/btf_data.bpf.o
|
|
$(TRUNNER_OUTPUT)/resolve_btfids.test.o: private TEST_NEEDS_BTFIDS = 1
|
|
|
|
# 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_OUTPUT)/%.test.d
|
|
$$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@)
|
|
$(Q)(cd $$(@D) && $$(CC) -I. $$(CFLAGS) -MMD -MT $$@ -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)) $(if $(filter test_progs%,$1),$(if $(PERMISSIVE),|| \
|
|
($(RM) $$@; printf ' %-12s %s\n' 'SKIP-TEST' '$$(notdir $$@)' 1>&2)))
|
|
$$(if $$(TEST_NEEDS_BTFIDS), \
|
|
$(Q)if [ -f $$@ ]; then \
|
|
$(if $(filter 1,$(V)),true,printf ' %-8s%s %s\n' "BTFIDS" " [$(TRUNNER_BINARY)]" "$$(notdir $$@)"); \
|
|
$(RESOLVE_BTFIDS) --btf $(TRUNNER_OUTPUT)/btf_data.bpf.o $$@; \
|
|
$(RESOLVE_BTFIDS) --patch_btfids $$@.BTF_ids $$@; \
|
|
fi)
|
|
|
|
$(TRUNNER_TEST_OBJS:.o=.d): $(TRUNNER_OUTPUT)/%.test.d: \
|
|
$(TRUNNER_TESTS_DIR)/%.c \
|
|
$(TRUNNER_EXTRA_HDRS) \
|
|
$$(BPFOBJ) | $(TRUNNER_OUTPUT) \
|
|
$(TRUNNER_BPF_SKELS) \
|
|
$(TRUNNER_BPF_LSKELS) \
|
|
$(TRUNNER_BPF_LSKELS_SIGNED) \
|
|
$(TRUNNER_BPF_SKELS_LINKED)
|
|
|
|
ifeq ($(filter clean docs-clean emit_tests,$(MAKECMDGOALS)),)
|
|
include $(wildcard $(TRUNNER_TEST_OBJS:.o=.d))
|
|
endif
|
|
|
|
# add per extra obj CFGLAGS definitions
|
|
$(foreach N,$(patsubst $(TRUNNER_OUTPUT)/%.o,%,$(TRUNNER_EXTRA_OBJS)), \
|
|
$(eval $(TRUNNER_OUTPUT)/$(N).o: CFLAGS += $($(N).c-CFLAGS)))
|
|
|
|
$(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \
|
|
%.c \
|
|
$(TRUNNER_EXTRA_HDRS) \
|
|
$(VERIFY_SIG_HDR) \
|
|
$(TRUNNER_TESTS_HDR) \
|
|
$$(BPFOBJ) | $(TRUNNER_OUTPUT)
|
|
$$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@)
|
|
$(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
|
|
|
|
$(TRUNNER_LIB_OBJS): $(TRUNNER_OUTPUT)/%.o:$(TOOLSDIR)/lib/%.c
|
|
$$(call msg,LIB-OBJ,$(TRUNNER_BINARY),$$@)
|
|
$(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@
|
|
|
|
# non-flavored in-srctree builds receive special treatment, in particular, we
|
|
# do not need to copy extra resources (see e.g. test_btf_dump_case())
|
|
$(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT)
|
|
ifneq ($2:$(OUTPUT),:$(shell pwd))
|
|
$$(call msg,EXT-COPY,$(TRUNNER_BINARY),$(TRUNNER_EXTRA_FILES))
|
|
$(Q)rsync -aq $(if $(PERMISSIVE),--ignore-missing-args) $$^ $(TRUNNER_OUTPUT)/
|
|
endif
|
|
|
|
# some X.test.o files have runtime dependencies on Y.bpf.o files
|
|
$(OUTPUT)/$(TRUNNER_BINARY): | $(TRUNNER_BPF_OBJS)
|
|
|
|
$(OUTPUT)/$(TRUNNER_BINARY): $(if $(filter test_progs%,$1),$(if $(PERMISSIVE),$$(wildcard $(TRUNNER_TEST_OBJS)),$(TRUNNER_TEST_OBJS)),$(TRUNNER_TEST_OBJS)) \
|
|
$(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \
|
|
$(TRUNNER_LIB_OBJS) \
|
|
$(TRUNNER_BPFTOOL) \
|
|
$(OUTPUT)/veristat \
|
|
| $(TRUNNER_BINARY)-extras \
|
|
$(if $(filter test_progs%,$1),$(if $(PERMISSIVE),$(TRUNNER_TEST_OBJS)))
|
|
$$(call msg,BINARY,,$$@)
|
|
$(Q)$$(CC) $$(CFLAGS) $(if $(filter test_progs%,$1),$(if $(PERMISSIVE),$$(filter %.a %.o,$$(wildcard $(TRUNNER_TEST_OBJS)) $$(filter-out $(TRUNNER_TEST_OBJS),$$^)),$$(filter %.a %.o,$$^)),$$(filter %.a %.o,$$^)) $$(LDLIBS) $$(LLVM_LDLIBS) $$(LDFLAGS) $$(LLVM_LDFLAGS) -o $$@
|
|
$(Q)ln -sf $(if $2,..,.)/tools/build/bpftool/$(USE_BOOTSTRAP)bpftool \
|
|
$(OUTPUT)/$(if $2,$2/)bpftool
|
|
|
|
endef
|
|
|
|
VERIFY_SIG_SETUP := $(CURDIR)/verify_sig_setup.sh
|
|
VERIFY_SIG_HDR := verification_cert.h
|
|
VERIFICATION_CERT := $(BUILD_DIR)/signing_key.der
|
|
PRIVATE_KEY := $(BUILD_DIR)/signing_key.pem
|
|
|
|
$(VERIFICATION_CERT) $(PRIVATE_KEY): $(VERIFY_SIG_SETUP)
|
|
$(Q)mkdir -p $(BUILD_DIR)
|
|
$(Q)$(VERIFY_SIG_SETUP) genkey $(BUILD_DIR)
|
|
|
|
# Generates a header with C array declaration, containing test_progs_verification_cert bytes
|
|
$(VERIFY_SIG_HDR): $(VERIFICATION_CERT)
|
|
$(Q)(echo "unsigned char test_progs_verification_cert[] = {"; \
|
|
od -v -t 'xC' -w12 $< | sed 's/ \(\S\+\)/ 0x\1,/g;s/^\S\+/ /;$$d'; \
|
|
echo "};"; \
|
|
echo "unsigned int test_progs_verification_cert_len = $$(wc -c < $<);") > $@
|
|
|
|
LIBARENA_MAKE_ARGS = \
|
|
BPFTOOL="$(BPFTOOL)" \
|
|
INCLUDE_DIR="$(INCLUDE_DIR)" \
|
|
LIBBPF_INCLUDE="$(HOST_INCLUDE_DIR)" \
|
|
BPFOBJ="$(BPFOBJ)" \
|
|
LDLIBS="$(LDLIBS) -lzstd" \
|
|
CLANG="$(CLANG)" \
|
|
BPF_CFLAGS="$(BPF_CFLAGS) $(CLANG_CFLAGS)" \
|
|
BPF_TARGET_ENDIAN="$(BPF_TARGET_ENDIAN)" \
|
|
Q="$(Q)"
|
|
|
|
LIBARENA_BPF_DEPS := $(wildcard libarena/Makefile \
|
|
libarena/include/* \
|
|
libarena/include/libarena/* \
|
|
libarena/src/* \
|
|
libarena/selftests/* \
|
|
libarena/*.bpf.o)
|
|
|
|
LIBARENA_SKEL := libarena/libarena.skel.h
|
|
|
|
$(LIBARENA_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BPF_DEPS)
|
|
+$(MAKE) -C libarena libarena.skel.h $(LIBARENA_MAKE_ARGS)
|
|
|
|
ifneq ($(CLANG_HAS_ARENA_ASAN),)
|
|
LIBARENA_ASAN_SKEL := libarena/libarena_asan.skel.h
|
|
CFLAGS += -DHAS_BPF_ARENA_ASAN
|
|
|
|
$(LIBARENA_ASAN_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BPF_DEPS)
|
|
+$(MAKE) -C libarena libarena_asan.skel.h $(LIBARENA_MAKE_ARGS)
|
|
endif
|
|
|
|
# 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 \
|
|
network_helpers.c \
|
|
testing_helpers.c \
|
|
btf_helpers.c \
|
|
cap_helpers.c \
|
|
unpriv_helpers.c \
|
|
sysctl_helpers.c \
|
|
netlink_helpers.c \
|
|
jit_disasm_helpers.c \
|
|
io_helpers.c \
|
|
test_loader.c \
|
|
xsk.c \
|
|
disasm.c \
|
|
disasm_helpers.c \
|
|
json_writer.c \
|
|
$(VERIFY_SIG_HDR) \
|
|
flow_dissector_load.h \
|
|
ip_check_defrag_frags.h \
|
|
bpftool_helpers.c \
|
|
usdt_1.c usdt_2.c \
|
|
$(LIBARENA_SKEL) \
|
|
$(LIBARENA_ASAN_SKEL)
|
|
TRUNNER_LIB_SOURCES := find_bit.c
|
|
TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read \
|
|
$(OUTPUT)/liburandom_read.so \
|
|
$(OUTPUT)/xdp_synproxy \
|
|
$(OUTPUT)/sign-file \
|
|
$(OUTPUT)/uprobe_multi \
|
|
$(TEST_KMOD_TARGETS) \
|
|
ima_setup.sh \
|
|
$(VERIFY_SIG_SETUP) \
|
|
$(wildcard progs/btf_dump_test_case_*.c) \
|
|
$(wildcard progs/*.bpf.o)
|
|
TRUNNER_BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
|
|
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) -DENABLE_ATOMICS_TESTS
|
|
$(eval $(call DEFINE_TEST_RUNNER,test_progs))
|
|
|
|
# Define test_progs-no_alu32 test runner.
|
|
TRUNNER_BPF_BUILD_RULE := CLANG_NOALU32_BPF_BUILD_RULE
|
|
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS)
|
|
$(eval $(call DEFINE_TEST_RUNNER,test_progs,no_alu32))
|
|
|
|
# Define test_progs-cpuv4 test runner.
|
|
ifneq ($(CLANG_CPUV4),)
|
|
TRUNNER_BPF_BUILD_RULE := CLANG_CPUV4_BPF_BUILD_RULE
|
|
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(CLANG_CFLAGS) -DENABLE_ATOMICS_TESTS
|
|
$(eval $(call DEFINE_TEST_RUNNER,test_progs,cpuv4))
|
|
endif
|
|
|
|
# Define test_progs BPF-GCC-flavored test runner.
|
|
ifneq ($(BPF_GCC),)
|
|
TRUNNER_BPF_BUILD_RULE := GCC_BPF_BUILD_RULE
|
|
TRUNNER_BPF_CFLAGS := $(BPF_CFLAGS) $(call get_sys_includes,gcc,)
|
|
$(eval $(call DEFINE_TEST_RUNNER,test_progs,bpf_gcc))
|
|
endif
|
|
|
|
# Define test_maps test runner.
|
|
TRUNNER_TESTS_DIR := map_tests
|
|
TRUNNER_BPF_PROGS_DIR := progs
|
|
TRUNNER_EXTRA_SOURCES := test_maps.c
|
|
TRUNNER_LIB_SOURCES :=
|
|
TRUNNER_EXTRA_FILES :=
|
|
TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects should be built)
|
|
TRUNNER_BPF_CFLAGS :=
|
|
$(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
|
|
$(shell ( cd verifier/; \
|
|
echo '/* Generated header, do not edit */'; \
|
|
echo '#ifdef FILL_ARRAY'; \
|
|
ls *.c 2> /dev/null | sed -e 's@\(.*\)@#include \"\1\"@'; \
|
|
echo '#endif' \
|
|
) > verifier/tests.h)
|
|
$(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
|
|
|
|
# Keep xskxceiver independent from test_progs object dependencies.
|
|
$(OUTPUT)/xskxceiver: xskxceiver.c xsk.c network_helpers.c \
|
|
$(TOOLSDIR)/lib/find_bit.c prog_tests/test_xsk.c \
|
|
xskxceiver.h xsk.h network_helpers.h \
|
|
prog_tests/test_xsk.h test_progs.h bpf_util.h \
|
|
$(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT)
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
|
|
|
|
$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c xsk.c network_helpers.c \
|
|
$(TOOLSDIR)/lib/find_bit.c xdp_metadata.h \
|
|
xsk.h network_helpers.h test_progs.h bpf_util.h \
|
|
$(OUTPUT)/xdp_hw_metadata.skel.h $(BPFOBJ) | $(OUTPUT)
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
|
|
|
|
$(OUTPUT)/xdp_features: xdp_features.c network_helpers.c xdp_features.h \
|
|
network_helpers.h \
|
|
test_progs.h bpf_util.h $(OUTPUT)/xdp_features.skel.h \
|
|
$(BPFOBJ) | $(OUTPUT)
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
|
|
|
|
# Make sure we are able to include and link libbpf against c++.
|
|
CXXFLAGS += $(CFLAGS)
|
|
CXXFLAGS := $(subst -D_GNU_SOURCE=,,$(CXXFLAGS))
|
|
CXXFLAGS := $(subst -std=gnu11,-std=gnu++11,$(CXXFLAGS))
|
|
$(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ)
|
|
$(call msg,CXX,,$@)
|
|
$(Q)$(CXX) $(CXXFLAGS) $(filter %.a %.o %.cpp,$^) $(LDLIBS) -o $@
|
|
|
|
# Benchmark runner
|
|
$(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h $(BPFOBJ)
|
|
$(call msg,CC,,$@)
|
|
$(Q)$(CC) $(CFLAGS) -O2 -c $(filter %.c,$^) $(LDLIBS) -o $@ $(if $(PERMISSIVE),|| \
|
|
($(RM) $@; printf ' %-12s %s\n' 'SKIP-BENCH' '$(notdir $@)' 1>&2))
|
|
$(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h
|
|
$(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h
|
|
$(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \
|
|
$(OUTPUT)/perfbuf_bench.skel.h
|
|
$(OUTPUT)/bench_bloom_filter_map.o: $(OUTPUT)/bloom_filter_bench.skel.h
|
|
$(OUTPUT)/bench_bpf_loop.o: $(OUTPUT)/bpf_loop_bench.skel.h
|
|
$(OUTPUT)/bench_bpf_for.o: $(OUTPUT)/bpf_for_bench.skel.h
|
|
$(OUTPUT)/bench_strncmp.o: $(OUTPUT)/strncmp_bench.skel.h
|
|
$(OUTPUT)/bench_bpf_hashmap_full_update.o: $(OUTPUT)/bpf_hashmap_full_update_bench.skel.h
|
|
$(OUTPUT)/bench_local_storage.o: $(OUTPUT)/local_storage_bench.skel.h
|
|
$(OUTPUT)/bench_local_storage_rcu_tasks_trace.o: $(OUTPUT)/local_storage_rcu_tasks_trace_bench.skel.h
|
|
$(OUTPUT)/bench_local_storage_create.o: $(OUTPUT)/bench_local_storage_create.skel.h
|
|
$(OUTPUT)/bench_bpf_hashmap_lookup.o: $(OUTPUT)/bpf_hashmap_lookup.skel.h
|
|
$(OUTPUT)/bench_htab_mem.o: $(OUTPUT)/htab_mem_bench.skel.h
|
|
$(OUTPUT)/bench_bpf_crypto.o: $(OUTPUT)/crypto_bench.skel.h
|
|
$(OUTPUT)/bench_sockmap.o: $(OUTPUT)/bench_sockmap_prog.skel.h
|
|
$(OUTPUT)/bench_lpm_trie_map.o: $(OUTPUT)/lpm_trie_bench.skel.h $(OUTPUT)/lpm_trie_map.skel.h
|
|
$(OUTPUT)/bench_bpf_nop.o: $(OUTPUT)/bpf_nop_bench.skel.h bench_bpf_timing.h
|
|
$(OUTPUT)/bench_xdp_lb.o: $(OUTPUT)/xdp_lb_bench.skel.h bench_bpf_timing.h
|
|
$(OUTPUT)/bench_bpf_timing.o: bench_bpf_timing.h
|
|
$(OUTPUT)/bench.o: bench.h testing_helpers.h $(BPFOBJ)
|
|
$(OUTPUT)/bench: LDLIBS += -lm
|
|
$(OUTPUT)/bench: $(OUTPUT)/bench.o \
|
|
$(TESTING_HELPERS) \
|
|
$(TRACE_HELPERS) \
|
|
$(CGROUP_HELPERS) \
|
|
$(OUTPUT)/bench_count.o \
|
|
$(OUTPUT)/bench_rename.o \
|
|
$(OUTPUT)/bench_trigger.o \
|
|
$(OUTPUT)/bench_ringbufs.o \
|
|
$(OUTPUT)/bench_bloom_filter_map.o \
|
|
$(OUTPUT)/bench_bpf_loop.o \
|
|
$(OUTPUT)/bench_bpf_for.o \
|
|
$(OUTPUT)/bench_strncmp.o \
|
|
$(OUTPUT)/bench_bpf_hashmap_full_update.o \
|
|
$(OUTPUT)/bench_local_storage.o \
|
|
$(OUTPUT)/bench_local_storage_rcu_tasks_trace.o \
|
|
$(OUTPUT)/bench_bpf_hashmap_lookup.o \
|
|
$(OUTPUT)/bench_local_storage_create.o \
|
|
$(OUTPUT)/bench_htab_mem.o \
|
|
$(OUTPUT)/bench_bpf_crypto.o \
|
|
$(OUTPUT)/bench_sockmap.o \
|
|
$(OUTPUT)/bench_lpm_trie_map.o \
|
|
$(OUTPUT)/bench_bpf_timing.o \
|
|
$(OUTPUT)/bench_bpf_nop.o \
|
|
$(OUTPUT)/bench_xdp_lb.o \
|
|
$(OUTPUT)/usdt_1.o \
|
|
$(OUTPUT)/usdt_2.o \
|
|
#
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ $(if $(PERMISSIVE),|| \
|
|
($(RM) $@; printf ' %-12s %s\n' 'SKIP-LINK' '$(notdir $@) (some benchmarks may have been skipped)' 1>&2))
|
|
|
|
# This works around GCC warning about snprintf truncating strings like:
|
|
#
|
|
# char a[PATH_MAX], b[PATH_MAX];
|
|
# snprintf(a, "%s/foo", b); // triggers -Wformat-truncation
|
|
$(OUTPUT)/veristat.o: CFLAGS += -Wno-format-truncation
|
|
$(OUTPUT)/veristat.o: $(BPFOBJ)
|
|
$(OUTPUT)/veristat: $(OUTPUT)/veristat.o
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
|
|
|
|
# Linking uprobe_multi can fail due to relocation overflows on mips.
|
|
$(OUTPUT)/uprobe_multi: CFLAGS += $(if $(filter mips, $(ARCH)),-mxgot)
|
|
$(OUTPUT)/uprobe_multi: uprobe_multi.c uprobe_multi.ld
|
|
$(call msg,BINARY,,$@)
|
|
$(Q)$(CC) $(CFLAGS) -Wl,-T,uprobe_multi.ld -O0 $(LDFLAGS) \
|
|
$(filter-out %.ld,$^) $(LDLIBS) -o $@
|
|
|
|
EXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) \
|
|
prog_tests/tests.h map_tests/tests.h verifier/tests.h \
|
|
feature bpftool $(TEST_KMOD_TARGETS) \
|
|
$(addprefix $(OUTPUT)/,*.o *.d *.skel.h *.lskel.h *.subskel.h \
|
|
*.BTF *.BTF_ids *.BTF.base \
|
|
no_alu32 cpuv4 bpf_gcc \
|
|
liburandom_read.so) \
|
|
$(OUTPUT)/FEATURE-DUMP.selftests
|
|
|
|
.PHONY: docs docs-clean
|
|
|
|
# Delete partially updated (corrupted) files on error
|
|
.DELETE_ON_ERROR:
|
|
|
|
# When permissive, tell rsync to ignore missing source arguments so that
|
|
# partial builds do not abort installation.
|
|
ifneq ($(PERMISSIVE),)
|
|
override define INSTALL_SINGLE_RULE
|
|
$(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
|
|
$(if $(INSTALL_LIST),rsync -a --copy-unsafe-links --ignore-missing-args $(INSTALL_LIST) $(INSTALL_PATH)/)
|
|
endef
|
|
endif
|
|
|
|
DEFAULT_INSTALL_RULE := $(INSTALL_RULE)
|
|
override define INSTALL_RULE
|
|
$(DEFAULT_INSTALL_RULE)
|
|
@mkdir -p $(INSTALL_PATH)/tools/sbin
|
|
@rsync -a $(if $(PERMISSIVE),--ignore-missing-args) $(TRUNNER_BPFTOOL) $(INSTALL_PATH)/tools/sbin/
|
|
@rsync -a $(if $(PERMISSIVE),--ignore-missing-args) $(OUTPUT)/*.BTF $(INSTALL_PATH)/
|
|
@for DIR in $(TEST_INST_SUBDIRS); do \
|
|
mkdir -p $(INSTALL_PATH)/$$DIR; \
|
|
rsync -a $(if $(PERMISSIVE),--ignore-missing-args) \
|
|
$(OUTPUT)/$$DIR/*.bpf.o $(OUTPUT)/$$DIR/*.BTF \
|
|
$(INSTALL_PATH)/$$DIR; \
|
|
done
|
|
endef
|
|
|
|
libarena: $(LIBARENA_SKEL)
|
|
|
|
ifneq ($(CLANG_HAS_ARENA_ASAN),)
|
|
libarena_asan: $(LIBARENA_ASAN_SKEL)
|
|
endif
|