| 1 |
|
| 2 |
|
| 3 | include ../build/Build.include
|
| 4 | include ../scripts/Makefile.arch
|
| 5 | include ../scripts/Makefile.include
|
| 6 |
|
| 7 | all: all_targets
|
| 8 |
|
| 9 | ifneq ($(LLVM),)
|
| 10 | ifneq ($(filter %/,$(LLVM)),)
|
| 11 | LLVM_PREFIX := $(LLVM)
|
| 12 | else ifneq ($(filter -%,$(LLVM)),)
|
| 13 | LLVM_SUFFIX := $(LLVM)
|
| 14 | endif
|
| 15 |
|
| 16 | CLANG_TARGET_FLAGS_arm := arm-linux-gnueabi
|
| 17 | CLANG_TARGET_FLAGS_arm64 := aarch64-linux-gnu
|
| 18 | CLANG_TARGET_FLAGS_hexagon := hexagon-linux-musl
|
| 19 | CLANG_TARGET_FLAGS_m68k := m68k-linux-gnu
|
| 20 | CLANG_TARGET_FLAGS_mips := mipsel-linux-gnu
|
| 21 | CLANG_TARGET_FLAGS_powerpc := powerpc64le-linux-gnu
|
| 22 | CLANG_TARGET_FLAGS_riscv := riscv64-linux-gnu
|
| 23 | CLANG_TARGET_FLAGS_s390 := s390x-linux-gnu
|
| 24 | CLANG_TARGET_FLAGS_x86 := x86_64-linux-gnu
|
| 25 | CLANG_TARGET_FLAGS := $(CLANG_TARGET_FLAGS_$(ARCH))
|
| 26 |
|
| 27 | ifeq ($(CROSS_COMPILE),)
|
| 28 | ifeq ($(CLANG_TARGET_FLAGS),)
|
| 29 | $(error Specify CROSS_COMPILE or add '--target=' option to lib.mk)
|
| 30 | else
|
| 31 | CLANG_FLAGS += --target=$(CLANG_TARGET_FLAGS)
|
| 32 | endif
|
| 33 | else
|
| 34 | CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
| 35 | endif
|
| 36 |
|
| 37 | CC := $(LLVM_PREFIX)clang$(LLVM_SUFFIX) $(CLANG_FLAGS) -fintegrated-as
|
| 38 | else
|
| 39 | CC := $(CROSS_COMPILE)gcc
|
| 40 | endif
|
| 41 |
|
| 42 | CURDIR := $(abspath .)
|
| 43 | TOOLSDIR := $(abspath ..)
|
| 44 | LIBDIR := $(TOOLSDIR)/lib
|
| 45 | BPFDIR := $(LIBDIR)/bpf
|
| 46 | TOOLSINCDIR := $(TOOLSDIR)/include
|
| 47 | BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
|
| 48 | APIDIR := $(TOOLSINCDIR)/uapi
|
| 49 | GENDIR := $(abspath ../../include/generated)
|
| 50 | GENHDR := $(GENDIR)/autoconf.h
|
| 51 |
|
| 52 | ifeq ($(O),)
|
| 53 | OUTPUT_DIR := $(CURDIR)/build
|
| 54 | else
|
| 55 | OUTPUT_DIR := $(O)/build
|
| 56 | endif
|
| 57 | OBJ_DIR := $(OUTPUT_DIR)/obj
|
| 58 | INCLUDE_DIR := $(OUTPUT_DIR)/include
|
| 59 | BPFOBJ_DIR := $(OBJ_DIR)/libbpf
|
| 60 | SCXOBJ_DIR := $(OBJ_DIR)/sched_ext
|
| 61 | BINDIR := $(OUTPUT_DIR)/bin
|
| 62 | BPFOBJ := $(BPFOBJ_DIR)/libbpf.a
|
| 63 | ifneq ($(CROSS_COMPILE),)
|
| 64 | HOST_BUILD_DIR := $(OBJ_DIR)/host/obj
|
| 65 | HOST_OUTPUT_DIR := $(OBJ_DIR)/host
|
| 66 | HOST_INCLUDE_DIR := $(HOST_OUTPUT_DIR)/include
|
| 67 | else
|
| 68 | HOST_BUILD_DIR := $(OBJ_DIR)
|
| 69 | HOST_OUTPUT_DIR := $(OUTPUT_DIR)
|
| 70 | HOST_INCLUDE_DIR := $(INCLUDE_DIR)
|
| 71 | endif
|
| 72 | HOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a
|
| 73 | RESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids
|
| 74 | DEFAULT_BPFTOOL := $(HOST_OUTPUT_DIR)/sbin/bpftool
|
| 75 |
|
| 76 | VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
| 77 | $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
| 78 | ../../vmlinux \
|
| 79 | /sys/kernel/btf/vmlinux \
|
| 80 | /boot/vmlinux-$(shell uname -r)
|
| 81 | VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
| 82 | ifeq ($(VMLINUX_BTF),)
|
| 83 | $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
|
| 84 | endif
|
| 85 |
|
| 86 | BPFTOOL ?= $(DEFAULT_BPFTOOL)
|
| 87 |
|
| 88 | ifneq ($(wildcard $(GENHDR)),)
|
| 89 | GENFLAGS := -DHAVE_GENHDR
|
| 90 | endif
|
| 91 |
|
| 92 | CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS) \
|
| 93 | -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \
|
| 94 | -I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include
|
| 95 |
|
| 96 |
|
| 97 | ifneq ($(LLVM),)
|
| 98 | CFLAGS += -Wno-unused-command-line-argument
|
| 99 | endif
|
| 100 |
|
| 101 | LDFLAGS += -lelf -lz -lpthread
|
| 102 |
|
| 103 | IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
|
| 104 | grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
|
| 105 |
|
| 106 |
|
| 107 |
|
| 108 |
|
| 109 |
|
| 110 |
|
| 111 |
|
| 112 | define get_sys_includes
|
| 113 | $(shell $(1) -v -E - </dev/null 2>&1 \
|
| 114 | | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
|
| 115 | $(shell $(1) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
|
| 116 | endef
|
| 117 |
|
| 118 | BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) \
|
| 119 | $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) \
|
| 120 | -I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat \
|
| 121 | -I$(INCLUDE_DIR) -I$(APIDIR) \
|
| 122 | -I../../include \
|
| 123 | $(call get_sys_includes,$(CLANG)) \
|
| 124 | -Wall -Wno-compare-distinct-pointer-types \
|
| 125 | -Wno-microsoft-anon-tag \
|
| 126 | -fms-extensions \
|
| 127 | -O2 -mcpu=v3
|
| 128 |
|
| 129 |
|
| 130 | MAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \
|
| 131 | $(HOST_BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/resolve_btfids \
|
| 132 | $(INCLUDE_DIR) $(SCXOBJ_DIR) $(BINDIR))
|
| 133 |
|
| 134 | $(MAKE_DIRS):
|
| 135 | $(call msg,MKDIR,,$@)
|
| 136 | $(Q)mkdir -p $@
|
| 137 |
|
| 138 | ifneq ($(CROSS_COMPILE),)
|
| 139 | $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
|
| 140 | $(APIDIR)/linux/bpf.h \
|
| 141 | | $(OBJ_DIR)/libbpf
|
| 142 | $(Q)$(MAKE) $(submake_extras) CROSS_COMPILE=$(CROSS_COMPILE) \
|
| 143 | -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/ \
|
| 144 | EXTRA_CFLAGS='-g -O0 -fPIC' \
|
| 145 | LDFLAGS="$(LDFLAGS)" \
|
| 146 | DESTDIR=$(OUTPUT_DIR) prefix= all install_headers
|
| 147 | endif
|
| 148 |
|
| 149 | $(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
|
| 150 | $(APIDIR)/linux/bpf.h \
|
| 151 | | $(HOST_BUILD_DIR)/libbpf
|
| 152 | $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \
|
| 153 | OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
|
| 154 | ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD=$(HOSTLD) \
|
| 155 | EXTRA_CFLAGS='-g -O0 -fPIC' \
|
| 156 | DESTDIR=$(HOST_OUTPUT_DIR) prefix= all install_headers
|
| 157 |
|
| 158 | $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
| 159 | $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
|
| 160 | $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
|
| 161 | ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD=$(HOSTLD) \
|
| 162 | EXTRA_CFLAGS='-g -O0' \
|
| 163 | OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \
|
| 164 | LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
|
| 165 | LIBBPF_DESTDIR=$(HOST_OUTPUT_DIR)/ \
|
| 166 | prefix= DESTDIR=$(HOST_OUTPUT_DIR)/ install-bin
|
| 167 |
|
| 168 | $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
|
| 169 | ifeq ($(VMLINUX_H),)
|
| 170 | $(call msg,GEN,,$@)
|
| 171 | $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
|
| 172 | else
|
| 173 | $(call msg,CP,,$@)
|
| 174 | $(Q)cp "$(VMLINUX_H)" $@
|
| 175 | endif
|
| 176 |
|
| 177 | $(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h include/scx/*.h \
|
| 178 | | $(BPFOBJ) $(SCXOBJ_DIR)
|
| 179 | $(call msg,CLNG-BPF,,$(notdir $@))
|
| 180 | $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@
|
| 181 |
|
| 182 | $(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL)
|
| 183 | $(eval sched=$(notdir $@))
|
| 184 | $(call msg,GEN-SKEL,,$(sched))
|
| 185 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<
|
| 186 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o)
|
| 187 | $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o)
|
| 188 | $(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o)
|
| 189 | $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@
|
| 190 | $(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)
|
| 191 |
|
| 192 | SCX_COMMON_DEPS := include/scx/common.h include/scx/user_exit_info.h | $(BINDIR)
|
| 193 |
|
| 194 | c-sched-targets = scx_simple scx_cpu0 scx_qmap scx_central scx_flatcg scx_userland scx_pair scx_sdt
|
| 195 |
|
| 196 | $(addprefix $(BINDIR)/,$(c-sched-targets)): \
|
| 197 | $(BINDIR)/%: \
|
| 198 | $(filter-out %.bpf.c,%.c) \
|
| 199 | $(INCLUDE_DIR)/%.bpf.skel.h \
|
| 200 | $(SCX_COMMON_DEPS)
|
| 201 | $(eval sched=$(notdir $@))
|
| 202 | $(CC) $(CFLAGS) -c $(sched).c -o $(SCXOBJ_DIR)/$(sched).o
|
| 203 | $(CC) -o $@ $(SCXOBJ_DIR)/$(sched).o $(BPFOBJ) $(LDFLAGS)
|
| 204 |
|
| 205 | $(c-sched-targets): %: $(BINDIR)/%
|
| 206 |
|
| 207 | install: all
|
| 208 | $(Q)mkdir -p $(DESTDIR)/usr/local/bin/
|
| 209 | $(Q)cp $(BINDIR)/* $(DESTDIR)/usr/local/bin/
|
| 210 |
|
| 211 | clean:
|
| 212 | rm -rf $(OUTPUT_DIR) $(HOST_OUTPUT_DIR)
|
| 213 | rm -f *.o *.bpf.o *.bpf.skel.h *.bpf.subskel.h
|
| 214 | rm -f $(c-sched-targets)
|
| 215 |
|
| 216 | help:
|
| 217 | @echo 'Building targets'
|
| 218 | @echo '================'
|
| 219 | @echo ''
|
| 220 | @echo ' all - Compile all schedulers'
|
| 221 | @echo ''
|
| 222 | @echo 'Alternatively, you may compile individual schedulers:'
|
| 223 | @echo ''
|
| 224 | @printf ' %s\n' $(c-sched-targets)
|
| 225 | @echo ''
|
| 226 | @echo 'For any scheduler build target, you may specify an alternative'
|
| 227 | @echo 'build output path with the O= environment variable. For example:'
|
| 228 | @echo ''
|
| 229 | @echo ' O=/tmp/sched_ext make all'
|
| 230 | @echo ''
|
| 231 | @echo 'will compile all schedulers, and emit the build artifacts to'
|
| 232 | @echo '/tmp/sched_ext/build.'
|
| 233 | @echo ''
|
| 234 | @echo ''
|
| 235 | @echo 'Installing targets'
|
| 236 | @echo '=================='
|
| 237 | @echo ''
|
| 238 | @echo ' install - Compile and install all schedulers to /usr/bin.'
|
| 239 | @echo ' You may specify the DESTDIR= environment variable'
|
| 240 | @echo ' to indicate a prefix for /usr/bin. For example:'
|
| 241 | @echo ''
|
| 242 | @echo ' DESTDIR=/tmp/sched_ext make install'
|
| 243 | @echo ''
|
| 244 | @echo ' will build the schedulers in CWD/build, and'
|
| 245 | @echo ' install the schedulers to /tmp/sched_ext/usr/bin.'
|
| 246 | @echo ''
|
| 247 | @echo ''
|
| 248 | @echo 'Cleaning targets'
|
| 249 | @echo '================'
|
| 250 | @echo ''
|
| 251 | @echo ' clean - Remove all generated files'
|
| 252 |
|
| 253 | all_targets: $(c-sched-targets)
|
| 254 |
|
| 255 | .PHONY: all all_targets $(c-sched-targets) clean help
|
| 256 |
|
| 257 |
|
| 258 | .DELETE_ON_ERROR:
|
| 259 |
|
| 260 |
|
| 261 | .SECONDARY:
|