162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci# based on tools/testing/selftest/bpf/Makefile 462306a36Sopenharmony_ciinclude ../../../build/Build.include 562306a36Sopenharmony_ciinclude ../../../scripts/Makefile.arch 662306a36Sopenharmony_ciinclude ../../../scripts/Makefile.include 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciTEST_PROGS := hid-core.sh 962306a36Sopenharmony_ciTEST_PROGS += hid-apple.sh 1062306a36Sopenharmony_ciTEST_PROGS += hid-gamepad.sh 1162306a36Sopenharmony_ciTEST_PROGS += hid-ite.sh 1262306a36Sopenharmony_ciTEST_PROGS += hid-keyboard.sh 1362306a36Sopenharmony_ciTEST_PROGS += hid-mouse.sh 1462306a36Sopenharmony_ciTEST_PROGS += hid-multitouch.sh 1562306a36Sopenharmony_ciTEST_PROGS += hid-sony.sh 1662306a36Sopenharmony_ciTEST_PROGS += hid-tablet.sh 1762306a36Sopenharmony_ciTEST_PROGS += hid-usb_crash.sh 1862306a36Sopenharmony_ciTEST_PROGS += hid-wacom.sh 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciCXX ?= $(CROSS_COMPILE)g++ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ciHOSTPKG_CONFIG := pkg-config 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciCFLAGS += -g -O0 -rdynamic -Wall -Werror -I$(KHDR_INCLUDES) -I$(OUTPUT) 2562306a36Sopenharmony_ciLDLIBS += -lelf -lz -lrt -lpthread 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci# Silence some warnings when compiled with clang 2862306a36Sopenharmony_ciifneq ($(LLVM),) 2962306a36Sopenharmony_ciCFLAGS += -Wno-unused-command-line-argument 3062306a36Sopenharmony_ciendif 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci# Order correspond to 'make run_tests' order 3362306a36Sopenharmony_ciTEST_GEN_PROGS = hid_bpf 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci# Emit succinct information message describing current building step 3662306a36Sopenharmony_ci# $1 - generic step name (e.g., CC, LINK, etc); 3762306a36Sopenharmony_ci# $2 - optional "flavor" specifier; if provided, will be emitted as [flavor]; 3862306a36Sopenharmony_ci# $3 - target (assumed to be file); only file name will be emitted; 3962306a36Sopenharmony_ci# $4 - optional extra arg, emitted as-is, if provided. 4062306a36Sopenharmony_ciifeq ($(V),1) 4162306a36Sopenharmony_ciQ = 4262306a36Sopenharmony_cimsg = 4362306a36Sopenharmony_cielse 4462306a36Sopenharmony_ciQ = @ 4562306a36Sopenharmony_cimsg = @printf ' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))"; 4662306a36Sopenharmony_ciMAKEFLAGS += --no-print-directory 4762306a36Sopenharmony_cisubmake_extras := feature_display=0 4862306a36Sopenharmony_ciendif 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci# override lib.mk's default rules 5162306a36Sopenharmony_ciOVERRIDE_TARGETS := 1 5262306a36Sopenharmony_cioverride define CLEAN 5362306a36Sopenharmony_ci $(call msg,CLEAN) 5462306a36Sopenharmony_ci $(Q)$(RM) -r $(TEST_GEN_PROGS) 5562306a36Sopenharmony_ci $(Q)$(RM) -r $(EXTRA_CLEAN) 5662306a36Sopenharmony_ciendef 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ciinclude ../lib.mk 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciTOOLSDIR := $(top_srcdir)/tools 6162306a36Sopenharmony_ciLIBDIR := $(TOOLSDIR)/lib 6262306a36Sopenharmony_ciBPFDIR := $(LIBDIR)/bpf 6362306a36Sopenharmony_ciTOOLSINCDIR := $(TOOLSDIR)/include 6462306a36Sopenharmony_ciBPFTOOLDIR := $(TOOLSDIR)/bpf/bpftool 6562306a36Sopenharmony_ciSCRATCH_DIR := $(OUTPUT)/tools 6662306a36Sopenharmony_ciBUILD_DIR := $(SCRATCH_DIR)/build 6762306a36Sopenharmony_ciINCLUDE_DIR := $(SCRATCH_DIR)/include 6862306a36Sopenharmony_ciKHDR_INCLUDES := $(SCRATCH_DIR)/uapi/include 6962306a36Sopenharmony_ciBPFOBJ := $(BUILD_DIR)/libbpf/libbpf.a 7062306a36Sopenharmony_ciifneq ($(CROSS_COMPILE),) 7162306a36Sopenharmony_ciHOST_BUILD_DIR := $(BUILD_DIR)/host 7262306a36Sopenharmony_ciHOST_SCRATCH_DIR := $(OUTPUT)/host-tools 7362306a36Sopenharmony_ciHOST_INCLUDE_DIR := $(HOST_SCRATCH_DIR)/include 7462306a36Sopenharmony_cielse 7562306a36Sopenharmony_ciHOST_BUILD_DIR := $(BUILD_DIR) 7662306a36Sopenharmony_ciHOST_SCRATCH_DIR := $(SCRATCH_DIR) 7762306a36Sopenharmony_ciHOST_INCLUDE_DIR := $(INCLUDE_DIR) 7862306a36Sopenharmony_ciendif 7962306a36Sopenharmony_ciHOST_BPFOBJ := $(HOST_BUILD_DIR)/libbpf/libbpf.a 8062306a36Sopenharmony_ciRESOLVE_BTFIDS := $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciVMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ 8362306a36Sopenharmony_ci $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 8462306a36Sopenharmony_ci ../../../../vmlinux \ 8562306a36Sopenharmony_ci /sys/kernel/btf/vmlinux \ 8662306a36Sopenharmony_ci /boot/vmlinux-$(shell uname -r) 8762306a36Sopenharmony_ciVMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) 8862306a36Sopenharmony_ciifeq ($(VMLINUX_BTF),) 8962306a36Sopenharmony_ci$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)") 9062306a36Sopenharmony_ciendif 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci# Define simple and short `make test_progs`, `make test_sysctl`, etc targets 9362306a36Sopenharmony_ci# to build individual tests. 9462306a36Sopenharmony_ci# NOTE: Semicolon at the end is critical to override lib.mk's default static 9562306a36Sopenharmony_ci# rule for binaries. 9662306a36Sopenharmony_ci$(notdir $(TEST_GEN_PROGS)): %: $(OUTPUT)/% ; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci# sort removes libbpf duplicates when not cross-building 9962306a36Sopenharmony_ciMAKE_DIRS := $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \ 10062306a36Sopenharmony_ci $(HOST_BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/resolve_btfids \ 10162306a36Sopenharmony_ci $(INCLUDE_DIR)) 10262306a36Sopenharmony_ci$(MAKE_DIRS): 10362306a36Sopenharmony_ci $(call msg,MKDIR,,$@) 10462306a36Sopenharmony_ci $(Q)mkdir -p $@ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci# LLVM's ld.lld doesn't support all the architectures, so use it only on x86 10762306a36Sopenharmony_ciifeq ($(SRCARCH),x86) 10862306a36Sopenharmony_ciLLD := lld 10962306a36Sopenharmony_cielse 11062306a36Sopenharmony_ciLLD := ld 11162306a36Sopenharmony_ciendif 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ciDEFAULT_BPFTOOL := $(HOST_SCRATCH_DIR)/sbin/bpftool 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ciTEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPFTOOL) 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciBPFTOOL ?= $(DEFAULT_BPFTOOL) 12062306a36Sopenharmony_ci$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ 12162306a36Sopenharmony_ci $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool 12262306a36Sopenharmony_ci $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ 12362306a36Sopenharmony_ci ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ 12462306a36Sopenharmony_ci EXTRA_CFLAGS='-g -O0' \ 12562306a36Sopenharmony_ci OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \ 12662306a36Sopenharmony_ci LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \ 12762306a36Sopenharmony_ci LIBBPF_DESTDIR=$(HOST_SCRATCH_DIR)/ \ 12862306a36Sopenharmony_ci prefix= DESTDIR=$(HOST_SCRATCH_DIR)/ install-bin 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci$(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ 13162306a36Sopenharmony_ci | $(BUILD_DIR)/libbpf 13262306a36Sopenharmony_ci $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) OUTPUT=$(BUILD_DIR)/libbpf/ \ 13362306a36Sopenharmony_ci EXTRA_CFLAGS='-g -O0' \ 13462306a36Sopenharmony_ci DESTDIR=$(SCRATCH_DIR) prefix= all install_headers 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ciifneq ($(BPFOBJ),$(HOST_BPFOBJ)) 13762306a36Sopenharmony_ci$(HOST_BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \ 13862306a36Sopenharmony_ci | $(HOST_BUILD_DIR)/libbpf 13962306a36Sopenharmony_ci $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ 14062306a36Sopenharmony_ci EXTRA_CFLAGS='-g -O0' ARCH= CROSS_COMPILE= \ 14162306a36Sopenharmony_ci OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \ 14262306a36Sopenharmony_ci DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers 14362306a36Sopenharmony_ciendif 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci$(INCLUDE_DIR)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR) 14662306a36Sopenharmony_ciifeq ($(VMLINUX_H),) 14762306a36Sopenharmony_ci $(call msg,GEN,,$@) 14862306a36Sopenharmony_ci $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@ 14962306a36Sopenharmony_cielse 15062306a36Sopenharmony_ci $(call msg,CP,,$@) 15162306a36Sopenharmony_ci $(Q)cp "$(VMLINUX_H)" $@ 15262306a36Sopenharmony_ciendif 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci$(KHDR_INCLUDES)/linux/hid.h: $(top_srcdir)/include/uapi/linux/hid.h 15562306a36Sopenharmony_ci $(MAKE) -C $(top_srcdir) INSTALL_HDR_PATH=$(SCRATCH_DIR)/uapi headers_install 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci$(RESOLVE_BTFIDS): $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/resolve_btfids \ 15862306a36Sopenharmony_ci $(TOOLSDIR)/bpf/resolve_btfids/main.c \ 15962306a36Sopenharmony_ci $(TOOLSDIR)/lib/rbtree.c \ 16062306a36Sopenharmony_ci $(TOOLSDIR)/lib/zalloc.c \ 16162306a36Sopenharmony_ci $(TOOLSDIR)/lib/string.c \ 16262306a36Sopenharmony_ci $(TOOLSDIR)/lib/ctype.c \ 16362306a36Sopenharmony_ci $(TOOLSDIR)/lib/str_error_r.c 16462306a36Sopenharmony_ci $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/resolve_btfids \ 16562306a36Sopenharmony_ci CC=$(HOSTCC) LD=$(HOSTLD) AR=$(HOSTAR) \ 16662306a36Sopenharmony_ci LIBBPF_INCLUDE=$(HOST_INCLUDE_DIR) \ 16762306a36Sopenharmony_ci OUTPUT=$(HOST_BUILD_DIR)/resolve_btfids/ BPFOBJ=$(HOST_BPFOBJ) 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci# Get Clang's default includes on this system, as opposed to those seen by 17062306a36Sopenharmony_ci# '--target=bpf'. This fixes "missing" files on some architectures/distros, 17162306a36Sopenharmony_ci# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc. 17262306a36Sopenharmony_ci# 17362306a36Sopenharmony_ci# Use '-idirafter': Don't interfere with include mechanics except where the 17462306a36Sopenharmony_ci# build would have failed anyways. 17562306a36Sopenharmony_cidefine get_sys_includes 17662306a36Sopenharmony_ci$(shell $(1) -v -E - </dev/null 2>&1 \ 17762306a36Sopenharmony_ci | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ 17862306a36Sopenharmony_ci$(shell $(1) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}') 17962306a36Sopenharmony_ciendef 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci# Determine target endianness. 18262306a36Sopenharmony_ciIS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - </dev/null | \ 18362306a36Sopenharmony_ci grep 'define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__') 18462306a36Sopenharmony_ciMENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciCLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) 18762306a36Sopenharmony_ciBPF_CFLAGS = -g -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ 18862306a36Sopenharmony_ci -I$(INCLUDE_DIR) 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ciCLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ 19162306a36Sopenharmony_ci -Wno-compare-distinct-pointer-types 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci# Build BPF object using Clang 19462306a36Sopenharmony_ci# $1 - input .c file 19562306a36Sopenharmony_ci# $2 - output .o file 19662306a36Sopenharmony_ci# $3 - CFLAGS 19762306a36Sopenharmony_cidefine CLANG_BPF_BUILD_RULE 19862306a36Sopenharmony_ci $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) 19962306a36Sopenharmony_ci $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v3 -o $2 20062306a36Sopenharmony_ciendef 20162306a36Sopenharmony_ci# Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32 20262306a36Sopenharmony_cidefine CLANG_NOALU32_BPF_BUILD_RULE 20362306a36Sopenharmony_ci $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) 20462306a36Sopenharmony_ci $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v2 -o $2 20562306a36Sopenharmony_ciendef 20662306a36Sopenharmony_ci# Build BPF object using GCC 20762306a36Sopenharmony_cidefine GCC_BPF_BUILD_RULE 20862306a36Sopenharmony_ci $(call msg,GCC-BPF,$(TRUNNER_BINARY),$2) 20962306a36Sopenharmony_ci $(Q)$(BPF_GCC) $3 -O2 -c $1 -o $2 21062306a36Sopenharmony_ciendef 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ciBPF_PROGS_DIR := progs 21362306a36Sopenharmony_ciBPF_BUILD_RULE := CLANG_BPF_BUILD_RULE 21462306a36Sopenharmony_ciBPF_SRCS := $(notdir $(wildcard $(BPF_PROGS_DIR)/*.c)) 21562306a36Sopenharmony_ciBPF_OBJS := $(patsubst %.c,$(OUTPUT)/%.bpf.o, $(BPF_SRCS)) 21662306a36Sopenharmony_ciBPF_SKELS := $(patsubst %.c,$(OUTPUT)/%.skel.h, $(BPF_SRCS)) 21762306a36Sopenharmony_ciTEST_GEN_FILES += $(BPF_OBJS) 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci$(BPF_PROGS_DIR)-bpfobjs := y 22062306a36Sopenharmony_ci$(BPF_OBJS): $(OUTPUT)/%.bpf.o: \ 22162306a36Sopenharmony_ci $(BPF_PROGS_DIR)/%.c \ 22262306a36Sopenharmony_ci $(wildcard $(BPF_PROGS_DIR)/*.h) \ 22362306a36Sopenharmony_ci $(INCLUDE_DIR)/vmlinux.h \ 22462306a36Sopenharmony_ci $(wildcard $(BPFDIR)/hid_bpf_*.h) \ 22562306a36Sopenharmony_ci $(wildcard $(BPFDIR)/*.bpf.h) \ 22662306a36Sopenharmony_ci | $(OUTPUT) $(BPFOBJ) 22762306a36Sopenharmony_ci $(call $(BPF_BUILD_RULE),$<,$@, $(BPF_CFLAGS)) 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci$(BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(OUTPUT) 23062306a36Sopenharmony_ci $(call msg,GEN-SKEL,$(BINARY),$@) 23162306a36Sopenharmony_ci $(Q)$(BPFTOOL) gen object $(<:.o=.linked1.o) $< 23262306a36Sopenharmony_ci $(Q)$(BPFTOOL) gen skeleton $(<:.o=.linked1.o) name $(notdir $(<:.bpf.o=)) > $@ 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci$(OUTPUT)/%.o: %.c $(BPF_SKELS) $(KHDR_INCLUDES)/linux/hid.h 23562306a36Sopenharmony_ci $(call msg,CC,,$@) 23662306a36Sopenharmony_ci $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) $(LDLIBS) -o $@ 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci$(OUTPUT)/%: $(OUTPUT)/%.o 23962306a36Sopenharmony_ci $(call msg,BINARY,,$@) 24062306a36Sopenharmony_ci $(Q)$(LINK.c) $^ $(LDLIBS) -o $@ 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ciEXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) feature bpftool \ 24362306a36Sopenharmony_ci $(addprefix $(OUTPUT)/,*.o *.skel.h no_alu32) 244