From: Sasha Levin <sashal@kernel.org>
To: Nathan Chancellor <nathan@kernel.org>,
Nicolas Schier <nsc@kernel.org>,
linux-kbuild@vger.kernel.org
Cc: Shuah Khan <shuah@kernel.org>,
linux-kselftest@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Ian Rogers <irogers@google.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
Sasha Levin <sashal@kernel.org>
Subject: [RFC PATCH 4/6] tools: build kernel selftests in tools_build
Date: Sun, 11 Oct 2026 19:36:43 -0400 [thread overview]
Message-ID: <20261011233647.2454648-5-sashal@kernel.org> (raw)
In-Reply-To: <20261011233647.2454648-1-sashal@kernel.org>
Add a "Kernel selftests" sub-menu with one entry per selftests directory
that builds with only a C library and does not write into the source
tree. Each is built as "make kselftest-all" builds it, with KHDR_INCLUDES
pointing at the UAPI headers installed in the object tree, but by its own
make, so the selected ones build in parallel. Selftests whose Makefile
does not use KHDR_INCLUDES still build against the C library's copy of
the UAPI headers.
The selftests do not track header dependencies, so a selftest is built
again from scratch when its own directory, a header or makefile any
selftest may share, or a kernel source it includes directly (the vDSO
test includes the architecture's vDSO code) is newer than its last
build.
Selftests that need libraries beyond the C library, a vmlinux with BTF,
or a sanitizer runtime are left out for now.
Assisted-by: LLM
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
tools/Kconfig | 239 ++++++++++++++++++++++++++++++++++++++++++
tools/Makefile.kbuild | 100 ++++++++++++++++++
2 files changed, 339 insertions(+)
diff --git a/tools/Kconfig b/tools/Kconfig
index 488f439592150..d713741782e22 100644
--- a/tools/Kconfig
+++ b/tools/Kconfig
@@ -84,4 +84,243 @@ config TOOLS_BUILD_USB
help
Build tools/usb (testusb, ffs-test).
+menuconfig TOOLS_BUILD_SELFTESTS
+ bool "Kernel selftests"
+ help
+ Build the selected targets under tools/testing/selftests, as
+ "make kselftest-all" would, without running them.
+
+if TOOLS_BUILD_SELFTESTS
+
+config TOOLS_BUILD_SELFTESTS_ACCT
+ bool "acct"
+
+config TOOLS_BUILD_SELFTESTS_ALLOC_TAG
+ bool "alloc_tag"
+
+config TOOLS_BUILD_SELFTESTS_BREAKPOINTS
+ bool "breakpoints"
+
+config TOOLS_BUILD_SELFTESTS_CACHESTAT
+ bool "cachestat"
+
+config TOOLS_BUILD_SELFTESTS_CGROUP
+ bool "cgroup"
+
+config TOOLS_BUILD_SELFTESTS_CONNECTOR
+ bool "connector"
+
+config TOOLS_BUILD_SELFTESTS_CORE
+ bool "core"
+
+config TOOLS_BUILD_SELFTESTS_COREDUMP
+ bool "coredump"
+
+config TOOLS_BUILD_SELFTESTS_DAMON
+ bool "damon"
+
+config TOOLS_BUILD_SELFTESTS_DMABUF_HEAPS
+ bool "dmabuf-heaps"
+
+config TOOLS_BUILD_SELFTESTS_DRIVERS_DMA_BUF
+ bool "drivers/dma-buf"
+
+config TOOLS_BUILD_SELFTESTS_DRIVERS_NTSYNC
+ bool "drivers/ntsync"
+
+config TOOLS_BUILD_SELFTESTS_EFIVARFS
+ bool "efivarfs"
+
+config TOOLS_BUILD_SELFTESTS_FILELOCK
+ bool "filelock"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_BINDERFS
+ bool "filesystems/binderfs"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_EPOLL
+ bool "filesystems/epoll"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_EVENTFD
+ bool "filesystems/eventfd"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_FAILFS
+ bool "filesystems/failfs"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_FAT
+ bool "filesystems/fat"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_MNTNS_UNBINDABLE
+ bool "filesystems/mntns_unbindable"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_MOUNT_CYCLE
+ bool "filesystems/mount_cycle"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_NSFS
+ bool "filesystems/nsfs"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_UMOUNT_PROPAGATION
+ bool "filesystems/umount_propagation"
+
+config TOOLS_BUILD_SELFTESTS_FILESYSTEMS_XATTR
+ bool "filesystems/xattr"
+
+config TOOLS_BUILD_SELFTESTS_FIRMWARE
+ bool "firmware"
+
+config TOOLS_BUILD_SELFTESTS_FPU
+ bool "fpu"
+
+config TOOLS_BUILD_SELFTESTS_FTRACE
+ bool "ftrace"
+
+config TOOLS_BUILD_SELFTESTS_GPIO
+ bool "gpio"
+
+config TOOLS_BUILD_SELFTESTS_INTEL_PSTATE
+ bool "intel_pstate"
+ depends on X86
+
+config TOOLS_BUILD_SELFTESTS_IPC
+ bool "ipc"
+
+config TOOLS_BUILD_SELFTESTS_IR
+ bool "ir"
+
+config TOOLS_BUILD_SELFTESTS_KCMP
+ bool "kcmp"
+
+config TOOLS_BUILD_SELFTESTS_KEXEC
+ bool "kexec"
+ depends on X86_64
+
+config TOOLS_BUILD_SELFTESTS_KSELFTEST_HARNESS
+ bool "kselftest_harness"
+
+config TOOLS_BUILD_SELFTESTS_LSM
+ bool "lsm"
+
+config TOOLS_BUILD_SELFTESTS_MEDIA_TESTS
+ bool "media_tests"
+
+config TOOLS_BUILD_SELFTESTS_MEMBARRIER
+ bool "membarrier"
+
+config TOOLS_BUILD_SELFTESTS_MINCORE
+ bool "mincore"
+
+config TOOLS_BUILD_SELFTESTS_MOUNT
+ bool "mount"
+
+config TOOLS_BUILD_SELFTESTS_MOUNT_SETATTR
+ bool "mount_setattr"
+
+config TOOLS_BUILD_SELFTESTS_MOVE_MOUNT_SET_GROUP
+ bool "move_mount_set_group"
+
+config TOOLS_BUILD_SELFTESTS_MSEAL_SYSTEM_MAPPINGS
+ bool "mseal_system_mappings"
+
+config TOOLS_BUILD_SELFTESTS_NCI
+ bool "nci"
+
+config TOOLS_BUILD_SELFTESTS_NET_CAN
+ bool "net/can"
+
+config TOOLS_BUILD_SELFTESTS_NET_FORWARDING
+ bool "net/forwarding"
+
+config TOOLS_BUILD_SELFTESTS_NET_MPTCP
+ bool "net/mptcp"
+
+config TOOLS_BUILD_SELFTESTS_PCI_ENDPOINT
+ bool "pci_endpoint"
+
+config TOOLS_BUILD_SELFTESTS_PERF_EVENTS
+ bool "perf_events"
+
+config TOOLS_BUILD_SELFTESTS_PID_NAMESPACE
+ bool "pid_namespace"
+
+config TOOLS_BUILD_SELFTESTS_PIDFD
+ bool "pidfd"
+
+config TOOLS_BUILD_SELFTESTS_PIPE
+ bool "pipe"
+
+config TOOLS_BUILD_SELFTESTS_PROC
+ bool "proc"
+
+config TOOLS_BUILD_SELFTESTS_PTP
+ bool "ptp"
+
+config TOOLS_BUILD_SELFTESTS_PTRACE
+ bool "ptrace"
+
+config TOOLS_BUILD_SELFTESTS_RESCTRL
+ bool "resctrl"
+ depends on X86
+
+config TOOLS_BUILD_SELFTESTS_RING_BUFFER
+ bool "ring-buffer"
+
+config TOOLS_BUILD_SELFTESTS_RLIMITS
+ bool "rlimits"
+
+config TOOLS_BUILD_SELFTESTS_RSEQ
+ bool "rseq"
+
+config TOOLS_BUILD_SELFTESTS_RTC
+ bool "rtc"
+
+config TOOLS_BUILD_SELFTESTS_SCHED
+ bool "sched"
+
+config TOOLS_BUILD_SELFTESTS_SIGNAL
+ bool "signal"
+
+config TOOLS_BUILD_SELFTESTS_SIZE
+ bool "size"
+
+config TOOLS_BUILD_SELFTESTS_SPLICE
+ bool "splice"
+
+config TOOLS_BUILD_SELFTESTS_SYNC
+ bool "sync"
+
+config TOOLS_BUILD_SELFTESTS_SYSCALL_USER_DISPATCH
+ bool "syscall_user_dispatch"
+
+config TOOLS_BUILD_SELFTESTS_TDX
+ bool "tdx"
+ depends on X86
+
+config TOOLS_BUILD_SELFTESTS_THERMAL_INTEL_POWER_FLOOR
+ bool "thermal/intel/power_floor"
+ depends on X86
+
+config TOOLS_BUILD_SELFTESTS_THERMAL_INTEL_WORKLOAD_HINT
+ bool "thermal/intel/workload_hint"
+ depends on X86
+
+config TOOLS_BUILD_SELFTESTS_TIMENS
+ bool "timens"
+
+config TOOLS_BUILD_SELFTESTS_TMPFS
+ bool "tmpfs"
+
+config TOOLS_BUILD_SELFTESTS_USER_EVENTS
+ bool "user_events"
+
+config TOOLS_BUILD_SELFTESTS_VDSO
+ bool "vDSO"
+
+config TOOLS_BUILD_SELFTESTS_WATCHDOG
+ bool "watchdog"
+
+config TOOLS_BUILD_SELFTESTS_X86
+ bool "x86"
+ depends on X86
+
+endif # TOOLS_BUILD_SELFTESTS
+
endif # TOOLS_BUILD
diff --git a/tools/Makefile.kbuild b/tools/Makefile.kbuild
index 62fd494253eca..c31347258d0a9 100644
--- a/tools/Makefile.kbuild
+++ b/tools/Makefile.kbuild
@@ -92,6 +92,106 @@ PHONY += perf
perf: FORCE
$(call build,$(outdir)/perf,-C $(toolsdir)/perf -f Makefile.perf O=$(outdir)/perf $(perf-flags) $(perf-flags-y),,TOOLS_BUILD_PERF)
+# Selftests in tools/testing/selftests/<name>
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_ACCT) += acct
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_ALLOC_TAG) += alloc_tag
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_BREAKPOINTS) += breakpoints
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_CACHESTAT) += cachestat
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_CGROUP) += cgroup
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_CONNECTOR) += connector
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_CORE) += core
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_COREDUMP) += coredump
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_DAMON) += damon
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_DMABUF_HEAPS) += dmabuf-heaps
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_DRIVERS_DMA_BUF) += drivers/dma-buf
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_DRIVERS_NTSYNC) += drivers/ntsync
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_EFIVARFS) += efivarfs
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILELOCK) += filelock
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_BINDERFS) += filesystems/binderfs
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_EPOLL) += filesystems/epoll
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_EVENTFD) += filesystems/eventfd
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_FAILFS) += filesystems/failfs
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_FAT) += filesystems/fat
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_MNTNS_UNBINDABLE) += filesystems/mntns_unbindable
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_MOUNT_CYCLE) += filesystems/mount_cycle
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_NSFS) += filesystems/nsfs
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_UMOUNT_PROPAGATION) += filesystems/umount_propagation
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FILESYSTEMS_XATTR) += filesystems/xattr
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FIRMWARE) += firmware
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FPU) += fpu
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_FTRACE) += ftrace
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_GPIO) += gpio
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_INTEL_PSTATE) += intel_pstate
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_IPC) += ipc
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_IR) += ir
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_KCMP) += kcmp
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_KEXEC) += kexec
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_KSELFTEST_HARNESS) += kselftest_harness
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_LSM) += lsm
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MEDIA_TESTS) += media_tests
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MEMBARRIER) += membarrier
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MINCORE) += mincore
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MOUNT) += mount
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MOUNT_SETATTR) += mount_setattr
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MOVE_MOUNT_SET_GROUP) += move_mount_set_group
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_MSEAL_SYSTEM_MAPPINGS) += mseal_system_mappings
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_NCI) += nci
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_NET_CAN) += net/can
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_NET_FORWARDING) += net/forwarding
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_NET_MPTCP) += net/mptcp
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PCI_ENDPOINT) += pci_endpoint
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PERF_EVENTS) += perf_events
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PID_NAMESPACE) += pid_namespace
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PIDFD) += pidfd
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PIPE) += pipe
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PROC) += proc
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PTP) += ptp
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_PTRACE) += ptrace
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_RESCTRL) += resctrl
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_RING_BUFFER) += ring-buffer
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_RLIMITS) += rlimits
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_RSEQ) += rseq
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_RTC) += rtc
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SCHED) += sched
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SIGNAL) += signal
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SIZE) += size
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SPLICE) += splice
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SYNC) += sync
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_SYSCALL_USER_DISPATCH) += syscall_user_dispatch
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_TDX) += tdx
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_THERMAL_INTEL_POWER_FLOOR) += thermal/intel/power_floor
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_THERMAL_INTEL_WORKLOAD_HINT) += thermal/intel/workload_hint
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_TIMENS) += timens
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_TMPFS) += tmpfs
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_USER_EVENTS) += user_events
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_VDSO) += vDSO
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_WATCHDOG) += watchdog
+selftests-$(CONFIG_TOOLS_BUILD_SELFTESTS_X86) += x86
+
+selftest-flags := CC='$(call escsq,$(tools-cc))' KHDR_INCLUDES='-isystem $(CURDIR)/usr/include'
+
+# Unlike tools/build, the selftests do not track header dependencies. A
+# selftest is built again from scratch when its own directory, a header or
+# makefile any selftest may share, or a kernel source it includes directly
+# is newer than its last build.
+selftest-shared := $(outdir)/selftests/.shared
+selftest-extra-vDSO := $(abs_srctree)/arch/$(SRCARCH)
+
+$(selftest-shared): FORCE
+ $(Q)mkdir -p $(@D); \
+ newest=$$(find $(CURDIR)/usr/include $(toolsdir)/include $(toolsdir)/testing/selftests \
+ -type f \( -name '*.h' -o -name '*.mk' -o -name Makefile \) -printf '%T@\n' | \
+ sort -n | tail -n 1); \
+ touch -d "@$${newest:-0}" $@
+
+selftest-targets := $(addprefix selftest-,$(selftests-y))
+
+__tools_build: $(selftest-targets)
+
+PHONY += $(selftest-targets)
+$(selftest-targets): selftest-%: $(selftest-shared) FORCE
+ $(call build,$(outdir)/selftests/$*,-C $(toolsdir)/testing/selftests/$* OUTPUT=$(outdir)/selftests/$* $(selftest-flags),$(selftest-shared) $(toolsdir)/testing/selftests/$* $(selftest-extra-$*),TOOLS_BUILD_SELFTESTS_$(shell echo $* | tr a-z/- A-Z__))
+
PHONY += FORCE
FORCE:
--
2.53.0
next prev parent reply other threads:[~2026-10-11 23:36 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 23:36 [RFC PATCH 0/6] kbuild: build the userspace tools in tools/ with the kernel Sasha Levin
2026-10-11 23:36 ` [RFC PATCH 1/6] kbuild: factor the userspace ABI flags out into KBUILD_USERABI Sasha Levin
2026-10-11 23:39 ` sashiko-bot
2026-10-11 23:36 ` [RFC PATCH 2/6] kbuild: add "make tools_build" to build userspace tools from tools/ Sasha Levin
2026-10-11 23:45 ` sashiko-bot
2026-10-11 23:36 ` [RFC PATCH 3/6] tools: build perf in tools_build Sasha Levin
2026-10-11 23:43 ` sashiko-bot
2026-10-12 22:07 ` Ian Rogers
2026-10-13 17:08 ` Sasha Levin
2026-10-11 23:36 ` Sasha Levin [this message]
2026-10-11 23:46 ` [RFC PATCH 4/6] tools: build kernel selftests " sashiko-bot
2026-10-11 23:36 ` [RFC PATCH 5/6] kbuild: build the tools selected in tools/Kconfig as part of "make all" Sasha Levin
2026-10-11 23:44 ` sashiko-bot
2026-10-11 23:36 ` [RFC PATCH 6/6] Documentation: describe building tools with the kernel Sasha Levin
2026-10-11 23:39 ` sashiko-bot
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=20261011233647.2454648-5-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=acme@kernel.org \
--cc=irogers@google.com \
--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=namhyung@kernel.org \
--cc=nathan@kernel.org \
--cc=nsc@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.