1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun# Makefile for vm selftests 3*4882a593Smuzhiyununame_M := $(shell uname -m 2>/dev/null || echo not) 4*4882a593SmuzhiyunMACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/ppc64/') 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun# Without this, failed build products remain, with up-to-date timestamps, 7*4882a593Smuzhiyun# thus tricking Make (and you!) into believing that All Is Well, in subsequent 8*4882a593Smuzhiyun# make invocations: 9*4882a593Smuzhiyun.DELETE_ON_ERROR: 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# Avoid accidental wrong builds, due to built-in rules working just a little 12*4882a593Smuzhiyun# bit too well--but not quite as well as required for our situation here. 13*4882a593Smuzhiyun# 14*4882a593Smuzhiyun# In other words, "make userfaultfd" is supposed to fail to build at all, 15*4882a593Smuzhiyun# because this Makefile only supports either "make" (all), or "make /full/path". 16*4882a593Smuzhiyun# However, the built-in rules, if not suppressed, will pick up CFLAGS and the 17*4882a593Smuzhiyun# initial LDLIBS (but not the target-specific LDLIBS, because those are only 18*4882a593Smuzhiyun# set for the full path target!). This causes it to get pretty far into building 19*4882a593Smuzhiyun# things despite using incorrect values such as an *occasionally* incomplete 20*4882a593Smuzhiyun# LDLIBS. 21*4882a593SmuzhiyunMAKEFLAGS += --no-builtin-rules 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunCFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS) 24*4882a593SmuzhiyunLDLIBS = -lrt 25*4882a593SmuzhiyunTEST_GEN_FILES = compaction_test 26*4882a593SmuzhiyunTEST_GEN_FILES += gup_benchmark 27*4882a593SmuzhiyunTEST_GEN_FILES += hmm-tests 28*4882a593SmuzhiyunTEST_GEN_FILES += hugepage-mmap 29*4882a593SmuzhiyunTEST_GEN_FILES += hugepage-shm 30*4882a593SmuzhiyunTEST_GEN_FILES += map_hugetlb 31*4882a593SmuzhiyunTEST_GEN_FILES += map_fixed_noreplace 32*4882a593SmuzhiyunTEST_GEN_FILES += map_populate 33*4882a593SmuzhiyunTEST_GEN_FILES += mlock-random-test 34*4882a593SmuzhiyunTEST_GEN_FILES += mlock2-tests 35*4882a593SmuzhiyunTEST_GEN_FILES += mremap_dontunmap 36*4882a593SmuzhiyunTEST_GEN_FILES += on-fault-limit 37*4882a593SmuzhiyunTEST_GEN_FILES += thuge-gen 38*4882a593SmuzhiyunTEST_GEN_FILES += transhuge-stress 39*4882a593SmuzhiyunTEST_GEN_FILES += userfaultfd 40*4882a593SmuzhiyunTEST_GEN_FILES += khugepaged 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunifeq ($(MACHINE),x86_64) 43*4882a593SmuzhiyunCAN_BUILD_I386 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_32bit_program.c -m32) 44*4882a593SmuzhiyunCAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_64bit_program.c) 45*4882a593SmuzhiyunCAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_program.c -no-pie) 46*4882a593Smuzhiyun 47*4882a593SmuzhiyunVMTARGETS := protection_keys 48*4882a593SmuzhiyunBINARIES_32 := $(VMTARGETS:%=%_32) 49*4882a593SmuzhiyunBINARIES_64 := $(VMTARGETS:%=%_64) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyunifeq ($(CAN_BUILD_WITH_NOPIE),1) 52*4882a593SmuzhiyunCFLAGS += -no-pie 53*4882a593Smuzhiyunendif 54*4882a593Smuzhiyun 55*4882a593Smuzhiyunifeq ($(CAN_BUILD_I386),1) 56*4882a593SmuzhiyunTEST_GEN_FILES += $(BINARIES_32) 57*4882a593Smuzhiyunendif 58*4882a593Smuzhiyun 59*4882a593Smuzhiyunifeq ($(CAN_BUILD_X86_64),1) 60*4882a593SmuzhiyunTEST_GEN_FILES += $(BINARIES_64) 61*4882a593Smuzhiyunendif 62*4882a593Smuzhiyunelse 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunifneq (,$(findstring $(MACHINE),ppc64)) 65*4882a593SmuzhiyunTEST_GEN_FILES += protection_keys 66*4882a593Smuzhiyunendif 67*4882a593Smuzhiyun 68*4882a593Smuzhiyunendif 69*4882a593Smuzhiyun 70*4882a593Smuzhiyunifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64)) 71*4882a593SmuzhiyunTEST_GEN_FILES += va_128TBswitch 72*4882a593SmuzhiyunTEST_GEN_FILES += virtual_address_range 73*4882a593SmuzhiyunTEST_GEN_FILES += write_to_hugetlbfs 74*4882a593Smuzhiyunendif 75*4882a593Smuzhiyun 76*4882a593SmuzhiyunTEST_PROGS := run_vmtests 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunTEST_FILES := test_vmalloc.sh 79*4882a593Smuzhiyun 80*4882a593SmuzhiyunKSFT_KHDR_INSTALL := 1 81*4882a593Smuzhiyuninclude ../lib.mk 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun$(OUTPUT)/hmm-tests: LDLIBS += -lhugetlbfs -lpthread 84*4882a593Smuzhiyun 85*4882a593Smuzhiyunifeq ($(MACHINE),x86_64) 86*4882a593SmuzhiyunBINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) 87*4882a593SmuzhiyunBINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64)) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyundefine gen-target-rule-32 90*4882a593Smuzhiyun$(1) $(1)_32: $(OUTPUT)/$(1)_32 91*4882a593Smuzhiyun.PHONY: $(1) $(1)_32 92*4882a593Smuzhiyunendef 93*4882a593Smuzhiyun 94*4882a593Smuzhiyundefine gen-target-rule-64 95*4882a593Smuzhiyun$(1) $(1)_64: $(OUTPUT)/$(1)_64 96*4882a593Smuzhiyun.PHONY: $(1) $(1)_64 97*4882a593Smuzhiyunendef 98*4882a593Smuzhiyun 99*4882a593Smuzhiyunifeq ($(CAN_BUILD_I386),1) 100*4882a593Smuzhiyun$(BINARIES_32): CFLAGS += -m32 101*4882a593Smuzhiyun$(BINARIES_32): LDLIBS += -lrt -ldl -lm 102*4882a593Smuzhiyun$(BINARIES_32): $(OUTPUT)/%_32: %.c 103*4882a593Smuzhiyun $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@ 104*4882a593Smuzhiyun$(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-32,$(t)))) 105*4882a593Smuzhiyunendif 106*4882a593Smuzhiyun 107*4882a593Smuzhiyunifeq ($(CAN_BUILD_X86_64),1) 108*4882a593Smuzhiyun$(BINARIES_64): CFLAGS += -m64 109*4882a593Smuzhiyun$(BINARIES_64): LDLIBS += -lrt -ldl 110*4882a593Smuzhiyun$(BINARIES_64): $(OUTPUT)/%_64: %.c 111*4882a593Smuzhiyun $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@ 112*4882a593Smuzhiyun$(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-64,$(t)))) 113*4882a593Smuzhiyunendif 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun# x86_64 users should be encouraged to install 32-bit libraries 116*4882a593Smuzhiyunifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01) 117*4882a593Smuzhiyunall: warn_32bit_failure 118*4882a593Smuzhiyun 119*4882a593Smuzhiyunwarn_32bit_failure: 120*4882a593Smuzhiyun @echo "Warning: you seem to have a broken 32-bit build" 2>&1; \ 121*4882a593Smuzhiyun echo "environment. This will reduce test coverage of 64-bit" 2>&1; \ 122*4882a593Smuzhiyun echo "kernels. If you are using a Debian-like distribution," 2>&1; \ 123*4882a593Smuzhiyun echo "try:"; 2>&1; \ 124*4882a593Smuzhiyun echo ""; \ 125*4882a593Smuzhiyun echo " apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \ 126*4882a593Smuzhiyun echo ""; \ 127*4882a593Smuzhiyun echo "If you are using a Fedora-like distribution, try:"; \ 128*4882a593Smuzhiyun echo ""; \ 129*4882a593Smuzhiyun echo " yum install glibc-devel.*i686"; \ 130*4882a593Smuzhiyun exit 0; 131*4882a593Smuzhiyunendif 132*4882a593Smuzhiyunendif 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun$(OUTPUT)/userfaultfd: LDLIBS += -lpthread 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun$(OUTPUT)/mlock-random-test: LDLIBS += -lcap 137