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