tools/perf/Makefile.perf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
When building perf, switch to using the self-contained headers provided
in the kernel source tree to avoid build failures caused by missing
architecture-specific headers. For example, the build may fail with
errors like:
/usr/include/linux/ioctl.h:5:10: fatal error: 'asm/ioctl.h' file not
found
5 | #include <asm/ioctl.h>
| ^~~~~~~~~~~~~
This issue may occur because system-installed headers are incomplete,
incompatible with the kernel version being built, or the corresponding
architecture-specific headers are not installed at all. Using the
self-contained headers from the kernel source ensures a consistent and
compatible build environment.
Signed-off-by: hupu <hupu.gm@gmail.com>
---
tools/perf/Makefile.perf | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 47c906b807ef..eaccaae87e3c 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -1202,7 +1202,9 @@ endif
CLANG_OPTIONS = -Wall
CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
-BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES)
+KHDR_INCLUDES := $(abspath $(OUTPUT)/../../usr/include)
+BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) \
+ -I$(KHDR_INCLUDES) $(CLANG_SYS_INCLUDES)
TOOLS_UAPI_INCLUDE := -I$(srctree)/tools/include/uapi
ifneq ($(WERROR),0)
--
2.43.0
On Mon, Nov 24, 2025 at 03:23:10PM +0800, hupu wrote: > When building perf, switch to using the self-contained headers provided > in the kernel source tree to avoid build failures caused by missing > architecture-specific headers. For example, the build may fail with > errors like: > > /usr/include/linux/ioctl.h:5:10: fatal error: 'asm/ioctl.h' file not > found > 5 | #include <asm/ioctl.h> > | ^~~~~~~~~~~~~ > > This issue may occur because system-installed headers are incomplete, > incompatible with the kernel version being built, or the corresponding > architecture-specific headers are not installed at all. Using the > self-contained headers from the kernel source ensures a consistent and > compatible build environment. > > Signed-off-by: hupu <hupu.gm@gmail.com> > --- > tools/perf/Makefile.perf | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf > index 47c906b807ef..eaccaae87e3c 100644 > --- a/tools/perf/Makefile.perf > +++ b/tools/perf/Makefile.perf > @@ -1202,7 +1202,9 @@ endif > > CLANG_OPTIONS = -Wall > CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) > -BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) > +KHDR_INCLUDES := $(abspath $(OUTPUT)/../../usr/include) This doesn't work if use the commands: make -j `nproc` Image O=$OUT make headers_install O=$OUT make O=$OUT -C tools/perf VF=1 CORESIGHT=1 DEBUG=1 Maybe it is good to search possible paths: $(abspath ../../usr/include) => Build in local folder $(abspath $(OUTPUT)usr/include) => Build in a specified folder > +BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) \ > + -I$(KHDR_INCLUDES) $(CLANG_SYS_INCLUDES) Why the issue only happens for eBPF skel build but not for perf binary build? As I said in another reply, I'd consolidate options for both cases. Thanks, Leo
Hi Leo, Thank you for your reply. On Wed, Nov 26, 2025 at 12:39 AM Leo Yan <leo.yan@arm.com> wrote: > [...] > > This doesn't work if use the commands: > > make -j `nproc` Image O=$OUT > make headers_install O=$OUT > make O=$OUT -C tools/perf VF=1 CORESIGHT=1 DEBUG=1 > Oh, yes, I followed the steps you provided and was able to reproduce the issue exactly as described. Thank you very much for pointing it out. > Maybe it is good to search possible paths: > > $(abspath ../../usr/include) => Build in local folder > $(abspath $(OUTPUT)usr/include) => Build in a specified folder > > > +BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) \ > > + -I$(KHDR_INCLUDES) $(CLANG_SYS_INCLUDES) > I agree with your suggestion, but I think the following search path order might be more suitable. diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 47c906b807ef..0f1113b8552c 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -1202,7 +1202,13 @@ endif CLANG_OPTIONS = -Wall CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) -BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) $(CLANG_SYS_INCLUDES) + +KHDR_INCLUDES := -I$(abspath $(OUTPUT)../../usr/include) \ +-I$(abspath $(OUTPUT)../../arch/$(SRCARCH)/include/generated/uapi) \ +-I$(abspath $(OUTPUT)../../arch/$(SRCARCH)/include/uapi) + +BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE) \ + $(KHDR_INCLUDES) $(CLANG_SYS_INCLUDES) TOOLS_UAPI_INCLUDE := -I$(srctree)/tools/include/uapi ifneq ($(WERROR),0) It’s worth noting that if the 'O=XXX' parameter is not specified during the build, the OUTPUT variable will be empty. In this case, the header files will be searched under the kernel source tree, which corresponds to the 'local folder' scenario you mentioned above. I have tested the patch in both scenarios below, and it works correctly in each case: Case 1: Build with 'O=$BUILD_DIR' specified make ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE Image O=$BUILD_DIR -j$JOBS make headers_install O=$BUILD_DIR make perf ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE O=$BUILD_DIR -j$JOBS Case 2: Build without O=$BUILD_DIR specified make ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE Image -j$JOBS make headers_install make perf ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE -j$JOBS > Why the issue only happens for eBPF skel build but not for perf binary > build? As I said in another reply, I'd consolidate options for both > cases. > Regarding your question — “Why does the issue only occur for eBPF skel build, but not for perf binary build?” — here is my personal opinion: As I mentioned in my previous reply (link below), eBPF skel and perf binary are built using different toolchains — clang for the former, and gcc or a cross-compilation toolchain for the latter. Without deliberate unification, they will naturally use different compiler options during the build process. https://lore.kernel.org/all/CADHxFxQ2kb2pRhn0-_PJwmo9pykHzDMJDPQay5GaqmmZF1nwSw@mail.gmail.com/#t Thanks, hupu
RESEND for your attention.
RESEND AGAIN On Mon, Dec 8, 2025 at 5:04 PM hupu <hupu.gm@gmail.com> wrote: > > RESEND for your attention.
Hi All Maintainers: The background of this PATCH is explained in the email linked below. To avoid potential disagreement from submitting multiple PATCHes in a single email, this email focuses solely on discussing whether to use self-contained headers from the kernel source when building perf. https://lore.kernel.org/all/20251013080609.2070555-1-hupu.gm@gmail.com/ Thanks, hupu
RESEND for attention. On Mon, Nov 24, 2025 at 3:51 PM hupu <hupu.gm@gmail.com> wrote: > > Hi All Maintainers: > > The background of this PATCH is explained in the email linked below. > To avoid potential disagreement from submitting multiple PATCHes in a > single email, this email focuses solely on discussing whether to use > self-contained headers from the kernel source when building perf. > > https://lore.kernel.org/all/20251013080609.2070555-1-hupu.gm@gmail.com/ > > Thanks, > hupu
© 2016 - 2026 Red Hat, Inc.