[PATCH v1 08/14] perf build: Pre-generate BPF skeletons during umbrella prepare phase

From: Ian Rogers

Date: Tue May 12 2026 - 01:50:58 EST


Currently, BPF skeleton generation rules (bpf_skel.mak) are evaluated as
part of util/Build. However, because LIBPERF_UTIL_IN explicitly depends
on the top-level static libbpf archive, Make completely blocked the
execution of bpftool bootstrap and skeleton generation until libbpf
finished compiling midway through the build.

Since bpftool bootstrap compiles its own independent copy of libbpf.a, it
does not depend on the top-level libbpf target.

Decouple early skeleton tooling generation by attaching bpf-skel-prepare
to the umbrella prepare target, exporting CONFIG_PERF_BPF_SKEL to ensure
accurate feature propagation. This allows Make to compile bpftool and
dump vmlinux.h in the background at build startup, eliminating the initial
sub-make startup bottleneck before BPF object compilation while keeping
100% of tooling rules perfectly encapsulated in bpf_skel.mak. Provide an
empty fallback target to ensure builds succeed when BPF skeletons are
disabled.

Assisted-by: Gemini:gemini-3.1-pro-preview
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/Makefile.perf | 6 +++++-
tools/perf/bpf_skel.mak | 8 ++++++++
2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 5af767415c11..df68d29ecab7 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -275,7 +275,7 @@ ifeq ($(PYLINT),1)
endif

export srctree OUTPUT RM CC CXX RUSTC CLANG LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK LIBBPF READELF
-export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT
+export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT CONFIG_PERF_BPF_SKEL

include $(srctree)/tools/build/Makefile.include

@@ -629,8 +629,12 @@ endif
__build-dir = $(subst $(OUTPUT),,$(dir $@))
build-dir = $(or $(__build-dir),.)

+bpf-skel-prepare:
+ $(Q)$(MAKE) -f bpf_skel.mak bpf-skel-prepare
+
prepare: $(OUTPUT)PERF-VERSION-FILE \
arm64-sysreg-defs \
+ bpf-skel-prepare \
$(LIBAPI) \
$(LIBPERF) \
$(LIBSUBCMD) \
diff --git a/tools/perf/bpf_skel.mak b/tools/perf/bpf_skel.mak
index ded578b9570c..c4340a218323 100644
--- a/tools/perf/bpf_skel.mak
+++ b/tools/perf/bpf_skel.mak
@@ -16,6 +16,10 @@ BPFTOOL := $(SKEL_TOOL_TMP_OUT)/bootstrap/bpftool
VMLINUX_H := $(SKEL_TOOL_OUT)/vmlinux.h
bpf_skel_deps := $(BPFTOOL) $(VMLINUX_H)

+.PHONY: bpf-skel-prepare
+bpf-skel-prepare: $(bpf_skel_deps)
+ @:
+
define get_sys_includes
$(shell $(1) $(2) -v -E - </dev/null 2>&1 \
| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \
@@ -94,6 +98,10 @@ $(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o $(BPFTOOL)

.PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o

+else # CONFIG_PERF_BPF_SKEL
+.PHONY: bpf-skel-prepare
+bpf-skel-prepare:
+ @:
endif # CONFIG_PERF_BPF_SKEL

clean:
--
2.54.0.563.g4f69b47b94-goog