212 lines · plain
1# SPDX-License-Identifier: GPL-2.02# Copyright (c) 2022 Meta Platforms, Inc. and affiliates.3include ../../../build/Build.include4include ../../../scripts/Makefile.arch5include ../../../scripts/Makefile.include6 7TEST_GEN_PROGS := runner8 9# override lib.mk's default rules10OVERRIDE_TARGETS := 111include ../lib.mk12 13CURDIR := $(abspath .)14REPOROOT := $(abspath ../../../..)15TOOLSDIR := $(REPOROOT)/tools16LIBDIR := $(TOOLSDIR)/lib17BPFDIR := $(LIBDIR)/bpf18TOOLSINCDIR := $(TOOLSDIR)/include19BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool20APIDIR := $(TOOLSINCDIR)/uapi21GENDIR := $(REPOROOT)/include/generated22GENHDR := $(GENDIR)/autoconf.h23SCXTOOLSDIR := $(TOOLSDIR)/sched_ext24SCXTOOLSINCDIR := $(TOOLSDIR)/sched_ext/include25 26OUTPUT_DIR := $(OUTPUT)/build27OBJ_DIR := $(OUTPUT_DIR)/obj28INCLUDE_DIR := $(OUTPUT_DIR)/include29BPFOBJ_DIR := $(OBJ_DIR)/libbpf30SCXOBJ_DIR := $(OBJ_DIR)/sched_ext31BPFOBJ := $(BPFOBJ_DIR)/libbpf.a32LIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a33 34DEFAULT_BPFTOOL := $(OUTPUT_DIR)/host/sbin/bpftool35HOST_OBJ_DIR := $(OBJ_DIR)/host/bpftool36HOST_LIBBPF_OUTPUT := $(OBJ_DIR)/host/libbpf/37HOST_LIBBPF_DESTDIR := $(OUTPUT_DIR)/host/38HOST_DESTDIR := $(OUTPUT_DIR)/host/39 40VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \41 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \42 ../../../../vmlinux \43 /sys/kernel/btf/vmlinux \44 /boot/vmlinux-$(shell uname -r)45VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))46ifeq ($(VMLINUX_BTF),)47$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")48endif49 50BPFTOOL ?= $(DEFAULT_BPFTOOL)51 52ifneq ($(wildcard $(GENHDR)),)53 GENFLAGS := -DHAVE_GENHDR54endif55 56CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS) \57 -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \58 -I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include -I$(SCXTOOLSINCDIR)59 60# Silence some warnings when compiled with clang61ifneq ($(LLVM),)62CFLAGS += -Wno-unused-command-line-argument63endif64 65LDFLAGS = -lelf -lz -lpthread -lzstd66 67IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \68 grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')69 70# Get Clang's default includes on this system, as opposed to those seen by71# '-target bpf'. This fixes "missing" files on some architectures/distros,72# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.73#74# Use '-idirafter': Don't interfere with include mechanics except where the75# build would have failed anyways.76define get_sys_includes77$(shell $(1) $(2) -v -E - </dev/null 2>&1 \78 | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \79$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')80endef81 82ifneq ($(CROSS_COMPILE),)83CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))84endif85 86CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))87 88BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) \89 $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) \90 -I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat \91 -I$(INCLUDE_DIR) -I$(APIDIR) -I$(SCXTOOLSINCDIR) \92 -I$(REPOROOT)/include \93 $(CLANG_SYS_INCLUDES) \94 -Wall -Wno-compare-distinct-pointer-types \95 -Wno-incompatible-function-pointer-types \96 -O2 -mcpu=v397 98# sort removes libbpf duplicates when not cross-building99MAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(OBJ_DIR)/libbpf \100 $(OBJ_DIR)/bpftool $(OBJ_DIR)/resolve_btfids \101 $(HOST_OBJ_DIR) $(INCLUDE_DIR) $(SCXOBJ_DIR))102 103$(MAKE_DIRS):104 $(call msg,MKDIR,,$@)105 $(Q)mkdir -p $@106 107$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \108 $(APIDIR)/linux/bpf.h \109 | $(OBJ_DIR)/libbpf110 $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/ \111 ARCH=$(ARCH) CC="$(CC)" CROSS_COMPILE=$(CROSS_COMPILE) \112 EXTRA_CFLAGS='-g -O0 -fPIC' \113 DESTDIR=$(OUTPUT_DIR) prefix= all install_headers114 115$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \116 $(LIBBPF_OUTPUT) | $(HOST_OBJ_DIR)117 $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \118 ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \119 EXTRA_CFLAGS='-g -O0' \120 OUTPUT=$(HOST_OBJ_DIR)/ \121 LIBBPF_OUTPUT=$(HOST_LIBBPF_OUTPUT) \122 LIBBPF_DESTDIR=$(HOST_LIBBPF_DESTDIR) \123 prefix= DESTDIR=$(HOST_DESTDIR) install-bin124 125$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)126ifeq ($(VMLINUX_H),)127 $(call msg,GEN,,$@)128 $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@129else130 $(call msg,CP,,$@)131 $(Q)cp "$(VMLINUX_H)" $@132endif133 134$(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h | $(BPFOBJ) $(SCXOBJ_DIR)135 $(call msg,CLNG-BPF,,$(notdir $@))136 $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@137 138$(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR)139 $(eval sched=$(notdir $@))140 $(call msg,GEN-SKEL,,$(sched))141 $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<142 $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o)143 $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o)144 $(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o)145 $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@146 $(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)147 148################149# C schedulers #150################151 152override define CLEAN153 rm -rf $(OUTPUT_DIR)154 rm -f $(TEST_GEN_PROGS)155endef156 157# Every testcase takes all of the BPF progs are dependencies by default. This158# allows testcases to load any BPF scheduler, which is useful for testcases159# that don't need their own prog to run their test.160all_test_bpfprogs := $(foreach prog,$(wildcard *.bpf.c),$(INCLUDE_DIR)/$(patsubst %.c,%.skel.h,$(prog)))161 162auto-test-targets := \163 create_dsq \164 enq_last_no_enq_fails \165 enq_select_cpu_fails \166 ddsp_bogus_dsq_fail \167 ddsp_vtimelocal_fail \168 dsp_local_on \169 exit \170 hotplug \171 init_enable_count \172 maximal \173 maybe_null \174 minimal \175 prog_run \176 reload_loop \177 select_cpu_dfl \178 select_cpu_dfl_nodispatch \179 select_cpu_dispatch \180 select_cpu_dispatch_bad_dsq \181 select_cpu_dispatch_dbl_dsp \182 select_cpu_vtime \183 test_example \184 185testcase-targets := $(addsuffix .o,$(addprefix $(SCXOBJ_DIR)/,$(auto-test-targets)))186 187$(SCXOBJ_DIR)/runner.o: runner.c | $(SCXOBJ_DIR) $(BPFOBJ)188 $(CC) $(CFLAGS) -c $< -o $@189 190# Create all of the test targets object files, whose testcase objects will be191# registered into the runner in ELF constructors.192#193# Note that we must do double expansion here in order to support conditionally194# compiling BPF object files only if one is present, as the wildcard Make195# function doesn't support using implicit rules otherwise.196$(testcase-targets): $(SCXOBJ_DIR)/%.o: %.c $(SCXOBJ_DIR)/runner.o $(all_test_bpfprogs) | $(SCXOBJ_DIR)197 $(eval test=$(patsubst %.o,%.c,$(notdir $@)))198 $(CC) $(CFLAGS) -c $< -o $@199 200$(SCXOBJ_DIR)/util.o: util.c | $(SCXOBJ_DIR)201 $(CC) $(CFLAGS) -c $< -o $@202 203$(OUTPUT)/runner: $(SCXOBJ_DIR)/runner.o $(SCXOBJ_DIR)/util.o $(BPFOBJ) $(testcase-targets)204 @echo "$(testcase-targets)"205 $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)206 207.DEFAULT_GOAL := all208 209.DELETE_ON_ERROR:210 211.SECONDARY:212