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