Makefile 4.1 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
2
# Makefile for vm selftests
3
uname_M := $(shell uname -m 2>/dev/null || echo not)
4
MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/')
5

6 7 8 9 10
# Without this, failed build products remain, with up-to-date timestamps,
# thus tricking Make (and you!) into believing that All Is Well, in subsequent
# make invocations:
.DELETE_ON_ERROR:

11 12 13 14 15 16 17 18 19 20 21 22
# Avoid accidental wrong builds, due to built-in rules working just a little
# bit too well--but not quite as well as required for our situation here.
#
# In other words, "make userfaultfd" is supposed to fail to build at all,
# because this Makefile only supports either "make" (all), or "make /full/path".
# However,  the built-in rules, if not suppressed, will pick up CFLAGS and the
# initial LDLIBS (but not the target-specific LDLIBS, because those are only
# set for the full path target!). This causes it to get pretty far into building
# things despite using incorrect values such as an *occasionally* incomplete
# LDLIBS.
MAKEFLAGS += --no-builtin-rules

23
CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS)
24
LDLIBS = -lrt -lpthread
25
TEST_GEN_FILES = compaction_test
26
TEST_GEN_FILES += gup_test
27
TEST_GEN_FILES += hmm-tests
28 29
TEST_GEN_FILES += hugepage-mmap
TEST_GEN_FILES += hugepage-shm
30
TEST_GEN_FILES += khugepaged
31
TEST_GEN_FILES += map_fixed_noreplace
32
TEST_GEN_FILES += map_hugetlb
33
TEST_GEN_FILES += map_populate
34
TEST_GEN_FILES += mlock-random-test
35
TEST_GEN_FILES += mlock2-tests
36
TEST_GEN_FILES += mremap_dontunmap
37 38 39 40
TEST_GEN_FILES += on-fault-limit
TEST_GEN_FILES += thuge-gen
TEST_GEN_FILES += transhuge-stress
TEST_GEN_FILES += userfaultfd
41

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
ifeq ($(ARCH),x86_64)
CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_32bit_program.c -m32)
CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_64bit_program.c)
CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_program.c -no-pie)

TARGETS := protection_keys
BINARIES_32 := $(TARGETS:%=%_32)
BINARIES_64 := $(TARGETS:%=%_64)

ifeq ($(CAN_BUILD_WITH_NOPIE),1)
CFLAGS += -no-pie
endif

ifeq ($(CAN_BUILD_I386),1)
TEST_GEN_FILES += $(BINARIES_32)
endif

ifeq ($(CAN_BUILD_X86_64),1)
TEST_GEN_FILES += $(BINARIES_64)
endif
else
63 64

ifneq (,$(findstring $(ARCH),powerpc))
65 66 67
TEST_GEN_FILES += protection_keys
endif

68 69
endif

70
ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64))
71
TEST_GEN_FILES += va_128TBswitch
72
TEST_GEN_FILES += virtual_address_range
73
TEST_GEN_FILES += write_to_hugetlbfs
74
endif
75

76
TEST_PROGS := run_vmtests.sh
77

78 79
TEST_FILES := test_vmalloc.sh

80
KSFT_KHDR_INSTALL := 1
81
include ../lib.mk
82

83
$(OUTPUT)/hmm-tests: LDLIBS += -lhugetlbfs
84

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
ifeq ($(ARCH),x86_64)
BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))
BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64))

define gen-target-rule-32
$(1) $(1)_32: $(OUTPUT)/$(1)_32
.PHONY: $(1) $(1)_32
endef

define gen-target-rule-64
$(1) $(1)_64: $(OUTPUT)/$(1)_64
.PHONY: $(1) $(1)_64
endef

ifeq ($(CAN_BUILD_I386),1)
$(BINARIES_32): CFLAGS += -m32
$(BINARIES_32): LDLIBS += -lrt -ldl -lm
$(BINARIES_32): %_32: %.c
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
$(foreach t,$(TARGETS),$(eval $(call gen-target-rule-32,$(t))))
endif

ifeq ($(CAN_BUILD_X86_64),1)
$(BINARIES_64): CFLAGS += -m64
$(BINARIES_64): LDLIBS += -lrt -ldl
$(BINARIES_64): %_64: %.c
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
$(foreach t,$(TARGETS),$(eval $(call gen-target-rule-64,$(t))))
endif

# x86_64 users should be encouraged to install 32-bit libraries
ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01)
all: warn_32bit_failure

warn_32bit_failure:
	@echo "Warning: you seem to have a broken 32-bit build" 2>&1;		\
	echo  "environment. This will reduce test coverage of 64-bit" 2>&1;	\
	echo  "kernels. If you are using a Debian-like distribution," 2>&1;	\
	echo  "try:"; 2>&1;							\
	echo  "";								\
	echo  "  apt-get install gcc-multilib libc6-i386 libc6-dev-i386";	\
	echo  "";								\
	echo  "If you are using a Fedora-like distribution, try:";		\
	echo  "";								\
	echo  "  yum install glibc-devel.*i686";				\
	exit 0;
endif
endif

134
$(OUTPUT)/mlock-random-test: LDLIBS += -lcap
135 136

$(OUTPUT)/gup_test: ../../../../mm/gup_test.h