xref: /linux/tools/perf/bpf_skel.mak (revision 3d5e48944e824bddc20d7b874e784f7b279636fe)
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