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