Makefile 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # SPDX-License-Identifier: GPL-2.0
  2. # based on tools/testing/selftest/bpf/Makefile
  3. include ../../../build/Build.include
  4. include ../../../scripts/Makefile.arch
  5. include ../../../scripts/Makefile.include
  6. TEST_PROGS := hid-core.sh
  7. TEST_PROGS += hid-apple.sh
  8. TEST_PROGS += hid-gamepad.sh
  9. TEST_PROGS += hid-ite.sh
  10. TEST_PROGS += hid-keyboard.sh
  11. TEST_PROGS += hid-mouse.sh
  12. TEST_PROGS += hid-multitouch.sh
  13. TEST_PROGS += hid-sony.sh
  14. TEST_PROGS += hid-tablet.sh
  15. TEST_PROGS += hid-usb_crash.sh
  16. TEST_PROGS += hid-wacom.sh
  17. TEST_FILES := run-hid-tools-tests.sh
  18. TEST_FILES += tests
  19. CXX ?= $(CROSS_COMPILE)g++
  20. HOSTPKG_CONFIG := pkg-config
  21. CFLAGS += -g -O0 -rdynamic -Wall -Werror -I$(OUTPUT)
  22. CFLAGS += -I$(OUTPUT)/tools/include
  23. LDLIBS += -lelf -lz -lrt -lpthread
  24. # Silence some warnings when compiled with clang
  25. ifneq ($(LLVM),)
  26. CFLAGS += -Wno-unused-command-line-argument
  27. endif
  28. # Order correspond to 'make run_tests' order
  29. TEST_GEN_PROGS = hid_bpf hidraw
  30. # Emit succinct information message describing current building step
  31. # $1 - generic step name (e.g., CC, LINK, etc);
  32. # $2 - optional "flavor" specifier; if provided, will be emitted as [flavor];
  33. # $3 - target (assumed to be file); only file name will be emitted;
  34. # $4 - optional extra arg, emitted as-is, if provided.
  35. ifeq ($(V),1)
  36. Q =
  37. msg =
  38. else
  39. Q = @
  40. msg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))";
  41. MAKEFLAGS += --no-print-directory
  42. submake_extras := feature_display=0
  43. endif
  44. # override lib.mk's default rules
  45. OVERRIDE_TARGETS := 1
  46. override define CLEAN
  47. $(call msg,CLEAN)
  48. $(Q)$(RM) -r $(TEST_GEN_PROGS)
  49. $(Q)$(RM) -r $(EXTRA_CLEAN)
  50. endef
  51. include ../lib.mk
  52. TOOLSDIR := $(top_srcdir)/tools
  53. LIBDIR := $(TOOLSDIR)/lib
  54. BPFDIR := $(LIBDIR)/bpf
  55. TOOLSINCDIR := $(TOOLSDIR)/include
  56. BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
  57. SCRATCH_DIR := $(OUTPUT)/tools
  58. BUILD_DIR := $(SCRATCH_DIR)/build
  59. INCLUDE_DIR := $(SCRATCH_DIR)/include
  60. BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a
  61. ifneq ($(CROSS_COMPILE),)
  62. HOST_BUILD_DIR := $(BUILD_DIR)/host
  63. HOST_SCRATCH_DIR := $(OUTPUT)/host-tools
  64. HOST_INCLUDE_DIR := $(HOST_SCRATCH_DIR)/include
  65. else
  66. HOST_BUILD_DIR := $(BUILD_DIR)
  67. HOST_SCRATCH_DIR := $(SCRATCH_DIR)
  68. HOST_INCLUDE_DIR := $(INCLUDE_DIR)
  69. endif
  70. HOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a
  71. RESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids
  72. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  73. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  74. ../../../../vmlinux \
  75. /sys/kernel/btf/vmlinux \
  76. /boot/vmlinux-$(shell uname -r)
  77. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  78. ifeq ($(VMLINUX_BTF),)
  79. $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
  80. endif
  81. # Define simple and short `make test_progs`, `make test_sysctl`, etc targets
  82. # to build individual tests.
  83. # NOTE: Semicolon at the end is critical to override lib.mk's default static
  84. # rule for binaries.
  85. $(notdir $(TEST_GEN_PROGS)): %: $(OUTPUT)/% ;
  86. # sort removes libbpf duplicates when not cross-building
  87. MAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \
  88. $(HOST_BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/resolve_btfids \
  89. $(INCLUDE_DIR))
  90. $(MAKE_DIRS):
  91. $(call msg,MKDIR,,$@)
  92. $(Q)mkdir -p $@
  93. # LLVM's ld.lld doesn't support all the architectures, so use it only on x86
  94. ifeq ($(SRCARCH),x86)
  95. LLD := lld
  96. else
  97. LLD := ld
  98. endif
  99. DEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
  100. TEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPFTOOL)
  101. $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ)
  102. BPFTOOL ?= $(DEFAULT_BPFTOOL)
  103. $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
  104. $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
  105. $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
  106. ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \
  107. EXTRA_CFLAGS='-g -O0' \
  108. OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \
  109. LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
  110. LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/ \
  111. prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin
  112. $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
  113. | $(BUILD_DIR)/libbpf
  114. $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \
  115. EXTRA_CFLAGS='-g -O0' \
  116. DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
  117. ifneq ($(BPFOBJ),$(HOST_BPFOBJ))
  118. $(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
  119. | $(HOST_BUILD_DIR)/libbpf
  120. $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \
  121. EXTRA_CFLAGS='-g -O0' ARCH= CROSS_COMPILE= \
  122. OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \
  123. DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers
  124. endif
  125. $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
  126. ifeq ($(VMLINUX_H),)
  127. $(call msg,GEN,,$@)
  128. $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
  129. else
  130. $(call msg,CP,,$@)
  131. $(Q)cp "$(VMLINUX_H)" $@
  132. endif
  133. $(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids \
  134. $(TOOLSDIR)/bpf/resolve_btfids/main.c \
  135. $(TOOLSDIR)/lib/rbtree.c \
  136. $(TOOLSDIR)/lib/zalloc.c \
  137. $(TOOLSDIR)/lib/string.c \
  138. $(TOOLSDIR)/lib/ctype.c \
  139. $(TOOLSDIR)/lib/str_error_r.c
  140. $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \
  141. CC=$(HOSTCC) LD=$(HOSTLD) AR=$(HOSTAR) \
  142. LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \
  143. OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ)
  144. # Get Clang's default includes on this system, as opposed to those seen by
  145. # '--target=bpf'. This fixes "missing" files on some architectures/distros,
  146. # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
  147. #
  148. # Use '-idirafter': Don't interfere with include mechanics except where the
  149. # build would have failed anyways.
  150. define get_sys_includes
  151. $(shell $(1) -v -E - </dev/null 2>&1 \
  152. | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
  153. $(shell $(1) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
  154. endef
  155. # Determine target endianness.
  156. IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
  157. grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
  158. MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
  159. CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
  160. BPF_CFLAGS = -g -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \
  161. -I$(INCLUDE_DIR)
  162. CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
  163. -Wno-compare-distinct-pointer-types
  164. # Build BPF object using Clang
  165. # $1 - input .c file
  166. # $2 - output .o file
  167. # $3 - CFLAGS
  168. define CLANG_BPF_BUILD_RULE
  169. $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2)
  170. $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v3 -o $2
  171. endef
  172. # Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32
  173. define CLANG_NOALU32_BPF_BUILD_RULE
  174. $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2)
  175. $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v2 -o $2
  176. endef
  177. # Build BPF object using GCC
  178. define GCC_BPF_BUILD_RULE
  179. $(call msg,GCC-BPF,$(TRUNNER_BINARY),$2)
  180. $(Q)$(BPF_GCC) $3 -O2 -c $1 -o $2
  181. endef
  182. BPF_PROGS_DIR := progs
  183. BPF_BUILD_RULE := CLANG_BPF_BUILD_RULE
  184. BPF_SRCS := $(notdir $(wildcard $(BPF_PROGS_DIR)/*.c))
  185. BPF_OBJS := $(patsubst %.c,$(OUTPUT)/%.bpf.o, $(BPF_SRCS))
  186. BPF_SKELS := $(patsubst %.c,$(OUTPUT)/%.skel.h, $(BPF_SRCS))
  187. TEST_GEN_FILES += $(BPF_OBJS)
  188. $(BPF_PROGS_DIR)-bpfobjs := y
  189. $(BPF_OBJS): $(OUTPUT)/%.bpf.o: \
  190. $(BPF_PROGS_DIR)/%.c \
  191. $(wildcard $(BPF_PROGS_DIR)/*.h) \
  192. $(INCLUDE_DIR)/vmlinux.h \
  193. $(wildcard $(BPFDIR)/hid_bpf_*.h) \
  194. $(wildcard $(BPFDIR)/*.bpf.h) \
  195. | $(OUTPUT) $(BPFOBJ)
  196. $(call $(BPF_BUILD_RULE),$<,$@, $(BPF_CFLAGS))
  197. $(BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(OUTPUT)
  198. $(call msg,GEN-SKEL,$(BINARY),$@)
  199. $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $<
  200. $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked1.o) name $(notdir $(<:.bpf.o=)) > $@
  201. $(OUTPUT)/%.o: %.c $(BPF_SKELS)
  202. $(call msg,CC,,$@)
  203. $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@
  204. $(OUTPUT)/%: $(OUTPUT)/%.o
  205. $(call msg,BINARY,,$@)
  206. $(Q)$(LINK.c) $^ $(LDLIBS) -o $@
  207. EXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) feature bpftool \
  208. $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32)