1 # This mimics the top-level Makefile. We do it explicitly here so that this
2 # Makefile can operate with or without the kbuild infrastructure.
4 ifneq ($(filter %/,$(LLVM
)),)
6 else ifneq ($(filter -%,$(LLVM
)),)
10 CLANG
:= $(LLVM_PREFIX
)clang
$(LLVM_SUFFIX
)
12 CLANG_TARGET_FLAGS_arm
:= arm-linux-gnueabi
13 CLANG_TARGET_FLAGS_arm64
:= aarch64-linux-gnu
14 CLANG_TARGET_FLAGS_hexagon
:= hexagon-linux-musl
15 CLANG_TARGET_FLAGS_i386
:= i386-linux-gnu
16 CLANG_TARGET_FLAGS_m68k
:= m68k-linux-gnu
17 CLANG_TARGET_FLAGS_mips
:= mipsel-linux-gnu
18 CLANG_TARGET_FLAGS_powerpc
:= powerpc64le-linux-gnu
19 CLANG_TARGET_FLAGS_riscv
:= riscv64-linux-gnu
20 CLANG_TARGET_FLAGS_s390
:= s390x-linux-gnu
21 CLANG_TARGET_FLAGS_x86
:= x86_64-linux-gnu
22 CLANG_TARGET_FLAGS_x86_64
:= x86_64-linux-gnu
24 # Default to host architecture if ARCH is not explicitly given.
26 CLANG_TARGET_FLAGS
:= $(shell $(CLANG
) -print-target-triple
)
28 CLANG_TARGET_FLAGS
:= $(CLANG_TARGET_FLAGS_
$(ARCH
))
31 ifeq ($(CROSS_COMPILE
),)
32 ifeq ($(CLANG_TARGET_FLAGS
),)
33 $(error Specify CROSS_COMPILE or add
'--target=' option to lib.mk
)
35 CLANG_FLAGS
+= --target
=$(CLANG_TARGET_FLAGS
)
36 endif # CLANG_TARGET_FLAGS
38 CLANG_FLAGS
+= --target
=$(notdir $(CROSS_COMPILE
:%-=%))
41 # gcc defaults to silence (off) for the following warnings, but clang defaults
42 # to the opposite. The warnings are not useful for the kernel itself, which is
43 # why they have remained disabled in gcc for the main kernel build. And it is
44 # only due to including kernel data structures in the selftests, that we get the
45 # warnings from clang. Therefore, disable the warnings for clang builds.
46 CFLAGS
+= -Wno-address-of-packed-member
47 CFLAGS
+= -Wno-gnu-variable-sized-type-not-at-end
49 CC
:= $(CLANG
) $(CLANG_FLAGS
) -fintegrated-as
51 CC
:= $(CROSS_COMPILE
)gcc
56 OUTPUT
:= $(shell pwd
)
57 DEFAULT_INSTALL_HDR_PATH
:= 1
60 selfdir
= $(realpath
$(dir $(filter %/lib.mk
,$(MAKEFILE_LIST
))))
61 top_srcdir
= $(selfdir
)/..
/..
/..
63 # msg: emit succinct information message describing current building step
64 # $1 - generic step name (e.g., CC, LINK, etc);
65 # $2 - optional "flavor" specifier; if provided, will be emitted as [flavor];
66 # $3 - target (assumed to be file); only file name will be emitted;
67 # $4 - optional extra arg, emitted as-is, if provided.
73 msg
= @printf
' %-8s%s %s%s\n' "$(1)" "$(if $(2), [$(2)])" "$(notdir $(3))" "$(if $(4), $(4))";
74 MAKEFLAGS
+= --no-print-directory
77 ifeq ($(KHDR_INCLUDES
),)
78 KHDR_INCLUDES
:= -isystem
$(top_srcdir
)/usr
/include
81 # In order to use newer items that haven't yet been added to the user's system
82 # header files, add $(TOOLS_INCLUDES) to the compiler invocation in each
84 # You may need to add files to that location, or to refresh an existing file. In
85 # order to do that, run "make headers" from $(top_srcdir), then copy the
86 # header file that you want from $(top_srcdir)/usr/include/... , to the matching
87 # subdir in $(TOOLS_INCLUDE).
88 TOOLS_INCLUDES
:= -isystem
$(top_srcdir
)/tools
/include/uapi
90 # The following are built by lib.mk common compile rules.
91 # TEST_CUSTOM_PROGS should be used by tests that require
92 # custom build rule and prevent common build rule use.
93 # TEST_PROGS are for test shell scripts.
94 # TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests
95 # and install targets. Common clean doesn't touch them.
96 TEST_GEN_PROGS
:= $(patsubst %,$(OUTPUT
)/%,$(TEST_GEN_PROGS
))
97 TEST_GEN_PROGS_EXTENDED
:= $(patsubst %,$(OUTPUT
)/%,$(TEST_GEN_PROGS_EXTENDED
))
98 TEST_GEN_FILES
:= $(patsubst %,$(OUTPUT
)/%,$(TEST_GEN_FILES
))
100 all: $(TEST_GEN_PROGS
) $(TEST_GEN_PROGS_EXTENDED
) $(TEST_GEN_FILES
) \
101 $(if
$(TEST_GEN_MODS_DIR
),gen_mods_dir
)
104 BASE_DIR
="$(selfdir)"; \
105 .
$(selfdir
)/kselftest
/runner.sh
; \
106 if
[ "X$(summary)" != "X" ]; then \
107 per_test_logging
=1; \
112 define INSTALL_INCLUDES
113 $(if
$(TEST_INCLUDES
), \
115 for entry in
$(TEST_INCLUDES
); do \
116 entry_dir
=$$(readlink
-e
"$$(dirname "$$entry")"); \
117 entry_name
=$$(basename "$$entry"); \
118 relative_dir
=$${entry_dir
#"$$SRC_PATH"/}; \
119 if
[ "$$relative_dir" = "$$entry_dir" ]; then \
120 echo
"Error: TEST_INCLUDES entry \"$$entry\" not located inside selftests directory ($$SRC_PATH)" >&2; \
123 relative_files
="$$relative_files $$relative_dir/$$entry_name"; \
125 cd
$(SRC_PATH
) && rsync
-aR
$$relative_files $(OBJ_PATH
)/ \
130 ifdef building_out_of_srctree
131 @if
[ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)$(TEST_GEN_MODS_DIR)" != "X" ]; then \
132 rsync
-aq
--copy-unsafe-links
$(TEST_PROGS
) $(TEST_PROGS_EXTENDED
) $(TEST_FILES
) $(TEST_GEN_MODS_DIR
) $(OUTPUT
); \
135 @if
[ "X$(TEST_PROGS)" != "X" ]; then \
136 $(call RUN_TESTS
, $(TEST_GEN_PROGS
) $(TEST_CUSTOM_PROGS
) \
137 $(addprefix $(OUTPUT
)/,$(TEST_PROGS
))) ; \
139 $(call RUN_TESTS
, $(TEST_GEN_PROGS
) $(TEST_CUSTOM_PROGS
)); \
142 @
$(call RUN_TESTS
, $(TEST_GEN_PROGS
) $(TEST_CUSTOM_PROGS
) $(TEST_PROGS
))
146 $(Q
)$(MAKE
) -C
$(TEST_GEN_MODS_DIR
)
149 $(Q
)$(MAKE
) -C
$(TEST_GEN_MODS_DIR
) clean
151 define INSTALL_SINGLE_RULE
152 $(if
$(INSTALL_LIST
),@mkdir
-p
$(INSTALL_PATH
))
153 $(if
$(INSTALL_LIST
),rsync
-a
--copy-unsafe-links
$(INSTALL_LIST
) $(INSTALL_PATH
)/)
156 define INSTALL_MODS_RULE
157 $(if
$(INSTALL_LIST
),@mkdir
-p
$(INSTALL_PATH
)/$(INSTALL_LIST
))
158 $(if
$(INSTALL_LIST
),rsync
-a
--copy-unsafe-links
$(INSTALL_LIST
)/*.ko
$(INSTALL_PATH
)/$(INSTALL_LIST
))
162 $(eval INSTALL_LIST
= $(TEST_PROGS
)) $(INSTALL_SINGLE_RULE
)
163 $(eval INSTALL_LIST
= $(TEST_PROGS_EXTENDED
)) $(INSTALL_SINGLE_RULE
)
164 $(eval INSTALL_LIST
= $(TEST_FILES
)) $(INSTALL_SINGLE_RULE
)
165 $(eval INSTALL_LIST
= $(TEST_GEN_PROGS
)) $(INSTALL_SINGLE_RULE
)
166 $(eval INSTALL_LIST
= $(TEST_CUSTOM_PROGS
)) $(INSTALL_SINGLE_RULE
)
167 $(eval INSTALL_LIST
= $(TEST_GEN_PROGS_EXTENDED
)) $(INSTALL_SINGLE_RULE
)
168 $(eval INSTALL_LIST
= $(TEST_GEN_FILES
)) $(INSTALL_SINGLE_RULE
)
169 $(eval INSTALL_LIST
= $(notdir $(TEST_GEN_MODS_DIR
))) $(INSTALL_MODS_RULE
)
170 $(eval INSTALL_LIST
= $(wildcard config settings
)) $(INSTALL_SINGLE_RULE
)
178 $(error Error
: set INSTALL_PATH to use
install)
182 for TEST in
$(TEST_GEN_PROGS
) $(TEST_CUSTOM_PROGS
) $(TEST_PROGS
); do \
183 BASENAME_TEST
=`basename $$TEST`; \
184 echo
"$(COLLECTION):$$BASENAME_TEST"; \
187 # define if isn't already. It is undefined in make O= case.
193 $(RM
) -r
$(TEST_GEN_PROGS
) $(TEST_GEN_PROGS_EXTENDED
) $(TEST_GEN_FILES
) $(EXTRA_CLEAN
)
196 clean: $(if
$(TEST_GEN_MODS_DIR
),clean_mods_dir
)
199 # Build with _GNU_SOURCE by default
200 CFLAGS
+= -D_GNU_SOURCE
=
202 # Enables to extend CFLAGS and LDFLAGS from command line, e.g.
203 # make USERCFLAGS=-Werror USERLDFLAGS=-static
204 CFLAGS
+= $(USERCFLAGS
)
205 LDFLAGS
+= $(USERLDFLAGS
)
207 # When make O= with kselftest target from main level
208 # the following aren't defined.
210 ifdef building_out_of_srctree
211 LINK.c
= $(CC
) $(CFLAGS
) $(CPPFLAGS
) $(LDFLAGS
) $(TARGET_ARCH
)
212 COMPILE.S
= $(CC
) $(ASFLAGS
) $(CPPFLAGS
) $(TARGET_ARCH
) -c
213 LINK.S
= $(CC
) $(ASFLAGS
) $(CPPFLAGS
) $(LDFLAGS
) $(TARGET_ARCH
)
216 # Selftest makefiles can override those targets by setting
217 # OVERRIDE_TARGETS = 1.
218 ifeq ($(OVERRIDE_TARGETS
),)
219 LOCAL_HDRS
+= $(selfdir
)/kselftest_harness.h
$(selfdir
)/kselftest.h
220 $(OUTPUT
)/%:%.c
$(LOCAL_HDRS
)
222 $(Q
)$(LINK.c
) $(filter-out $(LOCAL_HDRS
),$^
) $(LDLIBS
) -o
$@
225 $(COMPILE.S
) $^
-o
$@
228 $(LINK.S
) $^
$(LDLIBS
) -o
$@
231 .PHONY
: run_tests
all clean install emit_tests gen_mods_dir clean_mods_dir