| 1 |
|
| 2 |
|
| 3 | HID_SAMPLES_PATH ?= $(abspath $(src))
|
| 4 | TOOLS_PATH := $(HID_SAMPLES_PATH)/../../tools
|
| 5 |
|
| 6 | pound := \#
|
| 7 |
|
| 8 |
|
| 9 | tprogs-y += hid_mouse
|
| 10 | tprogs-y += hid_surface_dial
|
| 11 |
|
| 12 |
|
| 13 | LIBBPF_SRC = $(TOOLS_PATH)/lib/bpf
|
| 14 | LIBBPF_OUTPUT = $(abspath $(HID_SAMPLES_PATH))/libbpf
|
| 15 | LIBBPF_DESTDIR = $(LIBBPF_OUTPUT)
|
| 16 | LIBBPF_INCLUDE = $(LIBBPF_DESTDIR)/include
|
| 17 | LIBBPF = $(LIBBPF_OUTPUT)/libbpf.a
|
| 18 |
|
| 19 | EXTRA_BPF_HEADERS := hid_bpf_helpers.h
|
| 20 |
|
| 21 | hid_mouse-objs := hid_mouse.o
|
| 22 | hid_surface_dial-objs := hid_surface_dial.o
|
| 23 |
|
| 24 |
|
| 25 | always-y := $(tprogs-y)
|
| 26 |
|
| 27 | ifeq ($(ARCH), arm)
|
| 28 |
|
| 29 |
|
| 30 | ARM_ARCH_SELECTOR := $(filter -D__LINUX_ARM_ARCH__%, $(KBUILD_CFLAGS))
|
| 31 | BPF_EXTRA_CFLAGS := $(ARM_ARCH_SELECTOR)
|
| 32 | TPROGS_CFLAGS += $(ARM_ARCH_SELECTOR)
|
| 33 | endif
|
| 34 |
|
| 35 | ifeq ($(ARCH), mips)
|
| 36 | TPROGS_CFLAGS += -D__SANE_USERSPACE_TYPES__
|
| 37 | ifdef CONFIG_MACH_LOONGSON64
|
| 38 | BPF_EXTRA_CFLAGS += -I$(srctree)/arch/mips/include/asm/mach-loongson64
|
| 39 | BPF_EXTRA_CFLAGS += -I$(srctree)/arch/mips/include/asm/mach-generic
|
| 40 | endif
|
| 41 | endif
|
| 42 |
|
| 43 | COMMON_CFLAGS += -Wall -O2
|
| 44 | COMMON_CFLAGS += -Wmissing-prototypes
|
| 45 | COMMON_CFLAGS += -Wstrict-prototypes
|
| 46 |
|
| 47 | TPROGS_CFLAGS += $(COMMON_CFLAGS)
|
| 48 | TPROGS_CFLAGS += -I$(objtree)/usr/include
|
| 49 | TPROGS_CFLAGS += -I$(LIBBPF_INCLUDE)
|
| 50 | TPROGS_CFLAGS += -I$(srctree)/tools/include
|
| 51 |
|
| 52 | ifdef SYSROOT
|
| 53 | COMMON_CFLAGS += --sysroot=$(SYSROOT)
|
| 54 | TPROGS_LDFLAGS := -L$(SYSROOT)/usr/lib
|
| 55 | endif
|
| 56 |
|
| 57 | TPROGS_LDLIBS += $(LIBBPF) -lelf -lz
|
| 58 |
|
| 59 |
|
| 60 |
|
| 61 | LLC ?= llc
|
| 62 | CLANG ?= clang
|
| 63 | OPT ?= opt
|
| 64 | LLVM_DIS ?= llvm-dis
|
| 65 | LLVM_OBJCOPY ?= llvm-objcopy
|
| 66 | LLVM_READELF ?= llvm-readelf
|
| 67 | BTF_PAHOLE ?= pahole
|
| 68 |
|
| 69 |
|
| 70 | ifdef CROSS_COMPILE
|
| 71 | CLANG_ARCH_ARGS = --target=$(notdir $(CROSS_COMPILE:%-=%))
|
| 72 | endif
|
| 73 |
|
| 74 |
|
| 75 | ifneq ($(src),)
|
| 76 | HDR_PROBE := $(shell printf "$(pound)include <linux/types.h>\n struct list_head { int a; }; int main() { return 0; }" | \
|
| 77 | $(CC) $(TPROGS_CFLAGS) $(TPROGS_LDFLAGS) -x c - \
|
| 78 | -o /dev/null 2>/dev/null && echo okay)
|
| 79 |
|
| 80 | ifeq ($(HDR_PROBE),)
|
| 81 | $(warning WARNING: Detected possible issues with include path.)
|
| 82 | $(warning WARNING: Please install kernel headers locally (make headers_install).)
|
| 83 | endif
|
| 84 |
|
| 85 | BTF_LLC_PROBE := $(shell $(LLC) -march=bpf -mattr=help 2>&1 | grep dwarfris)
|
| 86 | BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help 2>&1 | grep BTF)
|
| 87 | BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --help 2>&1 | grep -i 'usage.*llvm')
|
| 88 | BTF_LLVM_PROBE := $(shell echo "int main() { return 0; }" | \
|
| 89 | $(CLANG) --target=bpf -O2 -g -c -x c - -o ./llvm_btf_verify.o; \
|
| 90 | $(LLVM_READELF) -S ./llvm_btf_verify.o | grep BTF; \
|
| 91 | /bin/rm -f ./llvm_btf_verify.o)
|
| 92 |
|
| 93 | BPF_EXTRA_CFLAGS += -fno-stack-protector
|
| 94 | ifneq ($(BTF_LLVM_PROBE),)
|
| 95 | BPF_EXTRA_CFLAGS += -g
|
| 96 | else
|
| 97 | ifneq ($(and $(BTF_LLC_PROBE),$(BTF_PAHOLE_PROBE),$(BTF_OBJCOPY_PROBE)),)
|
| 98 | BPF_EXTRA_CFLAGS += -g
|
| 99 | LLC_FLAGS += -mattr=dwarfris
|
| 100 | DWARF2BTF = y
|
| 101 | endif
|
| 102 | endif
|
| 103 | endif
|
| 104 |
|
| 105 |
|
| 106 | all:
|
| 107 | $(MAKE) -C ../../ M=$(CURDIR) HID_SAMPLES_PATH=$(CURDIR)
|
| 108 |
|
| 109 | clean:
|
| 110 | $(MAKE) -C ../../ M=$(CURDIR) clean
|
| 111 | @find $(CURDIR) -type f -name '*~' -delete
|
| 112 | @$(RM) -r $(CURDIR)/libbpf $(CURDIR)/bpftool
|
| 113 |
|
| 114 | $(LIBBPF): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(LIBBPF_OUTPUT)
|
| 115 |
|
| 116 | $(MAKE) -C $(LIBBPF_SRC) RM='rm -rf' EXTRA_CFLAGS="$(COMMON_CFLAGS)" \
|
| 117 | LDFLAGS=$(TPROGS_LDFLAGS) srctree=$(HID_SAMPLES_PATH)/../../ \
|
| 118 | O= OUTPUT=$(LIBBPF_OUTPUT)/ DESTDIR=$(LIBBPF_DESTDIR) prefix= \
|
| 119 | $@ install_headers
|
| 120 |
|
| 121 | BPFTOOLDIR := $(TOOLS_PATH)/bpf/bpftool
|
| 122 | BPFTOOL_OUTPUT := $(abspath $(HID_SAMPLES_PATH))/bpftool
|
| 123 | BPFTOOL := $(BPFTOOL_OUTPUT)/bootstrap/bpftool
|
| 124 | $(BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) | $(BPFTOOL_OUTPUT)
|
| 125 | $(MAKE) -C $(BPFTOOLDIR) srctree=$(HID_SAMPLES_PATH)/../../ \
|
| 126 | OUTPUT=$(BPFTOOL_OUTPUT)/ bootstrap
|
| 127 |
|
| 128 | $(LIBBPF_OUTPUT) $(BPFTOOL_OUTPUT):
|
| 129 | $(call msg,MKDIR,$@)
|
| 130 | $(Q)mkdir -p $@
|
| 131 |
|
| 132 | FORCE:
|
| 133 |
|
| 134 |
|
| 135 |
|
| 136 | .PHONY: verify_cmds verify_target_bpf $(CLANG) $(LLC)
|
| 137 |
|
| 138 | verify_cmds: $(CLANG) $(LLC)
|
| 139 | @for TOOL in $^ ; do \
|
| 140 | if ! (which -- "$${TOOL}" > /dev/null 2>&1); then \
|
| 141 | echo "*** ERROR: Cannot find LLVM tool $${TOOL}" ;\
|
| 142 | exit 1; \
|
| 143 | else true; fi; \
|
| 144 | done
|
| 145 |
|
| 146 | verify_target_bpf: verify_cmds
|
| 147 | @if ! (${LLC} -march=bpf -mattr=help > /dev/null 2>&1); then \
|
| 148 | echo "*** ERROR: LLVM (${LLC}) does not support 'bpf' target" ;\
|
| 149 | echo " NOTICE: LLVM version >= 3.7.1 required" ;\
|
| 150 | exit 2; \
|
| 151 | else true; fi
|
| 152 |
|
| 153 | $(HID_SAMPLES_PATH)/*.c: verify_target_bpf $(LIBBPF)
|
| 154 | $(src)/*.c: verify_target_bpf $(LIBBPF)
|
| 155 |
|
| 156 | libbpf_hdrs: $(LIBBPF)
|
| 157 |
|
| 158 | .PHONY: libbpf_hdrs
|
| 159 |
|
| 160 | $(obj)/hid_mouse.o: $(obj)/hid_mouse.skel.h
|
| 161 | $(obj)/hid_surface_dial.o: $(obj)/hid_surface_dial.skel.h
|
| 162 |
|
| 163 | -include $(HID_SAMPLES_PATH)/Makefile.target
|
| 164 |
|
| 165 | VMLINUX_BTF_PATHS ?= $(abspath $(if $(O),$(O)/vmlinux)) \
|
| 166 | $(abspath $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux)) \
|
| 167 | $(abspath $(objtree)/vmlinux)
|
| 168 | VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
| 169 |
|
| 170 | $(obj)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL)
|
| 171 | ifeq ($(VMLINUX_H),)
|
| 172 | ifeq ($(VMLINUX_BTF),)
|
| 173 | $(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)",\
|
| 174 | build the kernel or set VMLINUX_BTF or VMLINUX_H variable)
|
| 175 | endif
|
| 176 | $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
|
| 177 | else
|
| 178 | $(Q)cp "$(VMLINUX_H)" $@
|
| 179 | endif
|
| 180 |
|
| 181 | clean-files += vmlinux.h
|
| 182 |
|
| 183 |
|
| 184 |
|
| 185 |
|
| 186 |
|
| 187 |
|
| 188 |
|
| 189 | define get_sys_includes
|
| 190 | $(shell $(1) -v -E - </dev/null 2>&1 \
|
| 191 | | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
|
| 192 | $(shell $(1) -dM -E - </dev/null | grep '#define __riscv_xlen ' | sed 's/#define /-D/' | sed 's/ /=/')
|
| 193 | endef
|
| 194 |
|
| 195 | CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
|
| 196 |
|
| 197 | EXTRA_BPF_HEADERS_SRC := $(addprefix $(src)/,$(EXTRA_BPF_HEADERS))
|
| 198 |
|
| 199 | $(obj)/%.bpf.o: $(src)/%.bpf.c $(EXTRA_BPF_HEADERS_SRC) $(obj)/vmlinux.h
|
| 200 | @echo " CLANG-BPF " $@
|
| 201 | $(Q)$(CLANG) -g -O2 --target=bpf -D__TARGET_ARCH_$(SRCARCH) \
|
| 202 | -Wno-compare-distinct-pointer-types -I$(srctree)/include \
|
| 203 | -I$(srctree)/samples/bpf -I$(srctree)/tools/include \
|
| 204 | -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) \
|
| 205 | -c $(filter %.bpf.c,$^) -o $@
|
| 206 |
|
| 207 | LINKED_SKELS := hid_mouse.skel.h hid_surface_dial.skel.h
|
| 208 | clean-files += $(LINKED_SKELS)
|
| 209 |
|
| 210 | hid_mouse.skel.h-deps := hid_mouse.bpf.o
|
| 211 | hid_surface_dial.skel.h-deps := hid_surface_dial.bpf.o
|
| 212 |
|
| 213 | LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.bpf.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
|
| 214 |
|
| 215 | BPF_SRCS_LINKED := $(notdir $(wildcard $(src)/*.bpf.c))
|
| 216 | BPF_OBJS_LINKED := $(patsubst %.bpf.c,$(obj)/%.bpf.o, $(BPF_SRCS_LINKED))
|
| 217 | BPF_SKELS_LINKED := $(addprefix $(obj)/,$(LINKED_SKELS))
|
| 218 |
|
| 219 | $(BPF_SKELS_LINKED): $(BPF_OBJS_LINKED) $(BPFTOOL)
|
| 220 | @echo " BPF GEN-OBJ " $(@:.skel.h=)
|
| 221 | $(Q)$(BPFTOOL) gen object $(@:.skel.h=.lbpf.o) $(addprefix $(obj)/,$($(@F)-deps))
|
| 222 | @echo " BPF GEN-SKEL" $(@:.skel.h=)
|
| 223 | $(Q)$(BPFTOOL) gen skeleton $(@:.skel.h=.lbpf.o) name $(notdir $(@:.skel.h=)) > $@
|
| 224 |
|
| 225 |
|
| 226 |
|
| 227 |
|
| 228 |
|
| 229 |
|
| 230 |
|
| 231 |
|
| 232 |
|
| 233 | $(obj)/%.o: $(src)/%.c
|
| 234 | @echo " CLANG-bpf " $@
|
| 235 | $(Q)$(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(BPF_EXTRA_CFLAGS) \
|
| 236 | -I$(obj) -I$(srctree)/tools/testing/selftests/bpf/ \
|
| 237 | -I$(LIBBPF_INCLUDE) \
|
| 238 | -D__KERNEL__ -D__BPF_TRACING__ -Wno-unused-value -Wno-pointer-sign \
|
| 239 | -D__TARGET_ARCH_$(SRCARCH) -Wno-compare-distinct-pointer-types \
|
| 240 | -Wno-gnu-variable-sized-type-not-at-end \
|
| 241 | -Wno-address-of-packed-member -Wno-tautological-compare \
|
| 242 | -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \
|
| 243 | -fno-asynchronous-unwind-tables \
|
| 244 | -I$(srctree)/samples/hid/ \
|
| 245 | -O2 -emit-llvm -Xclang -disable-llvm-passes -c $< -o - | \
|
| 246 | $(OPT) -O2 -mtriple=bpf-pc-linux | $(LLVM_DIS) | \
|
| 247 | $(LLC) -march=bpf $(LLC_FLAGS) -filetype=obj -o $@
|
| 248 | ifeq ($(DWARF2BTF),y)
|
| 249 | $(BTF_PAHOLE) -J $@
|
| 250 | endif
|