xref: /linux/tools/testing/selftests/Makefile (revision 2bd87951de659df3381ce083342aaf5b1ea24689)
1# SPDX-License-Identifier: GPL-2.0
2TARGETS += alsa
3TARGETS += amd-pstate
4TARGETS += arm64
5TARGETS += bpf
6TARGETS += breakpoints
7TARGETS += cachestat
8TARGETS += capabilities
9TARGETS += cgroup
10TARGETS += clone3
11TARGETS += connector
12TARGETS += core
13TARGETS += cpufreq
14TARGETS += cpu-hotplug
15TARGETS += damon
16TARGETS += devices
17TARGETS += dmabuf-heaps
18TARGETS += drivers/dma-buf
19TARGETS += drivers/s390x/uvdevice
20TARGETS += drivers/net
21TARGETS += drivers/net/bonding
22TARGETS += drivers/net/team
23TARGETS += dt
24TARGETS += efivarfs
25TARGETS += exec
26TARGETS += fchmodat2
27TARGETS += filesystems
28TARGETS += filesystems/binderfs
29TARGETS += filesystems/epoll
30TARGETS += filesystems/fat
31TARGETS += filesystems/overlayfs
32TARGETS += filesystems/statmount
33TARGETS += firmware
34TARGETS += fpu
35TARGETS += ftrace
36TARGETS += futex
37TARGETS += gpio
38TARGETS += hid
39TARGETS += intel_pstate
40TARGETS += iommu
41TARGETS += ipc
42TARGETS += ir
43TARGETS += kcmp
44TARGETS += kexec
45TARGETS += kvm
46TARGETS += landlock
47TARGETS += lib
48TARGETS += livepatch
49TARGETS += lkdtm
50TARGETS += lsm
51TARGETS += membarrier
52TARGETS += memfd
53TARGETS += memory-hotplug
54TARGETS += mincore
55TARGETS += mount
56TARGETS += mount_setattr
57TARGETS += move_mount_set_group
58TARGETS += mqueue
59TARGETS += nci
60TARGETS += net
61TARGETS += net/af_unix
62TARGETS += net/forwarding
63TARGETS += net/hsr
64TARGETS += net/mptcp
65TARGETS += net/openvswitch
66TARGETS += net/tcp_ao
67TARGETS += net/netfilter
68TARGETS += nsfs
69TARGETS += perf_events
70TARGETS += pidfd
71TARGETS += pid_namespace
72TARGETS += power_supply
73TARGETS += powerpc
74TARGETS += prctl
75TARGETS += proc
76TARGETS += pstore
77TARGETS += ptrace
78TARGETS += openat2
79TARGETS += resctrl
80TARGETS += riscv
81TARGETS += rlimits
82TARGETS += rseq
83TARGETS += rtc
84TARGETS += rust
85TARGETS += seccomp
86TARGETS += sgx
87TARGETS += sigaltstack
88TARGETS += size
89TARGETS += sparc64
90TARGETS += splice
91TARGETS += static_keys
92TARGETS += sync
93TARGETS += syscall_user_dispatch
94TARGETS += sysctl
95TARGETS += tc-testing
96TARGETS += tdx
97TARGETS += thermal/intel/power_floor
98TARGETS += thermal/intel/workload_hint
99TARGETS += timens
100ifneq (1, $(quicktest))
101TARGETS += timers
102endif
103TARGETS += tmpfs
104TARGETS += tpm2
105TARGETS += tty
106TARGETS += uevent
107TARGETS += user
108TARGETS += user_events
109TARGETS += vDSO
110TARGETS += mm
111TARGETS += x86
112TARGETS += zram
113#Please keep the TARGETS list alphabetically sorted
114# Run "make quicktest=1 run_tests" or
115# "make quicktest=1 kselftest" from top level Makefile
116
117TARGETS_HOTPLUG = cpu-hotplug
118TARGETS_HOTPLUG += memory-hotplug
119
120# Networking tests want the net/lib target, include it automatically
121ifneq ($(filter net drivers/net,$(TARGETS)),)
122ifeq ($(filter net/lib,$(TARGETS)),)
123	INSTALL_DEP_TARGETS := net/lib
124endif
125endif
126
127# User can optionally provide a TARGETS skiplist.  By default we skip
128# BPF since it has cutting edge build time dependencies which require
129# more effort to install.
130SKIP_TARGETS ?= bpf
131ifneq ($(SKIP_TARGETS),)
132	TMP := $(filter-out $(SKIP_TARGETS), $(TARGETS))
133	override TARGETS := $(TMP)
134endif
135
136# User can set FORCE_TARGETS to 1 to require all targets to be successfully
137# built; make will fail if any of the targets cannot be built. If
138# FORCE_TARGETS is not set (the default), make will succeed if at least one
139# of the targets gets built.
140FORCE_TARGETS ?=
141
142# Clear LDFLAGS and MAKEFLAGS when implicit rules are missing.  This provides
143# implicit rules to sub-test Makefiles which avoids build failures in test
144# Makefile that don't have explicit build rules.
145ifeq (,$(LINK.c))
146override LDFLAGS =
147override MAKEFLAGS =
148endif
149
150# Append kselftest to KBUILD_OUTPUT and O to avoid cluttering
151# KBUILD_OUTPUT with selftest objects and headers installed
152# by selftests Makefile or lib.mk.
153ifdef building_out_of_srctree
154override LDFLAGS =
155endif
156
157top_srcdir ?= ../../..
158
159ifeq ("$(origin O)", "command line")
160  KBUILD_OUTPUT := $(O)
161endif
162
163ifneq ($(KBUILD_OUTPUT),)
164  # Make's built-in functions such as $(abspath ...), $(realpath ...) cannot
165  # expand a shell special character '~'. We use a somewhat tedious way here.
166  abs_objtree := $(shell cd $(top_srcdir) && mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && pwd)
167  $(if $(abs_objtree),, \
168    $(error failed to create output directory "$(KBUILD_OUTPUT)"))
169  # $(realpath ...) resolves symlinks
170  abs_objtree := $(realpath $(abs_objtree))
171  BUILD := $(abs_objtree)/kselftest
172  KHDR_INCLUDES := -isystem ${abs_objtree}/usr/include
173else
174  BUILD := $(CURDIR)
175  abs_srctree := $(shell cd $(top_srcdir) && pwd)
176  KHDR_INCLUDES := -isystem ${abs_srctree}/usr/include
177  DEFAULT_INSTALL_HDR_PATH := 1
178endif
179
180# Prepare for headers install
181include $(top_srcdir)/scripts/subarch.include
182ARCH           ?= $(SUBARCH)
183export BUILD
184export KHDR_INCLUDES
185
186# set default goal to all, so make without a target runs all, even when
187# all isn't the first target in the file.
188.DEFAULT_GOAL := all
189
190all:
191	@ret=1;							\
192	for TARGET in $(TARGETS); do				\
193		BUILD_TARGET=$$BUILD/$$TARGET;			\
194		mkdir $$BUILD_TARGET  -p;			\
195		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET	\
196				O=$(abs_objtree)		\
197				$(if $(FORCE_TARGETS),|| exit);	\
198		ret=$$((ret * $$?));				\
199	done; exit $$ret;
200
201run_tests: all
202	@for TARGET in $(TARGETS); do \
203		BUILD_TARGET=$$BUILD/$$TARGET;	\
204		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \
205				SRC_PATH=$(shell readlink -e $$(pwd)) \
206				OBJ_PATH=$(BUILD)                   \
207				O=$(abs_objtree);		    \
208	done;
209
210hotplug:
211	@for TARGET in $(TARGETS_HOTPLUG); do \
212		BUILD_TARGET=$$BUILD/$$TARGET;	\
213		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET;\
214	done;
215
216run_hotplug: hotplug
217	@for TARGET in $(TARGETS_HOTPLUG); do \
218		BUILD_TARGET=$$BUILD/$$TARGET;	\
219		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_full_test;\
220	done;
221
222clean_hotplug:
223	@for TARGET in $(TARGETS_HOTPLUG); do \
224		BUILD_TARGET=$$BUILD/$$TARGET;	\
225		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\
226	done;
227
228run_pstore_crash:
229	$(MAKE) -C pstore run_crash
230
231# Use $BUILD as the default install root. $BUILD points to the
232# right output location for the following cases:
233# 1. output_dir=kernel_src
234# 2. a separate output directory is specified using O= KBUILD_OUTPUT
235# 3. a separate output directory is specified using KBUILD_OUTPUT
236# Avoid conflict with INSTALL_PATH set by the main Makefile
237#
238KSFT_INSTALL_PATH ?= $(BUILD)/kselftest_install
239KSFT_INSTALL_PATH := $(abspath $(KSFT_INSTALL_PATH))
240# Avoid changing the rest of the logic here and lib.mk.
241INSTALL_PATH := $(KSFT_INSTALL_PATH)
242ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh
243TEST_LIST := $(INSTALL_PATH)/kselftest-list.txt
244
245install: all
246ifdef INSTALL_PATH
247	@# Ask all targets to install their files
248	mkdir -p $(INSTALL_PATH)/kselftest
249	install -m 744 kselftest/module.sh $(INSTALL_PATH)/kselftest/
250	install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/
251	install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/
252	install -m 744 kselftest/ktap_helpers.sh $(INSTALL_PATH)/kselftest/
253	install -m 744 run_kselftest.sh $(INSTALL_PATH)/
254	rm -f $(TEST_LIST)
255	@ret=1;	\
256	for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
257		BUILD_TARGET=$$BUILD/$$TARGET;	\
258		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
259				INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
260				SRC_PATH=$(shell readlink -e $$(pwd)) \
261				OBJ_PATH=$(INSTALL_PATH) \
262				O=$(abs_objtree)		\
263				$(if $(FORCE_TARGETS),|| exit);	\
264		ret=$$((ret * $$?));		\
265	done; exit $$ret;
266
267
268	@# Ask all targets to emit their test scripts
269	@# While building kselftest-list.text skip also non-existent TARGET dirs:
270	@# they could be the result of a build failure and should NOT be
271	@# included in the generated runlist.
272	for TARGET in $(TARGETS); do \
273		BUILD_TARGET=$$BUILD/$$TARGET;	\
274		[ ! -d $(INSTALL_PATH)/$$TARGET ] && printf "Skipping non-existent dir: $$TARGET\n" && continue; \
275		printf "Emit Tests for $$TARGET\n"; \
276		$(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET COLLECTION=$$TARGET \
277			-C $$TARGET emit_tests >> $(TEST_LIST); \
278	done;
279else
280	$(error Error: set INSTALL_PATH to use install)
281endif
282
283FORMAT ?= .gz
284TAR_PATH = $(abspath ${INSTALL_PATH}/kselftest-packages/kselftest.tar${FORMAT})
285gen_tar: install
286	@mkdir -p ${INSTALL_PATH}/kselftest-packages/
287	@tar caf ${TAR_PATH} --exclude=kselftest-packages -C ${INSTALL_PATH} .
288	@echo "Created ${TAR_PATH}"
289
290clean:
291	@for TARGET in $(TARGETS); do \
292		BUILD_TARGET=$$BUILD/$$TARGET;	\
293		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\
294	done;
295
296.PHONY: all run_tests hotplug run_hotplug clean_hotplug run_pstore_crash install clean gen_tar
297