1# SPDX-License-Identifier: GPL-2.0 2# Shared BPF Skeleton Generator Rules 3 4include $(srctree)/tools/scripts/Makefile.include 5 6# Shared foundational tooling always lives in util/bpf_skel 7SKEL_TOOL_OUT := $(abspath $(OUTPUT)util/bpf_skel) 8SKEL_TOOL_TMP_OUT := $(abspath $(SKEL_TOOL_OUT)/.tmp) 9 10# Component specific output lives in $(dir)/bpf_skel 11SKEL_OUT := $(abspath $(OUTPUT)$(dir)/bpf_skel) 12SKEL_TMP_OUT := $(abspath $(SKEL_OUT)/.tmp) 13 14ifeq ($(CONFIG_PERF_BPF_SKEL),y) 15BPFTOOL := $(SKEL_TOOL_TMP_OUT)/bootstrap/bpftool 16VMLINUX_H := $(SKEL_TOOL_OUT)/vmlinux.h 17 18.PHONY: bpf-skel-prepare 19bpf-skel-prepare: $(BPFTOOL) $(VMLINUX_H) 20 @: 21 22define get_sys_includes 23$(shell $(1) $(2) -v -E - </dev/null 2>&1 \ 24 | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ 25$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}') 26endef 27 28ifneq ($(CROSS_COMPILE),) 29CLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%)) 30endif 31 32CLANG_OPTIONS = -Wall -mcpu=v3 33CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) 34LIBBPF_INCLUDE := $(abspath $(or $(OUTPUT),.))/libbpf/include 35BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(SKEL_TOOL_OUT) -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) 36TOOLS_UAPI_INCLUDE := -I$(srctree)/tools/include/uapi 37 38ifneq ($(WERROR),0) 39 CLANG_OPTIONS += -Werror 40endif 41 42$(BPFTOOL): 43 $(Q)mkdir -p $(SKEL_TOOL_TMP_OUT) 44 $(Q)CFLAGS= $(MAKE) -C ../bpf/bpftool OUTPUT=$(SKEL_TOOL_TMP_OUT)/ bootstrap 45 46# Paths to search for a kernel to generate vmlinux.h from. 47VMLINUX_BTF_ELF_PATHS ?= $(if $(O),$(O)/vmlinux) \ 48 $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 49 ../../vmlinux \ 50 /boot/vmlinux-$(shell uname -r) 51 52# Paths to BTF information. 53VMLINUX_BTF_BTF_PATHS ?= /sys/kernel/btf/vmlinux 54 55# Filter out kernels that don't exist or without a BTF section. 56VMLINUX_BTF_ELF_ABSPATHS ?= $(abspath $(wildcard $(VMLINUX_BTF_ELF_PATHS))) 57VMLINUX_BTF_PATHS ?= $(shell for file in $(VMLINUX_BTF_ELF_ABSPATHS); \ 58 do \ 59 if [ -f $$file ] && ($(READELF) -S "$$file" | grep -q .BTF); \ 60 then \ 61 echo "$$file"; \ 62 fi; \ 63 done) \ 64 $(wildcard $(VMLINUX_BTF_BTF_PATHS)) 65 66# Select the first as the source of vmlinux.h. 67VMLINUX_BTF ?= $(firstword $(VMLINUX_BTF_PATHS)) 68 69ifeq ($(VMLINUX_H_FILE),) 70 ifeq ($(VMLINUX_BTF),) 71 $(error Missing bpftool input for generating vmlinux.h) 72 endif 73endif 74 75$(VMLINUX_H): $(VMLINUX_BTF) $(BPFTOOL) $(VMLINUX_H_FILE) 76 $(call rule_mkdir) 77ifeq ($(VMLINUX_H_FILE),) 78 $(QUIET_GEN)$(BPFTOOL) btf dump file $< format c > $@ 79else 80 $(Q)cp "$(VMLINUX_H_FILE)" $@ 81endif 82 83# Consolidated Pattern rule for $(dir)/bpf_skel/ 84$(SKEL_TMP_OUT)/%.bpf.o: $(srctree)/tools/perf/$(dir)/bpf_skel/%.bpf.c $(LIBBPF) $(VMLINUX_H) $(OUTPUT)PERF-VERSION-FILE util/bpf_skel/perf_version.h 85 $(call rule_mkdir) 86 $(QUIET_CLANG) 87 $(Q)$(CLANG) -g -O2 -fno-stack-protector --target=bpf \ 88 $(CLANG_OPTIONS) $(EXTRA_BPF_FLAGS) $(BPF_INCLUDE) $(TOOLS_UAPI_INCLUDE) \ 89 -include $(OUTPUT)PERF-VERSION-FILE -include util/bpf_skel/perf_version.h \ 90 -fms-extensions -Wno-microsoft-anon-tag \ 91 -c $< -o $@ 92 93$(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o $(BPFTOOL) 94 $(call rule_mkdir) 95 $(QUIET_GENSKEL) 96 $(Q)$(BPFTOOL) gen skeleton $< > $@ 97 98.PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o 99 100else # CONFIG_PERF_BPF_SKEL 101.PHONY: bpf-skel-prepare 102bpf-skel-prepare: 103 @: 104endif # CONFIG_PERF_BPF_SKEL 105 106clean: 107 $(call QUIET_CLEAN, bpf-skel) $(RM) -r $(SKEL_TOOL_TMP_OUT) $(OUTPUT)bench/bpf_skel/.tmp $(SKEL_TOOL_OUT)/*.skel.h $(OUTPUT)bench/bpf_skel/*.skel.h $(SKEL_TOOL_OUT)/vmlinux.h 108 109.PHONY: clean 110