Makefile revision 1.44 1 1.44 apb # $NetBSD: Makefile,v 1.44 2014/08/21 22:00:30 apb Exp $
2 1.1 sjg #
3 1.1 sjg # Unit tests for make(1)
4 1.1 sjg # The main targets are:
5 1.1 sjg #
6 1.1 sjg # all: run all the tests
7 1.42 apb # test: run 'all', and compare to expected results
8 1.1 sjg # accept: move generated output to expected results
9 1.1 sjg #
10 1.1 sjg # Adding a test case.
11 1.11 sjg # Each feature should get its own set of tests in its own suitably
12 1.42 apb # named makefile (*.mk), with its own set of expected results (*.exp),
13 1.42 apb # and it should be added to the TESTNAMES list.
14 1.1 sjg #
15 1.1 sjg
16 1.1 sjg .MAIN: all
17 1.1 sjg
18 1.7 sjg UNIT_TESTS:= ${.PARSEDIR}
19 1.44 apb .PATH: ${UNIT_TESTS}
20 1.7 sjg
21 1.42 apb # Each test is in a sub-makefile.
22 1.42 apb # Keep the list sorted.
23 1.42 apb TESTNAMES= \
24 1.16 rpaulo comment \
25 1.12 sjg cond1 \
26 1.26 sjg error \
27 1.21 sjg export \
28 1.21 sjg export-all \
29 1.36 sjg export-env \
30 1.26 sjg doterror \
31 1.19 apb dotwait \
32 1.34 sjg forloop \
33 1.24 sjg forsubst \
34 1.32 joerg hash \
35 1.31 sjg misc \
36 1.20 sjg moderrs \
37 1.11 sjg modmatch \
38 1.18 sjg modmisc \
39 1.15 sjg modorder \
40 1.11 sjg modts \
41 1.11 sjg modword \
42 1.35 sjg order \
43 1.33 sjg phony-end \
44 1.13 sjg posix \
45 1.22 sjg qequals \
46 1.38 sjg sunshcmd \
47 1.31 sjg sysv \
48 1.11 sjg ternary \
49 1.25 sjg unexport \
50 1.25 sjg unexport-env \
51 1.39 apb varcmd \
52 1.43 apb varmisc \
53 1.39 apb varshell
54 1.11 sjg
55 1.42 apb # Override make flags for certain tests
56 1.26 sjg flags.doterror=
57 1.35 sjg flags.order=-j1
58 1.26 sjg
59 1.42 apb OUTFILES= ${TESTNAMES:S/$/.out/}
60 1.42 apb
61 1.42 apb all: ${OUTFILES}
62 1.9 sjg
63 1.1 sjg clean:
64 1.42 apb rm -f *.rawout *.out *.status *.tmp *.core *.tmp
65 1.1 sjg
66 1.15 sjg TEST_MAKE?= ${.MAKE}
67 1.27 sjg TOOL_SED?= sed
68 1.1 sjg
69 1.28 sjg # ensure consistent results from sort(1)
70 1.30 sjg LC_ALL= C
71 1.28 sjg LANG= C
72 1.29 sjg .export LANG LC_ALL
73 1.28 sjg
74 1.42 apb # the tests are actually done with sub-makes.
75 1.42 apb .SUFFIXES: .mk .rawout .out
76 1.42 apb .mk.rawout:
77 1.42 apb @echo ${TEST_MAKE} ${flags.${.TARGET:R}:U-k} -f ${.IMPSRC}
78 1.42 apb -@cd ${.OBJDIR} && \
79 1.42 apb { ${TEST_MAKE} ${flags.${.TARGET:R}:U-k} -f ${.IMPSRC} \
80 1.42 apb 2>&1 ; echo $$? >${.TARGET:R}.status ; } > ${.TARGET}.tmp
81 1.42 apb @mv ${.TARGET}.tmp ${.TARGET}
82 1.42 apb
83 1.12 sjg # We always pretend .MAKE was called 'make'
84 1.12 sjg # and strip ${.CURDIR}/ from the output
85 1.13 sjg # and replace anything after 'stopped in' with unit-tests
86 1.12 sjg # so the results can be compared.
87 1.42 apb .rawout.out:
88 1.42 apb @echo postprocess ${.TARGET}
89 1.42 apb @${TOOL_SED} -e 's,^${TEST_MAKE:T:C/\./\\\./g}[][0-9]*:,make:,' \
90 1.42 apb -e 's,${TEST_MAKE:C/\./\\\./g},make,' \
91 1.42 apb -e '/stopped/s, /.*, unit-tests,' \
92 1.42 apb -e 's,${.CURDIR:C/\./\\\./g}/,,g' \
93 1.42 apb -e 's,${UNIT_TESTS:C/\./\\\./g}/,,g' \
94 1.42 apb < ${.IMPSRC} > ${.TARGET}.tmp
95 1.42 apb @echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp
96 1.42 apb @mv ${.TARGET}.tmp ${.TARGET}
97 1.42 apb
98 1.42 apb # Compare all output files
99 1.42 apb test: ${OUTFILES} .PHONY
100 1.42 apb @failed= ; \
101 1.42 apb for test in ${TESTNAMES}; do \
102 1.42 apb diff -u ${UNIT_TESTS}/$${test}.exp $${test}.out \
103 1.42 apb || failed="$${failed}$${failed:+ }$${test}" ; \
104 1.42 apb done ; \
105 1.42 apb if [ -n "$${failed}" ]; then \
106 1.42 apb echo "Failed tests: $${failed}" ; false ; \
107 1.42 apb else \
108 1.42 apb echo "All tests passed" ; \
109 1.42 apb fi
110 1.1 sjg
111 1.1 sjg accept:
112 1.42 apb @for test in ${TESTNAMES}; do \
113 1.42 apb cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \
114 1.42 apb || { echo "Replacing $${test}.exp" ; \
115 1.42 apb cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \
116 1.42 apb done
117 1.1 sjg
118 1.42 apb .-include <bsd.obj.mk>
119