GNU Linux-libre 4.19.286-gnu1
[releases.git] / tools / testing / selftests / lib.mk
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.
3 ifneq ($(LLVM),)
4 CC := clang
5 else
6 CC := $(CROSS_COMPILE)gcc
7 endif
8
9 ifeq (0,$(MAKELEVEL))
10 OUTPUT := $(shell pwd)
11 endif
12
13 # The following are built by lib.mk common compile rules.
14 # TEST_CUSTOM_PROGS should be used by tests that require
15 # custom build rule and prevent common build rule use.
16 # TEST_PROGS are for test shell scripts.
17 # TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests
18 # and install targets. Common clean doesn't touch them.
19 TEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS))
20 TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED))
21 TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES))
22
23 ifdef KSFT_KHDR_INSTALL
24 top_srcdir ?= ../../../..
25 include $(top_srcdir)/scripts/subarch.include
26 ARCH            ?= $(SUBARCH)
27
28 .PHONY: khdr
29 .NOTPARALLEL:
30 khdr:
31         make ARCH=$(ARCH) -C $(top_srcdir) headers_install
32
33 all: khdr $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
34 else
35 all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
36 endif
37
38 .ONESHELL:
39 define RUN_TEST_PRINT_RESULT
40         TEST_HDR_MSG="selftests: "`basename $$PWD`:" $$BASENAME_TEST";  \
41         echo $$TEST_HDR_MSG;                                    \
42         echo "========================================";        \
43         if [ ! -x $$TEST ]; then        \
44                 echo "$$TEST_HDR_MSG: Warning: file $$BASENAME_TEST is not executable, correct this.";\
45                 echo "not ok 1..$$test_num $$TEST_HDR_MSG [FAIL]"; \
46         else                                    \
47                 cd `dirname $$TEST` > /dev/null; \
48                 if [ "X$(summary)" != "X" ]; then       \
49                         (./$$BASENAME_TEST > /tmp/$$BASENAME_TEST 2>&1 && \
50                         echo "ok 1..$$test_num $$TEST_HDR_MSG [PASS]") || \
51                         (if [ $$? -eq $$skip ]; then    \
52                                 echo "not ok 1..$$test_num $$TEST_HDR_MSG [SKIP]";                              \
53                         else echo "not ok 1..$$test_num $$TEST_HDR_MSG [FAIL]";                                 \
54                         fi;)                    \
55                 else                            \
56                         (./$$BASENAME_TEST &&   \
57                         echo "ok 1..$$test_num $$TEST_HDR_MSG [PASS]") ||                                               \
58                         (if [ $$? -eq $$skip ]; then \
59                                 echo "not ok 1..$$test_num $$TEST_HDR_MSG [SKIP]"; \
60                         else echo "not ok 1..$$test_num $$TEST_HDR_MSG [FAIL]";                         \
61                         fi;)            \
62                 fi;                             \
63                 cd - > /dev/null;               \
64         fi;
65 endef
66
67 define RUN_TESTS
68         @export KSFT_TAP_LEVEL=`echo 1`;                \
69         test_num=`echo 0`;                              \
70         skip=`echo 4`;                                  \
71         echo "TAP version 13";                          \
72         for TEST in $(1); do                            \
73                 BASENAME_TEST=`basename $$TEST`;        \
74                 test_num=`echo $$test_num+1 | bc`;      \
75                 $(call RUN_TEST_PRINT_RESULT,$(TEST),$(BASENAME_TEST),$(test_num),$(skip))                                              \
76         done;
77 endef
78
79 run_tests: all
80 ifneq ($(KBUILD_SRC),)
81         @if [ "X$(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)" != "X" ]; then
82                 @rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT)
83         fi
84         @if [ "X$(TEST_PROGS)" != "X" ]; then
85                 $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(OUTPUT)/$(TEST_PROGS))
86         else
87                 $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS))
88         fi
89 else
90         $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
91 endif
92
93 define INSTALL_SINGLE_RULE
94         $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
95         $(if $(INSTALL_LIST),@echo rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
96         $(if $(INSTALL_LIST),@rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
97 endef
98
99 define INSTALL_RULE
100         $(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
101         $(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
102         $(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
103         $(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
104         $(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
105         $(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
106         $(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
107 endef
108
109 install: all
110 ifdef INSTALL_PATH
111         $(INSTALL_RULE)
112 else
113         $(error Error: set INSTALL_PATH to use install)
114 endif
115
116 define EMIT_TESTS
117         @test_num=`echo 0`;                             \
118         for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
119                 BASENAME_TEST=`basename $$TEST`;        \
120                 test_num=`echo $$test_num+1 | bc`;      \
121                 TEST_HDR_MSG="selftests: "`basename $$PWD`:" $$BASENAME_TEST";  \
122                 echo "echo $$TEST_HDR_MSG";     \
123                 if [ ! -x $$TEST ]; then        \
124                         echo "echo \"$$TEST_HDR_MSG: Warning: file $$BASENAME_TEST is not executable, correct this.\"";         \
125                         echo "echo \"not ok 1..$$test_num $$TEST_HDR_MSG [FAIL]\""; \
126                 else
127                         echo "(./$$BASENAME_TEST >> \$$OUTPUT 2>&1 && echo \"ok 1..$$test_num $$TEST_HDR_MSG [PASS]\") || (if [ \$$? -eq \$$skip ]; then echo \"not ok 1..$$test_num $$TEST_HDR_MSG [SKIP]\"; else echo \"not ok 1..$$test_num $$TEST_HDR_MSG [FAIL]\"; fi;)"; \
128                 fi;             \
129         done;
130 endef
131
132 emit_tests:
133         $(EMIT_TESTS)
134
135 # define if isn't already. It is undefined in make O= case.
136 ifeq ($(RM),)
137 RM := rm -f
138 endif
139
140 define CLEAN
141         $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)
142 endef
143
144 clean:
145         $(CLEAN)
146
147 # Enables to extend CFLAGS and LDFLAGS from command line, e.g.
148 # make USERCFLAGS=-Werror USERLDFLAGS=-static
149 CFLAGS += $(USERCFLAGS)
150 LDFLAGS += $(USERLDFLAGS)
151
152 # When make O= with kselftest target from main level
153 # the following aren't defined.
154 #
155 ifneq ($(KBUILD_SRC),)
156 LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
157 COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
158 LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
159 endif
160
161 # Selftest makefiles can override those targets by setting
162 # OVERRIDE_TARGETS = 1.
163 ifeq ($(OVERRIDE_TARGETS),)
164 $(OUTPUT)/%:%.c
165         $(LINK.c) $^ $(LDLIBS) -o $@
166
167 $(OUTPUT)/%.o:%.S
168         $(COMPILE.S) $^ -o $@
169
170 $(OUTPUT)/%:%.S
171         $(LINK.S) $^ $(LDLIBS) -o $@
172 endif
173
174 .PHONY: run_tests all clean install emit_tests