On 2026-10-11 19:36:41-0400, Sasha Levin wrote: (...) > Assisted-by: LLM > Signed-off-by: Sasha Levin <[email protected]> > --- > .gitignore | 5 +++ > Makefile | 8 ++++- > lib/Kconfig.debug | 2 ++ > tools/Kconfig | 72 +++++++++++++++++++++++++++++++++++++++ > tools/Makefile.kbuild | 79 +++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 165 insertions(+), 1 deletion(-) > create mode 100644 tools/Kconfig > create mode 100644 tools/Makefile.kbuild
(...) > diff --git a/tools/Kconfig b/tools/Kconfig > new file mode 100644 > index 0000000000000..bf0643b39b86e > --- /dev/null > +++ b/tools/Kconfig > @@ -0,0 +1,72 @@ > +# SPDX-License-Identifier: GPL-2.0-only > + > +config TOOLS_BUILD_ABI > + def_bool X86_64 || ARM64 > + > +config TOOLS_BUILD_GLIBC > + def_bool $(success,echo '#include <features.h>' | $(CC) $(CLANG_FLAGS) > $(USERCFLAGS) -E -dM -x c - | grep -q __GLIBC__) > + > +menuconfig TOOLS_BUILD > + bool "Build userspace tools from tools/" > + depends on CC_CAN_LINK && !UML Why !UML? > + depends on TOOLS_BUILD_ABI && TOOLS_BUILD_GLIBC These dependencies could be on separate lines, it will reduce churn when they get modified. > + help > + Build the selected programs under tools/ for the target together > + with the kernel, as part of "make all", or alone with > + "make tools_build". Each program is built by its own build system > + into tools-build/ in the object tree. The tools then always match > + the kernel they were built with, and a change that breaks one of > + them shows up in the same build that compiles the kernel. > + > + This needs a compiler that can link glibc programs for the target, > + and is currently limited to x86_64 and arm64. > + > + If unsure, say N. (...) > diff --git a/tools/Makefile.kbuild b/tools/Makefile.kbuild > new file mode 100644 > index 0000000000000..820a2d9a3893b > --- /dev/null > +++ b/tools/Makefile.kbuild > @@ -0,0 +1,79 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +# > +# Builds the userspace programs selected in tools/Kconfig for the target. > +# Invoked by "make tools_build", which "make all" runs when > CONFIG_TOOLS_BUILD > +# is set. Each program is built by its own build system, the way it is built > +# standalone, into $(objtree)/tools-build/. > + > +PHONY := __tools_build > +__tools_build: > + > +include include/config/auto.conf > + > +abs_srctree := $(realpath $(srctree)) > +toolsdir := $(abs_srctree)/tools > +outdir := $(CURDIR)/tools-build > + > +# kbuild's state and the user's compiler flags, from the environment or the > +# command line, would change how these build > +unexport srctree objtree srcroot VPATH building_out_of_srctree sub_make_done > +unexport CLANG_FLAGS INSTALL_HDR_PATH O > +unexport CFLAGS CPPFLAGS LDFLAGS EXTRA_CFLAGS EXTRA_LDFLAGS USERCFLAGS > USERLDFLAGS > +space := $(subst ,, ) > +overrides := $(subst \$(space),\@space@,$(MAKEOVERRIDES)) > +MAKEOVERRIDES := $(subst \@space@,\$(space),$(filter-out O=% CFLAGS=% > CPPFLAGS=% \ > + LDFLAGS=% EXTRA_CFLAGS=% EXTRA_LDFLAGS=% USERCFLAGS=% > USERLDFLAGS=%,$(overrides))) > + > +# Keep Python's bytecode caches out of the source tree > +export PYTHONDONTWRITEBYTECODE := 1 This should just be done in the toplevel Makefile IMO. > +# The compiler CONFIG_CC_CAN_LINK was tested with. The tools take linker > +# flags from LDFLAGS. > +tools-cc := $(CC) $(USERCFLAGS) $(KBUILD_USERABI) > +ifneq ($(USERLDFLAGS),) > +override LDFLAGS := $(USERLDFLAGS) > +export LDFLAGS > +endif (...)

