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