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