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