cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

Makefile (22997B)


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