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