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