[RFC] perf build: Use self-contained headers from kernel source when compiling

hupu posted 1 patch 2 months, 2 weeks ago
tools/perf/Makefile.perf | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 2 months, 2 weeks ago
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
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by Leo Yan 2 months, 1 week ago
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
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 2 months ago
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
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 2 months ago
RESEND for your attention.
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 1 month, 4 weeks ago
RESEND AGAIN

On Mon, Dec 8, 2025 at 5:04 PM hupu <hupu.gm@gmail.com> wrote:
>
> RESEND for your attention.
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 2 months, 2 weeks ago
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
Re: [RFC] perf build: Use self-contained headers from kernel source when compiling
Posted by hupu 2 months, 1 week ago
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