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