Linux Perf Users
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: Nathan Chancellor <nathan@kernel.org>,
	Nicolas Schier <nsc@kernel.org>,
	linux-kbuild@vger.kernel.org
Cc: "Sasha Levin" <sashal@kernel.org>,
	"Shuah Khan" <shuah@kernel.org>,
	linux-kselftest@vger.kernel.org,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Ingo Molnar" <mingo@redhat.com>,
	"Arnaldo Carvalho de Melo" <acme@kernel.org>,
	"Namhyung Kim" <namhyung@kernel.org>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"Alexander Shishkin" <alexander.shishkin@linux.intel.com>,
	"Jiri Olsa" <jolsa@kernel.org>, "Ian Rogers" <irogers@google.com>,
	"Adrian Hunter" <adrian.hunter@intel.com>,
	"James Clark" <james.clark@linaro.org>,
	linux-perf-users@vger.kernel.org,
	"Thomas Weißschuh" <linux@weissschuh.net>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Thorsten Leemhuis" <linux@leemhuis.info>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v3 0/7] kbuild: build the userspace tools in tools/ with the kernel
Date: Sun,  1 Nov 2026 21:12:46 -0500	[thread overview]
Message-ID: <20261102021253.2545235-1-sashal@kernel.org> (raw)

The userspace programs under tools/ are disconnected from the rest of the
kernel's build system. Each has its own makefiles and build framework, and
"make" never builds them: apart from the few host tools the build itself needs,
such as objtool and resolve_btfids, nothing under tools/ is compiled as part of
a kernel build.

That makes them easy to break. Most people, and most of the build bots, check a
change with "make allmodconfig && make", which doesn't cover tools/ at all. A
change that breaks a tool passes every build check and is only noticed when
someone happens to build that tool by hand, often much later.

We keep seeing this in tools/testing/: selftests that stop building after a
change elsewhere in the tree, or after a backport to a stable tree, and stay
broken until someone tries to build them. Others brought up the same concern at
LPC.

This series lets the kernel build also build the tools it is configured for:

- tools/Kconfig adds a "Build userspace tools from tools/" menu
  (CONFIG_TOOLS_BUILD) with one entry per tool and per selftests
  directory, so .config records what gets built, and a tool that breaks
  can be turned off on its own.

- "make tools_build" builds the selected tools for the target, each with
  its own build system as it is built standalone, into tools-build/ in
  the object tree.

- With CONFIG_TOOLS_BUILD=y, "make all" builds them too. allmodconfig
  and allyesconfig enable every entry that applies to the target when
  the compiler can link glibc programs for it (currently x86_64 and
  arm64), so the usual build test catches tools breakage. Other
  toolchains are unaffected, as are "make vmlinux", "make modules" and
  external module builds.

This is useful beyond build testing: the tools are built for the same
target, from the same tree, as the kernel they go with.

The selftests need "selftests: lib.mk: define LINK.c, COMPILE.S and LINK.S
when make has none" [1], which is not in mainline yet. Without it, most of
them fail to build in tools_build.

I used LLM coding assistants to write and review these patches. I reviewed
and tested every change.

Changes in v3:
- Rebase onto v7.4-rc1 and drop the RFC prefix.
- 3/7: The perf-tools-next changes are in mainline now, so MINIMAL=1 sets
  NO_PYTHON_MODULE instead of NO_LIBPYTHON and also sets NO_MYPY and
  NO_PYLINT. This is the version that was posted on its own [2]. Add the
  Acked-by tags from Namhyung and Arnaldo.
- 4/7: Add Namhyung's Acked-by.
- 5/7: Add Shuah's Reviewed-by. Add entries for the selftests new in v7.4
  that build with only a C library: filesystems/configfs,
  filesystems/file_stressor, filesystems/freeze and nfsd.

Changes in v2:
- 1/7: Add Thomas's Reviewed-by.
- 2/7: Put each "depends on" condition on its own line. Allow UML: the
  tools are built for the architecture UML runs on (HEADER_ARCH), as
  their build systems do not know ARCH=um. Drop the
  PYTHONDONTWRITEBYTECODE export, as 5479e1a13b75 ("perf tools: Put
  Python bytecode in output directory") in perf-tools-next keeps perf's
  bytecode in its output directory.
- 3/7: New. Add MINIMAL=1 to perf, which turns off every optional
  feature, as Ian suggested.
- 4/7: Build perf with MINIMAL=1 instead of a list of NO_* variables.
- 5/7: As with "make kselftest-all", a selftest that fails to build no
  longer fails the build unless FORCE_TARGETS is set, and
  kselftest_deps.sh lists the libraries it needs that the compiler
  cannot link with. Also rebuild the selftests when headers under
  tools/arch change, the vDSO test when kernel headers change, and the
  x86 tests when the x86 headers they include change.

v2: https://lore.kernel.org/r/20261016143143.3613501-1-sashal@kernel.org
v1: https://lore.kernel.org/r/20261011233647.2454648-1-sashal@kernel.org

[1] https://lore.kernel.org/r/20261011223358.2327625-6-sashal@kernel.org
[2] https://lore.kernel.org/r/20261018135321.3986899-1-sashal@kernel.org

Sasha Levin (7):
  kbuild: factor the userspace ABI flags out into KBUILD_USERABI
  kbuild: add "make tools_build" to build userspace tools from tools/
  perf build: Add MINIMAL=1 to build without optional features
  tools: build perf in tools_build
  tools: build kernel selftests in tools_build
  kbuild: build the tools selected in tools/Kconfig as part of "make
    all"
  Documentation: describe building tools with the kernel

 .gitignore                                 |   5 +
 Documentation/dev-tools/kselftest.rst      |   4 +
 Documentation/kbuild/kbuild.rst            |   4 +-
 Documentation/process/submit-checklist.rst |   5 +
 Makefile                                   |  24 +-
 lib/Kconfig.debug                          |   2 +
 tools/Kconfig                              | 342 +++++++++++++++++++++
 tools/Makefile.kbuild                      | 209 +++++++++++++
 tools/perf/Makefile.config                 |   8 +-
 tools/perf/Makefile.perf                   |  42 ++-
 tools/perf/tests/make                      |   8 +-
 11 files changed, 635 insertions(+), 18 deletions(-)
 create mode 100644 tools/Kconfig
 create mode 100644 tools/Makefile.kbuild


base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
prerequisite-patch-id: 68eb8785244b88ec7e696e716420e2d9b1367dbc
prerequisite-patch-id: 37c57cf4c2a9700788cd1755912753f363cbb3f9
prerequisite-patch-id: 5243b7b03f2c12a6e66c353b0c083f7f21fd7ba2
prerequisite-patch-id: 7153a847ba7b05e49a670caba5d5b8fa2508eff1
prerequisite-patch-id: 67a995618952454c30eb77960a5bf6f897d22547
prerequisite-patch-id: bc69d99570e4326ce7736b244838e1e97cc13358
prerequisite-patch-id: 7a28872d234cdfa7bd5ec851e9dde01a65e91130
prerequisite-patch-id: a71f47de3fd339d680c9f18e80f5bcde7eae0abf
-- 
2.53.0


             reply	other threads:[~2026-11-02  2:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-02  2:12 Sasha Levin [this message]
2026-11-02  2:12 ` [PATCH v3 1/7] kbuild: factor the userspace ABI flags out into KBUILD_USERABI Sasha Levin
2026-11-02  2:12 ` [PATCH v3 2/7] kbuild: add "make tools_build" to build userspace tools from tools/ Sasha Levin
2026-11-02  2:12 ` [PATCH v3 3/7] perf build: Add MINIMAL=1 to build without optional features Sasha Levin
2026-11-02  2:12 ` [PATCH v3 4/7] tools: build perf in tools_build Sasha Levin
2026-11-02  2:12 ` [PATCH v3 5/7] tools: build kernel selftests " Sasha Levin
2026-11-02  2:12 ` [PATCH v3 6/7] kbuild: build the tools selected in tools/Kconfig as part of "make all" Sasha Levin
2026-11-02  2:12 ` [PATCH v3 7/7] Documentation: describe building tools with the kernel Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261102021253.2545235-1-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=irogers@google.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=linux@leemhuis.info \
    --cc=linux@weissschuh.net \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=nathan@kernel.org \
    --cc=nsc@kernel.org \
    --cc=peterz@infradead.org \
    --cc=shuah@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox