Re: [PATCH 1/7] tools build: Only probe the compiler at parse time when it is installed

From: Ian Rogers

Date: Mon Aug 10 2026 - 14:07:59 EST


On Mon, Aug 10, 2026 at 8:44 AM Arnaldo Carvalho de Melo
<acme@xxxxxxxxxx> wrote:
>
> From: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
>
> Two parse-time probes still invoke $(CC) unconditionally:
>
> - LP64 in tools/scripts/Makefile.arch, probing with
> $(CC) -E -x c, pulled in twice by tools/perf/Makefile.perf;
> - CC_NO_CLANG in tools/scripts/Makefile.include, probing with
> $(CC) -dM -E -x c /dev/null.
>
> In the corner case where gcc is not yet installed, the very setup the
> install-build-deps target, added in the next patch of this series, is
> meant for, these probes make even targets that never compile parse-time
> spew errors like:
>
> /bin/sh: 1: gcc: not found
> /bin/sh: 1: gcc: not found
> /bin/sh: 1: gcc: not found
>
> Guard both probes with 'command -v' using the first word of CC so a
> missing compiler is handled silently with the same result as a failing
> probe (CC_NO_CLANG and LP64 unset/0), and with no behavior change when
> the compiler is installed.
>
> Only the first word is consulted because CC may carry arguments such as
> 'ccache gcc', and shell implementations differ in how 'command -v'
> handles multiple words (dash only checks the first, bash any of them),
> so validating the whole CC value would silently disable both probes on
> some make SHELLs.
>
> Assisted-by: opencode:deepseek-v4-flash-free
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> ---
> tools/scripts/Makefile.arch | 2 +-
> tools/scripts/Makefile.include | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tools/scripts/Makefile.arch b/tools/scripts/Makefile.arch
> index eabfe9f411d914b9..e0bca6808ec44ed8 100644
> --- a/tools/scripts/Makefile.arch
> +++ b/tools/scripts/Makefile.arch
> @@ -38,7 +38,7 @@ ifeq ($(ARCH),loongarch64)
> SRCARCH := loongarch
> endif
>
> -LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
> +LP64 := $(shell if command -v $(firstword ${CC}) >/dev/null 2>&1; then echo __LP64__ | ${CC} ${CFLAGS} -E -x c -; fi | tail -n 1)

nit: It might be worth adding a comment to explain this fairly complex
one-liner.
As there are minimum requirements to build the kernel
(https://www.kernel.org/doc/html/latest/process/changes.html) does it
make sense to be defensive about CC not being installed?
Perhaps install-build-deps.sh can be part of the wider kernel build
with flags to specify if you are building the kernel or a tool, where
depencies are different (e.g. perf doesn't need quota-tools but
libcapstone is useful).

Thanks,
Ian


> ifeq ($(LP64), 1)
> IS_64_BIT := 1
> else
> diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
> index 46a3872b87624a7b..fff453aac187536e 100644
> --- a/tools/scripts/Makefile.include
> +++ b/tools/scripts/Makefile.include
> @@ -98,7 +98,7 @@ else
> $(call allow-override,LLVM_STRIP,llvm-strip)
> endif
>
> -CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
> +CC_NO_CLANG := $(shell if command -v $(firstword $(CC)) >/dev/null 2>&1; then $(CC) -dM -E -x c /dev/null; fi | grep -Fq "__clang__"; echo $$?)
>
> # Some tools require bpftool
> SYSTEM_BPFTOOL ?= bpftool
> --
> 2.55.0
>