Makefile 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. # SPDX-License-Identifier: GPL-2.0
  2. # Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
  3. include ../../../build/Build.include
  4. include ../../../scripts/Makefile.arch
  5. include ../../../scripts/Makefile.include
  6. TEST_GEN_PROGS := runner
  7. # override lib.mk's default rules
  8. OVERRIDE_TARGETS := 1
  9. include ../lib.mk
  10. CURDIR := $(abspath .)
  11. REPOROOT := $(abspath ../../../..)
  12. TOOLSDIR := $(REPOROOT)/tools
  13. LIBDIR := $(TOOLSDIR)/lib
  14. BPFDIR := $(LIBDIR)/bpf
  15. TOOLSINCDIR := $(TOOLSDIR)/include
  16. BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
  17. APIDIR := $(TOOLSINCDIR)/uapi
  18. GENDIR := $(REPOROOT)/include/generated
  19. GENHDR := $(GENDIR)/autoconf.h
  20. SCXTOOLSDIR := $(TOOLSDIR)/sched_ext
  21. SCXTOOLSINCDIR := $(TOOLSDIR)/sched_ext/include
  22. OUTPUT_DIR := $(OUTPUT)/build
  23. OBJ_DIR := $(OUTPUT_DIR)/obj
  24. INCLUDE_DIR := $(OUTPUT_DIR)/include
  25. BPFOBJ_DIR := $(OBJ_DIR)/libbpf
  26. SCXOBJ_DIR := $(OBJ_DIR)/sched_ext
  27. BPFOBJ := $(BPFOBJ_DIR)/libbpf.a
  28. LIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a
  29. DEFAULT_BPFTOOL := $(OUTPUT_DIR)/host/sbin/bpftool
  30. HOST_OBJ_DIR := $(OBJ_DIR)/host/bpftool
  31. HOST_LIBBPF_OUTPUT := $(OBJ_DIR)/host/libbpf/
  32. HOST_LIBBPF_DESTDIR := $(OUTPUT_DIR)/host/
  33. HOST_DESTDIR := $(OUTPUT_DIR)/host/
  34. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  35. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  36. ../../../../vmlinux \
  37. /sys/kernel/btf/vmlinux \
  38. /boot/vmlinux-$(shell uname -r)
  39. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  40. ifeq ($(VMLINUX_BTF),)
  41. $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
  42. endif
  43. BPFTOOL ?= $(DEFAULT_BPFTOOL)
  44. ifneq ($(wildcard $(GENHDR)),)
  45. GENFLAGS := -DHAVE_GENHDR
  46. endif
  47. CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS) \
  48. -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR) \
  49. -I$(TOOLSINCDIR) -I$(APIDIR) -I$(CURDIR)/include -I$(SCXTOOLSINCDIR)
  50. # Silence some warnings when compiled with clang
  51. ifneq ($(LLVM),)
  52. CFLAGS += -Wno-unused-command-line-argument
  53. endif
  54. LDFLAGS = -lelf -lz -lpthread -lzstd
  55. IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
  56. grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
  57. # Get Clang's default includes on this system, as opposed to those seen by
  58. # '-target bpf'. This fixes "missing" files on some architectures/distros,
  59. # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
  60. #
  61. # Use '-idirafter': Don't interfere with include mechanics except where the
  62. # build would have failed anyways.
  63. define get_sys_includes
  64. $(shell $(1) $(2) -v -E - </dev/null 2>&1 \
  65. | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
  66. $(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
  67. endef
  68. ifneq ($(CROSS_COMPILE),)
  69. CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%))
  70. endif
  71. CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
  72. BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) \
  73. $(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) \
  74. -I$(CURDIR)/include -I$(CURDIR)/include/bpf-compat \
  75. -I$(INCLUDE_DIR) -I$(APIDIR) -I$(SCXTOOLSINCDIR) \
  76. -I$(REPOROOT)/include \
  77. $(CLANG_SYS_INCLUDES) \
  78. -Wall -Wno-compare-distinct-pointer-types \
  79. -Wno-incompatible-function-pointer-types \
  80. -Wno-microsoft-anon-tag \
  81. -fms-extensions \
  82. -O2 -mcpu=v3
  83. # sort removes libbpf duplicates when not cross-building
  84. MAKE_DIRS := $(sort $(OBJ_DIR)/libbpf $(OBJ_DIR)/libbpf \
  85. $(OBJ_DIR)/bpftool $(OBJ_DIR)/resolve_btfids \
  86. $(HOST_OBJ_DIR) $(INCLUDE_DIR) $(SCXOBJ_DIR))
  87. $(MAKE_DIRS):
  88. $(call msg,MKDIR,,$@)
  89. $(Q)mkdir -p $@
  90. $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
  91. $(APIDIR)/linux/bpf.h \
  92. | $(OBJ_DIR)/libbpf
  93. $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(OBJ_DIR)/libbpf/ \
  94. ARCH=$(ARCH) CC="$(CC)" CROSS_COMPILE=$(CROSS_COMPILE) \
  95. EXTRA_CFLAGS='-g -O0 -fPIC' \
  96. DESTDIR=$(OUTPUT_DIR) prefix= all install_headers
  97. $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
  98. $(LIBBPF_OUTPUT) | $(HOST_OBJ_DIR)
  99. $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
  100. ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \
  101. EXTRA_CFLAGS='-g -O0' \
  102. OUTPUT=$(HOST_OBJ_DIR)/ \
  103. LIBBPF_OUTPUT=$(HOST_LIBBPF_OUTPUT) \
  104. LIBBPF_DESTDIR=$(HOST_LIBBPF_DESTDIR) \
  105. prefix= DESTDIR=$(HOST_DESTDIR) install-bin
  106. $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
  107. ifeq ($(VMLINUX_H),)
  108. $(call msg,GEN,,$@)
  109. $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
  110. else
  111. $(call msg,CP,,$@)
  112. $(Q)cp "$(VMLINUX_H)" $@
  113. endif
  114. $(SCXOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h | $(BPFOBJ) $(SCXOBJ_DIR)
  115. $(call msg,CLNG-BPF,,$(notdir $@))
  116. $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@
  117. $(INCLUDE_DIR)/%.bpf.skel.h: $(SCXOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR)
  118. $(eval sched=$(notdir $@))
  119. $(call msg,GEN-SKEL,,$(sched))
  120. $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<
  121. $(Q)$(BPFTOOL) gen object $(<:.o=.linked2.o) $(<:.o=.linked1.o)
  122. $(Q)$(BPFTOOL) gen object $(<:.o=.linked3.o) $(<:.o=.linked2.o)
  123. $(Q)diff $(<:.o=.linked2.o) $(<:.o=.linked3.o)
  124. $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $@
  125. $(Q)$(BPFTOOL) gen subskeleton $(<:.o=.linked3.o) name $(subst .bpf.skel.h,,$(sched)) > $(@:.skel.h=.subskel.h)
  126. ################
  127. # C schedulers #
  128. ################
  129. override define CLEAN
  130. rm -rf $(OUTPUT_DIR)
  131. rm -f $(TEST_GEN_PROGS)
  132. endef
  133. # Every testcase takes all of the BPF progs are dependencies by default. This
  134. # allows testcases to load any BPF scheduler, which is useful for testcases
  135. # that don't need their own prog to run their test.
  136. all_test_bpfprogs := $(foreach prog,$(wildcard *.bpf.c),$(INCLUDE_DIR)/$(patsubst %.c,%.skel.h,$(prog)))
  137. auto-test-targets := \
  138. create_dsq \
  139. enq_last_no_enq_fails \
  140. ddsp_bogus_dsq_fail \
  141. ddsp_vtimelocal_fail \
  142. dsp_local_on \
  143. enq_select_cpu \
  144. exit \
  145. hotplug \
  146. init_enable_count \
  147. maximal \
  148. maybe_null \
  149. minimal \
  150. numa \
  151. allowed_cpus \
  152. peek_dsq \
  153. prog_run \
  154. reload_loop \
  155. select_cpu_dfl \
  156. select_cpu_dfl_nodispatch \
  157. select_cpu_dispatch \
  158. select_cpu_dispatch_bad_dsq \
  159. select_cpu_dispatch_dbl_dsp \
  160. select_cpu_vtime \
  161. rt_stall \
  162. test_example \
  163. total_bw \
  164. cyclic_kick_wait \
  165. testcase-targets := $(addsuffix .o,$(addprefix $(SCXOBJ_DIR)/,$(auto-test-targets)))
  166. $(SCXOBJ_DIR)/runner.o: runner.c | $(SCXOBJ_DIR) $(BPFOBJ)
  167. $(CC) $(CFLAGS) -c $< -o $@
  168. # Create all of the test targets object files, whose testcase objects will be
  169. # registered into the runner in ELF constructors.
  170. #
  171. # Note that we must do double expansion here in order to support conditionally
  172. # compiling BPF object files only if one is present, as the wildcard Make
  173. # function doesn't support using implicit rules otherwise.
  174. $(testcase-targets): $(SCXOBJ_DIR)/%.o: %.c $(SCXOBJ_DIR)/runner.o $(all_test_bpfprogs) | $(SCXOBJ_DIR)
  175. $(eval test=$(patsubst %.o,%.c,$(notdir $@)))
  176. $(CC) $(CFLAGS) -c $< -o $@
  177. $(SCXOBJ_DIR)/util.o: util.c | $(SCXOBJ_DIR)
  178. $(CC) $(CFLAGS) -c $< -o $@
  179. $(OUTPUT)/runner: $(SCXOBJ_DIR)/runner.o $(SCXOBJ_DIR)/util.o $(BPFOBJ) $(testcase-targets)
  180. @echo "$(testcase-targets)"
  181. $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
  182. .DEFAULT_GOAL := all
  183. .DELETE_ON_ERROR:
  184. .SECONDARY: