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

Arnaldo Carvalho de Melo <[email protected]>
Newsgroups org.kernel.vger.linux-perf-users,org.kernel.vger.linux-kernel
Message-ID <ans72o4MAC03XILw@x1>
On Mon, Aug 10, 2026 at 11:07:40AM -0700, Ian Rogers wrote:
> On Mon, Aug 10, 2026 at 8:44 AM Arnaldo Carvalho de Melo <[email protected]> wrote:
> > 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 <[email protected]>

> > +++ 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.

Sure, will add explanations, see below.

> 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?

Well, the point of this series is to install what is needed to build
perf, gcc included, so on a freshly installed machine the user can just
do:

cd tools/perf
make install-build-deps

And the machine will have all the packages that are needed.

> 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).

I think this can be a followup series, i.e. making the kernel have that
target as well.

Having it in perf will showcase its usability and may entice the Kbuild
guys to consider accepting such a functionality.

- Arnaldo

acme@number:~/git/perf-tools-next$ git diff ca62b23f83ddfb8e..
diff --git a/tools/scripts/Makefile.arch b/tools/scripts/Makefile.arch
index e0bca6808ec44ed8..ed5f008d400ed238 100644
--- a/tools/scripts/Makefile.arch
+++ b/tools/scripts/Makefile.arch
@@ -38,6 +38,12 @@ ifeq ($(ARCH),loongarch64)
        SRCARCH := loongarch
 endif

+# Probe for __LP64__ only when the compiler is installed: this runs at
+# parse time for every target, including ones that never compile, e.g.
+# install-build-deps, and would otherwise spew "gcc: not found" when the
+# compiler is not yet installed. Only the first word of CC is consulted,
+# as CC may carry arguments, e.g. 'ccache gcc'. When the guard fails it
+# prints nothing, leaving LP64 unset, as if the probe had failed.
 LP64 := $(shell if command -v $(firstword ${CC}) >/dev/null 2>&1; then echo __LP64__ | ${CC} ${CFLAGS} -E -x c -; fi | tail -n 1)
 ifeq ($(LP64), 1)
   IS_64_BIT := 1
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
index fff453aac187536e..378387f629603e92 100644
--- a/tools/scripts/Makefile.include
+++ b/tools/scripts/Makefile.include
@@ -98,6 +98,12 @@ else
   $(call allow-override,LLVM_STRIP,llvm-strip)
 endif

+# The CC_NO_CLANG probe also runs at parse time for targets that never
+# compile, so guard it with 'command -v': when the compiler is not yet
+# installed, e.g. the first install-build-deps run, it would otherwise
+# spew "gcc: not found". Only the first word of CC is consulted, as CC
+# may carry arguments, e.g. 'ccache gcc'. A missing compiler leaves
+# CC_NO_CLANG at 1, as if the probe had failed.
 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
acme@number:~/git/perf-tools-next$
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.