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