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