1713eeb22SIan Rogers# SPDX-License-Identifier: GPL-2.0 2713eeb22SIan Rogers# Shared BPF Skeleton Generator Rules 3713eeb22SIan Rogers 4713eeb22SIan Rogersinclude $(srctree)/tools/scripts/Makefile.include 5713eeb22SIan Rogers 6713eeb22SIan Rogers# Shared foundational tooling always lives in util/bpf_skel 7713eeb22SIan RogersSKEL_TOOL_OUT := $(abspath $(OUTPUT)util/bpf_skel) 8713eeb22SIan RogersSKEL_TOOL_TMP_OUT := $(abspath $(SKEL_TOOL_OUT)/.tmp) 9713eeb22SIan Rogers 10713eeb22SIan Rogers# Component specific output lives in $(dir)/bpf_skel 11713eeb22SIan RogersSKEL_OUT := $(abspath $(OUTPUT)$(dir)/bpf_skel) 12713eeb22SIan RogersSKEL_TMP_OUT := $(abspath $(SKEL_OUT)/.tmp) 13713eeb22SIan Rogers 14713eeb22SIan Rogersifeq ($(CONFIG_PERF_BPF_SKEL),y) 15713eeb22SIan RogersBPFTOOL := $(SKEL_TOOL_TMP_OUT)/bootstrap/bpftool 16713eeb22SIan RogersVMLINUX_H := $(SKEL_TOOL_OUT)/vmlinux.h 17713eeb22SIan Rogers 1832969ef6SIan Rogers.PHONY: bpf-skel-prepare 1932969ef6SIan Rogersbpf-skel-prepare: $(BPFTOOL) $(VMLINUX_H) 2032969ef6SIan Rogers @: 2132969ef6SIan Rogers 22713eeb22SIan Rogersdefine get_sys_includes 23713eeb22SIan Rogers$(shell $(1) $(2) -v -E - </dev/null 2>&1 \ 24713eeb22SIan Rogers | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ 25713eeb22SIan Rogers$(shell $(1) $(2) -dM -E - </dev/null | grep '__riscv_xlen ' | awk '{printf("-D__riscv_xlen=%d -D__BITS_PER_LONG=%d", $$3, $$3)}') 26713eeb22SIan Rogersendef 27713eeb22SIan Rogers 28713eeb22SIan Rogersifneq ($(CROSS_COMPILE),) 29713eeb22SIan RogersCLANG_TARGET_ARCH = --target=$(notdir $(CROSS_COMPILE:%-=%)) 30713eeb22SIan Rogersendif 31713eeb22SIan Rogers 32*4caadd04SSuchit KarunakaranCLANG_OPTIONS = -Wall -mcpu=v3 33713eeb22SIan RogersCLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) 34713eeb22SIan RogersLIBBPF_INCLUDE := $(abspath $(or $(OUTPUT),.))/libbpf/include 35713eeb22SIan RogersBPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(SKEL_TOOL_OUT) -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) 36713eeb22SIan RogersTOOLS_UAPI_INCLUDE := -I$(srctree)/tools/include/uapi 37713eeb22SIan Rogers 38713eeb22SIan Rogersifneq ($(WERROR),0) 39713eeb22SIan Rogers CLANG_OPTIONS += -Werror 40713eeb22SIan Rogersendif 41713eeb22SIan Rogers 429798ac01SIan Rogers$(BPFTOOL): 439798ac01SIan Rogers $(Q)mkdir -p $(SKEL_TOOL_TMP_OUT) 449798ac01SIan Rogers $(Q)CFLAGS= $(MAKE) -C ../bpf/bpftool OUTPUT=$(SKEL_TOOL_TMP_OUT)/ bootstrap 459798ac01SIan Rogers 469798ac01SIan Rogers# Paths to search for a kernel to generate vmlinux.h from. 479798ac01SIan RogersVMLINUX_BTF_ELF_PATHS ?= $(if $(O),$(O)/vmlinux) \ 489798ac01SIan Rogers $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ 499798ac01SIan Rogers ../../vmlinux \ 509798ac01SIan Rogers /boot/vmlinux-$(shell uname -r) 519798ac01SIan Rogers 529798ac01SIan Rogers# Paths to BTF information. 539798ac01SIan RogersVMLINUX_BTF_BTF_PATHS ?= /sys/kernel/btf/vmlinux 549798ac01SIan Rogers 559798ac01SIan Rogers# Filter out kernels that don't exist or without a BTF section. 569798ac01SIan RogersVMLINUX_BTF_ELF_ABSPATHS ?= $(abspath $(wildcard $(VMLINUX_BTF_ELF_PATHS))) 579798ac01SIan RogersVMLINUX_BTF_PATHS ?= $(shell for file in $(VMLINUX_BTF_ELF_ABSPATHS); \ 589798ac01SIan Rogers do \ 599798ac01SIan Rogers if [ -f $$file ] && ($(READELF) -S "$$file" | grep -q .BTF); \ 609798ac01SIan Rogers then \ 619798ac01SIan Rogers echo "$$file"; \ 629798ac01SIan Rogers fi; \ 639798ac01SIan Rogers done) \ 649798ac01SIan Rogers $(wildcard $(VMLINUX_BTF_BTF_PATHS)) 659798ac01SIan Rogers 669798ac01SIan Rogers# Select the first as the source of vmlinux.h. 679798ac01SIan RogersVMLINUX_BTF ?= $(firstword $(VMLINUX_BTF_PATHS)) 689798ac01SIan Rogers 699798ac01SIan Rogersifeq ($(VMLINUX_H_FILE),) 709798ac01SIan Rogers ifeq ($(VMLINUX_BTF),) 719798ac01SIan Rogers $(error Missing bpftool input for generating vmlinux.h) 729798ac01SIan Rogers endif 739798ac01SIan Rogersendif 749798ac01SIan Rogers 759798ac01SIan Rogers$(VMLINUX_H): $(VMLINUX_BTF) $(BPFTOOL) $(VMLINUX_H_FILE) 769798ac01SIan Rogers $(call rule_mkdir) 779798ac01SIan Rogersifeq ($(VMLINUX_H_FILE),) 789798ac01SIan Rogers $(QUIET_GEN)$(BPFTOOL) btf dump file $< format c > $@ 799798ac01SIan Rogerselse 809798ac01SIan Rogers $(Q)cp "$(VMLINUX_H_FILE)" $@ 819798ac01SIan Rogersendif 829798ac01SIan Rogers 83713eeb22SIan Rogers# Consolidated Pattern rule for $(dir)/bpf_skel/ 84713eeb22SIan Rogers$(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 85713eeb22SIan Rogers $(call rule_mkdir) 86713eeb22SIan Rogers $(QUIET_CLANG) 87713eeb22SIan Rogers $(Q)$(CLANG) -g -O2 -fno-stack-protector --target=bpf \ 88713eeb22SIan Rogers $(CLANG_OPTIONS) $(EXTRA_BPF_FLAGS) $(BPF_INCLUDE) $(TOOLS_UAPI_INCLUDE) \ 89713eeb22SIan Rogers -include $(OUTPUT)PERF-VERSION-FILE -include util/bpf_skel/perf_version.h \ 90713eeb22SIan Rogers -fms-extensions -Wno-microsoft-anon-tag \ 91713eeb22SIan Rogers -c $< -o $@ 92713eeb22SIan Rogers 93713eeb22SIan Rogers$(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o $(BPFTOOL) 94713eeb22SIan Rogers $(call rule_mkdir) 95713eeb22SIan Rogers $(QUIET_GENSKEL) 96713eeb22SIan Rogers $(Q)$(BPFTOOL) gen skeleton $< > $@ 97713eeb22SIan Rogers 98713eeb22SIan Rogers.PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o 999798ac01SIan Rogers 10032969ef6SIan Rogerselse # CONFIG_PERF_BPF_SKEL 10132969ef6SIan Rogers.PHONY: bpf-skel-prepare 10232969ef6SIan Rogersbpf-skel-prepare: 10332969ef6SIan Rogers @: 104713eeb22SIan Rogersendif # CONFIG_PERF_BPF_SKEL 1059798ac01SIan Rogers 1069798ac01SIan Rogersclean: 1079798ac01SIan Rogers $(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 1089798ac01SIan Rogers 1099798ac01SIan Rogers.PHONY: clean 110