xref: /linux/tools/testing/selftests/sched_ext/Makefile (revision 2487b6b9bf2874cfca7efb59c95650c5b1d88d43)
1a5db7817SDavid Vernet# SPDX-License-Identifier: GPL-2.0
2a5db7817SDavid Vernet# Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
3a5db7817SDavid Vernetinclude ../../../build/Build.include
4a5db7817SDavid Vernetinclude ../../../scripts/Makefile.arch
5a5db7817SDavid Vernetinclude ../../../scripts/Makefile.include
67941b83bSBjörn Töpel
77941b83bSBjörn TöpelTEST_GEN_PROGS := runner
87941b83bSBjörn Töpel
97941b83bSBjörn Töpel# override lib.mk's default rules
107941b83bSBjörn TöpelOVERRIDE_TARGETS := 1
11a5db7817SDavid Vernetinclude ../lib.mk
12a5db7817SDavid Vernet
13a5db7817SDavid VernetCURDIR := $(abspath .)
14a5db7817SDavid VernetREPOROOT := $(abspath ../../../..)
15a5db7817SDavid VernetTOOLSDIR := $(REPOROOT)/tools
16a5db7817SDavid VernetLIBDIR := $(TOOLSDIR)/lib
17a5db7817SDavid VernetBPFDIR := $(LIBDIR)/bpf
18a5db7817SDavid VernetTOOLSINCDIR := $(TOOLSDIR)/include
19a5db7817SDavid VernetBPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
20a5db7817SDavid VernetAPIDIR := $(TOOLSINCDIR)/uapi
21a5db7817SDavid VernetGENDIR := $(REPOROOT)/include/generated
22a5db7817SDavid VernetGENHDR := $(GENDIR)/autoconf.h
23a5db7817SDavid VernetSCXTOOLSDIR := $(TOOLSDIR)/sched_ext
24a5db7817SDavid VernetSCXTOOLSINCDIR := $(TOOLSDIR)/sched_ext/include
25a5db7817SDavid Vernet
267941b83bSBjörn TöpelOUTPUT_DIR := $(OUTPUT)/build
27a5db7817SDavid VernetOBJ_DIR := $(OUTPUT_DIR)/obj
28a5db7817SDavid VernetINCLUDE_DIR := $(OUTPUT_DIR)/include
29a5db7817SDavid VernetBPFOBJ_DIR := $(OBJ_DIR)/libbpf
30a5db7817SDavid VernetSCXOBJ_DIR := $(OBJ_DIR)/sched_ext
31a5db7817SDavid VernetBPFOBJ := $(BPFOBJ_DIR)/libbpf.a
32a5db7817SDavid VernetLIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a
33a5db7817SDavid Vernet
347941b83bSBjörn TöpelDEFAULT_BPFTOOL := $(OUTPUT_DIR)/host/sbin/bpftool
357941b83bSBjörn TöpelHOST_OBJ_DIR := $(OBJ_DIR)/host/bpftool
367941b83bSBjörn TöpelHOST_LIBBPF_OUTPUT := $(OBJ_DIR)/host/libbpf/
377941b83bSBjörn TöpelHOST_LIBBPF_DESTDIR := $(OUTPUT_DIR)/host/
387941b83bSBjörn TöpelHOST_DESTDIR := $(OUTPUT_DIR)/host/
397941b83bSBjörn Töpel
407941b83bSBjörn TöpelVMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux)					\
417941b83bSBjörn Töpel		     $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)		\
427941b83bSBjörn Töpel		     ../../../../vmlinux					\
43a5db7817SDavid Vernet		     /sys/kernel/btf/vmlinux					\
44a5db7817SDavid Vernet		     /boot/vmlinux-$(shell uname -r)
45a5db7817SDavid VernetVMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
46a5db7817SDavid Vernetifeq ($(VMLINUX_BTF),)
47a5db7817SDavid Vernet$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
48a5db7817SDavid Vernetendif
49a5db7817SDavid Vernet
50a5db7817SDavid VernetBPFTOOL ?= $(DEFAULT_BPFTOOL)
51a5db7817SDavid Vernet
52a5db7817SDavid Vernetifneq ($(wildcard $(GENHDR)),)
53a5db7817SDavid Vernet  GENFLAGS := -DHAVE_GENHDR
54a5db7817SDavid Vernetendif
55a5db7817SDavid Vernet
56a5db7817SDavid VernetCFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS)			\
57a5db7817SDavid Vernet	  -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR)				\
58a5db7817SDavid Vernet	  -I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include -I$(SCXTOOLSINCDIR)
59a5db7817SDavid Vernet
60a5db7817SDavid Vernet# Silence some warnings when compiled with clang
61a5db7817SDavid Vernetifneq ($(LLVM),)
62a5db7817SDavid VernetCFLAGS += -Wno-unused-command-line-argument
63a5db7817SDavid Vernetendif
64a5db7817SDavid Vernet
65a5db7817SDavid VernetLDFLAGS = -lelf -lz -lpthread -lzstd
66a5db7817SDavid Vernet
67a5db7817SDavid VernetIS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null |				\
68a5db7817SDavid Vernet			grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
69a5db7817SDavid Vernet
70a5db7817SDavid Vernet# Get Clang's default includes on this system, as opposed to those seen by
71a5db7817SDavid Vernet# '-target bpf'. This fixes "missing" files on some architectures/distros,
72a5db7817SDavid Vernet# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
73a5db7817SDavid Vernet#
74a5db7817SDavid Vernet# Use '-idirafter': Don't interfere with include mechanics except where the
75a5db7817SDavid Vernet# build would have failed anyways.
76a5db7817SDavid Vernetdefine get_sys_includes
777941b83bSBjörn Töpel$(shell $(1) $(2) -v -E - </dev/null 2>&1 \
78a5db7817SDavid Vernet	| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
797941b83bSBjörn Töpel$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
80a5db7817SDavid Vernetendef
81a5db7817SDavid Vernet
827941b83bSBjörn Töpelifneq ($(CROSS_COMPILE),)
837941b83bSBjörn TöpelCLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))
847941b83bSBjörn Töpelendif
857941b83bSBjörn Töpel
867941b83bSBjörn TöpelCLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
877941b83bSBjörn Töpel
88a5db7817SDavid VernetBPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH)					\
89a5db7817SDavid Vernet	     $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)		\
90a5db7817SDavid Vernet	     -I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat			\
91a5db7817SDavid Vernet	     -I$(INCLUDE_DIR) -I$(APIDIR) -I$(SCXTOOLSINCDIR)			\
92a5db7817SDavid Vernet	     -I$(REPOROOT)/include						\
937941b83bSBjörn Töpel	     $(CLANG_SYS_INCLUDES) 						\
94a5db7817SDavid Vernet	     -Wall -Wno-compare-distinct-pointer-types				\
95a5db7817SDavid Vernet	     -Wno-incompatible-function-pointer-types				\
96a5db7817SDavid Vernet	     -O2 -mcpu=v3
97a5db7817SDavid Vernet
98a5db7817SDavid Vernet# sort removes libbpf duplicates when not cross-building
99a5db7817SDavid VernetMAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(OBJ_DIR)/libbpf				\
100a5db7817SDavid Vernet	       $(OBJ_DIR)/bpftool $(OBJ_DIR)/resolve_btfids			\
1017941b83bSBjörn Töpel	       $(HOST_OBJ_DIR) $(INCLUDE_DIR) $(SCXOBJ_DIR))
102a5db7817SDavid Vernet
103a5db7817SDavid Vernet$(MAKE_DIRS):
104a5db7817SDavid Vernet	$(call msg,MKDIR,,$@)
105a5db7817SDavid Vernet	$(Q)mkdir -p $@
106a5db7817SDavid Vernet
107a5db7817SDavid Vernet$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)			\
108a5db7817SDavid Vernet	   $(APIDIR)/linux/bpf.h						\
109a5db7817SDavid Vernet	   | $(OBJ_DIR)/libbpf
110a5db7817SDavid Vernet	$(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/	\
1117941b83bSBjörn Töpel		    ARCH=$(ARCH) CC="$(CC)" CROSS_COMPILE=$(CROSS_COMPILE)	\
112a5db7817SDavid Vernet		    EXTRA_CFLAGS='-g -O0 -fPIC'					\
113a5db7817SDavid Vernet		    DESTDIR=$(OUTPUT_DIR) prefix= all install_headers
114a5db7817SDavid Vernet
115a5db7817SDavid Vernet$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile)	\
1167941b83bSBjörn Töpel		    $(LIBBPF_OUTPUT) | $(HOST_OBJ_DIR)
117a5db7817SDavid Vernet	$(Q)$(MAKE) $(submake_extras)  -C $(BPFTOOLDIR)				\
118a5db7817SDavid Vernet		    ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD)		\
119a5db7817SDavid Vernet		    EXTRA_CFLAGS='-g -O0'					\
1207941b83bSBjörn Töpel		    OUTPUT=$(HOST_OBJ_DIR)/					\
1217941b83bSBjörn Töpel		    LIBBPF_OUTPUT=$(HOST_LIBBPF_OUTPUT)				\
1227941b83bSBjörn Töpel		    LIBBPF_DESTDIR=$(HOST_LIBBPF_DESTDIR)			\
1237941b83bSBjörn Töpel		    prefix= DESTDIR=$(HOST_DESTDIR) install-bin
124a5db7817SDavid Vernet
125a5db7817SDavid Vernet$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
126a5db7817SDavid Vernetifeq ($(VMLINUX_H),)
127a5db7817SDavid Vernet	$(call msg,GEN,,$@)
128a5db7817SDavid Vernet	$(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
129a5db7817SDavid Vernetelse
130a5db7817SDavid Vernet	$(call msg,CP,,$@)
131a5db7817SDavid Vernet	$(Q)cp "$(VMLINUX_H)" $@
132a5db7817SDavid Vernetendif
133a5db7817SDavid Vernet
134a5db7817SDavid Vernet$(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h	| $(BPFOBJ) $(SCXOBJ_DIR)
135a5db7817SDavid Vernet	$(call msg,CLNG-BPF,,$(notdir $@))
136a5db7817SDavid Vernet	$(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@
137a5db7817SDavid Vernet
138a5db7817SDavid Vernet$(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR)
139a5db7817SDavid Vernet	$(eval sched=$(notdir $@))
140a5db7817SDavid Vernet	$(call msg,GEN-SKEL,,$(sched))
141a5db7817SDavid Vernet	$(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<
142a5db7817SDavid Vernet	$(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o)
143a5db7817SDavid Vernet	$(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o)
144a5db7817SDavid Vernet	$(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o)
145a5db7817SDavid Vernet	$(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@
146a5db7817SDavid Vernet	$(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)
147a5db7817SDavid Vernet
148a5db7817SDavid Vernet################
149a5db7817SDavid Vernet# C schedulers #
150a5db7817SDavid Vernet################
151a5db7817SDavid Vernet
152a5db7817SDavid Vernetoverride define CLEAN
153a5db7817SDavid Vernet	rm -rf $(OUTPUT_DIR)
154a5db7817SDavid Vernet	rm -f $(TEST_GEN_PROGS)
155a5db7817SDavid Vernetendef
156a5db7817SDavid Vernet
157a5db7817SDavid Vernet# Every testcase takes all of the BPF progs are dependencies by default. This
158a5db7817SDavid Vernet# allows testcases to load any BPF scheduler, which is useful for testcases
159a5db7817SDavid Vernet# that don't need their own prog to run their test.
160a5db7817SDavid Vernetall_test_bpfprogs := $(foreach prog,$(wildcard *.bpf.c),$(INCLUDE_DIR)/$(patsubst %.c,%.skel.h,$(prog)))
161a5db7817SDavid Vernet
162a5db7817SDavid Vernetauto-test-targets :=			\
163a5db7817SDavid Vernet	create_dsq			\
164a5db7817SDavid Vernet	enq_last_no_enq_fails		\
165a5db7817SDavid Vernet	enq_select_cpu_fails		\
166a5db7817SDavid Vernet	ddsp_bogus_dsq_fail		\
167a5db7817SDavid Vernet	ddsp_vtimelocal_fail		\
168a5db7817SDavid Vernet	dsp_local_on			\
169a5db7817SDavid Vernet	exit				\
170a5db7817SDavid Vernet	hotplug				\
171a5db7817SDavid Vernet	init_enable_count		\
172a5db7817SDavid Vernet	maximal				\
173a5db7817SDavid Vernet	maybe_null			\
174a5db7817SDavid Vernet	minimal				\
175*5ae51618SAndrea Righi	numa				\
176a5db7817SDavid Vernet	prog_run			\
177a5db7817SDavid Vernet	reload_loop			\
178a5db7817SDavid Vernet	select_cpu_dfl			\
179a5db7817SDavid Vernet	select_cpu_dfl_nodispatch	\
180a5db7817SDavid Vernet	select_cpu_dispatch		\
181a5db7817SDavid Vernet	select_cpu_dispatch_bad_dsq	\
182a5db7817SDavid Vernet	select_cpu_dispatch_dbl_dsp	\
183a5db7817SDavid Vernet	select_cpu_vtime		\
184a5db7817SDavid Vernet	test_example			\
185a5db7817SDavid Vernet
186a5db7817SDavid Vernettestcase-targets := $(addsuffix .o,$(addprefix $(SCXOBJ_DIR)/,$(auto-test-targets)))
187a5db7817SDavid Vernet
1889b3c11a8SIhor Solodrai$(SCXOBJ_DIR)/runner.o: runner.c | $(SCXOBJ_DIR) $(BPFOBJ)
189a5db7817SDavid Vernet	$(CC) $(CFLAGS) -c $< -o $@
190a5db7817SDavid Vernet
191a5db7817SDavid Vernet# Create all of the test targets object files, whose testcase objects will be
192a5db7817SDavid Vernet# registered into the runner in ELF constructors.
193a5db7817SDavid Vernet#
194a5db7817SDavid Vernet# Note that we must do double expansion here in order to support conditionally
195a5db7817SDavid Vernet# compiling BPF object files only if one is present, as the wildcard Make
196a5db7817SDavid Vernet# function doesn't support using implicit rules otherwise.
197a5db7817SDavid Vernet$(testcase-targets): $(SCXOBJ_DIR)/%.o: %.c $(SCXOBJ_DIR)/runner.o $(all_test_bpfprogs) | $(SCXOBJ_DIR)
198a5db7817SDavid Vernet	$(eval test=$(patsubst %.o,%.c,$(notdir $@)))
1997941b83bSBjörn Töpel	$(CC) $(CFLAGS) -c $< -o $@
200a5db7817SDavid Vernet
201a5db7817SDavid Vernet$(SCXOBJ_DIR)/util.o: util.c | $(SCXOBJ_DIR)
202a5db7817SDavid Vernet	$(CC) $(CFLAGS) -c $< -o $@
203a5db7817SDavid Vernet
2047941b83bSBjörn Töpel$(OUTPUT)/runner: $(SCXOBJ_DIR)/runner.o $(SCXOBJ_DIR)/util.o $(BPFOBJ) $(testcase-targets)
205a5db7817SDavid Vernet	@echo "$(testcase-targets)"
206a5db7817SDavid Vernet	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
207a5db7817SDavid Vernet
208a5db7817SDavid Vernet.DEFAULT_GOAL := all
209a5db7817SDavid Vernet
210a5db7817SDavid Vernet.DELETE_ON_ERROR:
211a5db7817SDavid Vernet
212a5db7817SDavid Vernet.SECONDARY:
213