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