Makefile 8.2 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. msg =
  37. else
  38. msg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))";
  39. MAKEFLAGS += --no-print-directory
  40. submake_extras := feature_display=0
  41. endif
  42. # override lib.mk's default rules
  43. OVERRIDE_TARGETS := 1
  44. override define CLEAN
  45. $(call msg,CLEAN)
  46. $(Q)$(RM) -r $(TEST_GEN_PROGS)
  47. $(Q)$(RM) -r $(EXTRA_CLEAN)
  48. endef
  49. include ../lib.mk
  50. TOOLSDIR := $(top_srcdir)/tools
  51. LIBDIR := $(TOOLSDIR)/lib
  52. BPFDIR := $(LIBDIR)/bpf
  53. TOOLSINCDIR := $(TOOLSDIR)/include
  54. BPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool
  55. SCRATCH_DIR := $(OUTPUT)/tools
  56. BUILD_DIR := $(SCRATCH_DIR)/build
  57. INCLUDE_DIR := $(SCRATCH_DIR)/include
  58. BPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a
  59. ifneq ($(CROSS_COMPILE),)
  60. HOST_BUILD_DIR := $(BUILD_DIR)/host
  61. HOST_SCRATCH_DIR := $(OUTPUT)/host-tools
  62. HOST_INCLUDE_DIR := $(HOST_SCRATCH_DIR)/include
  63. else
  64. HOST_BUILD_DIR := $(BUILD_DIR)
  65. HOST_SCRATCH_DIR := $(SCRATCH_DIR)
  66. HOST_INCLUDE_DIR := $(INCLUDE_DIR)
  67. endif
  68. HOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a
  69. RESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids
  70. VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
  71. $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
  72. ../../../../vmlinux \
  73. /sys/kernel/btf/vmlinux \
  74. /boot/vmlinux-$(shell uname -r)
  75. VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
  76. ifeq ($(VMLINUX_BTF),)
  77. $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)")
  78. endif
  79. # Define simple and short `make test_progs`, `make test_sysctl`, etc targets
  80. # to build individual tests.
  81. # NOTE: Semicolon at the end is critical to override lib.mk's default static
  82. # rule for binaries.
  83. $(notdir $(TEST_GEN_PROGS)): %: $(OUTPUT)/% ;
  84. # sort removes libbpf duplicates when not cross-building
  85. MAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \
  86. $(HOST_BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/resolve_btfids \
  87. $(INCLUDE_DIR))
  88. $(MAKE_DIRS):
  89. $(call msg,MKDIR,,$@)
  90. $(Q)mkdir -p $@
  91. # LLVM's ld.lld doesn't support all the architectures, so use it only on x86
  92. ifeq ($(SRCARCH),x86)
  93. LLD := lld
  94. else
  95. LLD := ld
  96. endif
  97. DEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool
  98. TEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPFTOOL)
  99. $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ)
  100. BPFTOOL ?= $(DEFAULT_BPFTOOL)
  101. $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
  102. $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool
  103. $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \
  104. ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \
  105. EXTRA_CFLAGS='-g -O0' \
  106. OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \
  107. LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \
  108. LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/ \
  109. prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin
  110. $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
  111. | $(BUILD_DIR)/libbpf
  112. $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \
  113. EXTRA_CFLAGS='-g -O0' \
  114. DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
  115. ifneq ($(BPFOBJ),$(HOST_BPFOBJ))
  116. $(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
  117. | $(HOST_BUILD_DIR)/libbpf
  118. $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \
  119. EXTRA_CFLAGS='-g -O0' ARCH= CROSS_COMPILE= \
  120. OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \
  121. DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers
  122. endif
  123. $(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
  124. ifeq ($(VMLINUX_H),)
  125. $(call msg,GEN,,$@)
  126. $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
  127. else
  128. $(call msg,CP,,$@)
  129. $(Q)cp "$(VMLINUX_H)" $@
  130. endif
  131. $(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids \
  132. $(TOOLSDIR)/bpf/resolve_btfids/main.c \
  133. $(TOOLSDIR)/lib/rbtree.c \
  134. $(TOOLSDIR)/lib/zalloc.c \
  135. $(TOOLSDIR)/lib/string.c \
  136. $(TOOLSDIR)/lib/ctype.c \
  137. $(TOOLSDIR)/lib/str_error_r.c
  138. $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \
  139. CC=$(HOSTCC) LD=$(HOSTLD) AR=$(HOSTAR) \
  140. LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \
  141. OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ)
  142. # Get Clang's default includes on this system, as opposed to those seen by
  143. # '--target=bpf'. This fixes "missing" files on some architectures/distros,
  144. # such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
  145. #
  146. # Use '-idirafter': Don't interfere with include mechanics except where the
  147. # build would have failed anyways.
  148. define get_sys_includes
  149. $(shell $(1) -v -E - </dev/null 2>&1 \
  150. | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
  151. $(shell $(1) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}')
  152. endef
  153. # Determine target endianness.
  154. IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \
  155. grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__')
  156. MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
  157. CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
  158. BPF_CFLAGS = -g -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \
  159. -Wno-microsoft-anon-tag \
  160. -fms-extensions \
  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) hid_common.h
  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)