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