| @@ -1,186 +1,187 @@ | | | @@ -1,186 +1,187 @@ |
1 | # $NetBSD: Makefile,v 1.66 2020/07/26 22:15:36 rillig Exp $ | | 1 | # $NetBSD: Makefile,v 1.67 2020/07/27 18:51:56 rillig Exp $ |
2 | # | | 2 | # |
3 | # Unit tests for make(1) | | 3 | # Unit tests for make(1) |
4 | # | | 4 | # |
5 | # The main targets are: | | 5 | # The main targets are: |
6 | # | | 6 | # |
7 | # all: | | 7 | # all: |
8 | # run all the tests | | 8 | # run all the tests |
9 | # test: | | 9 | # test: |
10 | # run 'all', and compare to expected results | | 10 | # run 'all', and compare to expected results |
11 | # accept: | | 11 | # accept: |
12 | # move generated output to expected results | | 12 | # move generated output to expected results |
13 | # | | 13 | # |
14 | # Settable variables | | 14 | # Settable variables |
15 | # | | 15 | # |
16 | # TEST_MAKE | | 16 | # TEST_MAKE |
17 | # The make program to be tested. | | 17 | # The make program to be tested. |
18 | # | | 18 | # |
19 | # | | 19 | # |
20 | # Adding a test case | | 20 | # Adding a test case |
21 | # | | 21 | # |
22 | # Each feature should get its own set of tests in its own suitably | | 22 | # Each feature should get its own set of tests in its own suitably |
23 | # named makefile (*.mk), with its own set of expected results (*.exp), | | 23 | # named makefile (*.mk), with its own set of expected results (*.exp), |
24 | # and it should be added to the TESTS list. | | 24 | # and it should be added to the TESTS list. |
25 | # | | 25 | # |
26 | # Any added files must also be added to src/distrib/sets/lists/tests/mi. | | 26 | # Any added files must also be added to src/distrib/sets/lists/tests/mi. |
27 | # Makefiles that are not added to TESTS must be ignored in | | 27 | # Makefiles that are not added to TESTS must be ignored in |
28 | # src/tests/usr.bin/make/t_make.sh (example: include-sub). | | 28 | # src/tests/usr.bin/make/t_make.sh (example: include-sub). |
29 | # | | 29 | # |
30 | | | 30 | |
31 | # Each test is in a sub-makefile. | | 31 | # Each test is in a sub-makefile. |
32 | # Keep the list sorted. | | 32 | # Keep the list sorted. |
| | | 33 | TESTS+= archive |
33 | TESTS+= comment | | 34 | TESTS+= comment |
34 | TESTS+= cond-late | | 35 | TESTS+= cond-late |
35 | TESTS+= cond-short | | 36 | TESTS+= cond-short |
36 | TESTS+= cond1 | | 37 | TESTS+= cond1 |
37 | TESTS+= cond2 | | 38 | TESTS+= cond2 |
38 | TESTS+= dollar | | 39 | TESTS+= dollar |
39 | TESTS+= doterror | | 40 | TESTS+= doterror |
40 | TESTS+= dotwait | | 41 | TESTS+= dotwait |
41 | TESTS+= envfirst | | 42 | TESTS+= envfirst |
42 | TESTS+= error | | 43 | TESTS+= error |
43 | TESTS+= # escape # broken by reverting POSIX changes | | 44 | TESTS+= # escape # broken by reverting POSIX changes |
44 | TESTS+= export | | 45 | TESTS+= export |
45 | TESTS+= export-all | | 46 | TESTS+= export-all |
46 | TESTS+= export-env | | 47 | TESTS+= export-env |
47 | TESTS+= forloop | | 48 | TESTS+= forloop |
48 | TESTS+= forsubst | | 49 | TESTS+= forsubst |
49 | TESTS+= hash | | 50 | TESTS+= hash |
50 | TESTS+= # impsrc # broken by reverting POSIX changes | | 51 | TESTS+= # impsrc # broken by reverting POSIX changes |
51 | TESTS+= include-main | | 52 | TESTS+= include-main |
52 | TESTS+= misc | | 53 | TESTS+= misc |
53 | TESTS+= moderrs | | 54 | TESTS+= moderrs |
54 | TESTS+= modmatch | | 55 | TESTS+= modmatch |
55 | TESTS+= modmisc | | 56 | TESTS+= modmisc |
56 | TESTS+= modorder | | 57 | TESTS+= modorder |
57 | TESTS+= modts | | 58 | TESTS+= modts |
58 | TESTS+= modword | | 59 | TESTS+= modword |
59 | TESTS+= order | | 60 | TESTS+= order |
60 | TESTS+= # phony-end # broken by reverting POSIX changes | | 61 | TESTS+= # phony-end # broken by reverting POSIX changes |
61 | TESTS+= posix | | 62 | TESTS+= posix |
62 | TESTS+= # posix1 # broken by reverting POSIX changes | | 63 | TESTS+= # posix1 # broken by reverting POSIX changes |
63 | TESTS+= qequals | | 64 | TESTS+= qequals |
64 | TESTS+= # suffixes # broken by reverting POSIX changes | | 65 | TESTS+= # suffixes # broken by reverting POSIX changes |
65 | TESTS+= sunshcmd | | 66 | TESTS+= sunshcmd |
66 | TESTS+= sysv | | 67 | TESTS+= sysv |
67 | TESTS+= ternary | | 68 | TESTS+= ternary |
68 | TESTS+= unexport | | 69 | TESTS+= unexport |
69 | TESTS+= unexport-env | | 70 | TESTS+= unexport-env |
70 | TESTS+= varcmd | | 71 | TESTS+= varcmd |
71 | TESTS+= vardebug | | 72 | TESTS+= vardebug |
72 | TESTS+= varfind | | 73 | TESTS+= varfind |
73 | TESTS+= varmisc | | 74 | TESTS+= varmisc |
74 | TESTS+= varmod-edge | | 75 | TESTS+= varmod-edge |
75 | TESTS+= varparse-dynamic | | 76 | TESTS+= varparse-dynamic |
76 | TESTS+= varquote | | 77 | TESTS+= varquote |
77 | TESTS+= varshell | | 78 | TESTS+= varshell |
78 | | | 79 | |
79 | # Override environment variables for some of the tests. | | 80 | # Override environment variables for some of the tests. |
80 | ENV.envfirst= FROM_ENV=value-from-env | | 81 | ENV.envfirst= FROM_ENV=value-from-env |
81 | ENV.varmisc= FROM_ENV=env | | 82 | ENV.varmisc= FROM_ENV=env |
82 | ENV.varmisc+= FROM_ENV_BEFORE=env | | 83 | ENV.varmisc+= FROM_ENV_BEFORE=env |
83 | ENV.varmisc+= FROM_ENV_AFTER=env | | 84 | ENV.varmisc+= FROM_ENV_AFTER=env |
84 | | | 85 | |
85 | # Override make flags for some of the tests; default is -k. | | 86 | # Override make flags for some of the tests; default is -k. |
86 | FLAGS.doterror= # none | | 87 | FLAGS.doterror= # none |
87 | FLAGS.order= -j1 | | 88 | FLAGS.order= -j1 |
88 | FLAGS.envfirst= -e | | 89 | FLAGS.envfirst= -e |
89 | FLAGS.vardebug= -k -dv FROM_CMDLINE= | | 90 | FLAGS.vardebug= -k -dv FROM_CMDLINE= |
90 | | | 91 | |
91 | # Some tests need extra post-processing. | | 92 | # Some tests need extra post-processing. |
92 | SED_CMDS.modmisc+= -e 's,\(substitution error:\).*,\1 (details omitted),' | | 93 | SED_CMDS.modmisc+= -e 's,\(substitution error:\).*,\1 (details omitted),' |
93 | SED_CMDS.varshell+= -e 's,^[a-z]*sh: ,,' | | 94 | SED_CMDS.varshell+= -e 's,^[a-z]*sh: ,,' |
94 | SED_CMDS.varshell+= -e '/command/s,No such.*,not found,' | | 95 | SED_CMDS.varshell+= -e '/command/s,No such.*,not found,' |
95 | | | 96 | |
96 | # Some tests need an additional round of postprocessing. | | 97 | # Some tests need an additional round of postprocessing. |
97 | POSTPROC.vardebug= ${TOOL_SED} -n -e '/:RELEVANT = yes/,/:RELEVANT = no/p' | | 98 | POSTPROC.vardebug= ${TOOL_SED} -n -e '/:RELEVANT = yes/,/:RELEVANT = no/p' |
98 | | | 99 | |
99 | # End of the configuration section. | | 100 | # End of the configuration section. |
100 | | | 101 | |
101 | .MAIN: all | | 102 | .MAIN: all |
102 | | | 103 | |
103 | UNIT_TESTS:= ${.PARSEDIR} | | 104 | UNIT_TESTS:= ${.PARSEDIR} |
104 | .PATH: ${UNIT_TESTS} | | 105 | .PATH: ${UNIT_TESTS} |
105 | | | 106 | |
106 | OUTFILES= ${TESTS:=.out} | | 107 | OUTFILES= ${TESTS:=.out} |
107 | | | 108 | |
108 | all: ${OUTFILES} | | 109 | all: ${OUTFILES} |
109 | | | 110 | |
110 | CLEANFILES+= *.rawout *.out *.status *.tmp *.core *.tmp | | 111 | CLEANFILES+= *.rawout *.out *.status *.tmp *.core *.tmp |
111 | CLEANFILES+= obj*.[och] lib*.a # posix1.mk | | 112 | CLEANFILES+= obj*.[och] lib*.a # posix1.mk |
112 | CLEANFILES+= issue* .[ab]* # suffixes.mk | | 113 | CLEANFILES+= issue* .[ab]* # suffixes.mk |
113 | CLEANRECURSIVE+= dir dummy # posix1.mk | | 114 | CLEANRECURSIVE+= dir dummy # posix1.mk |
114 | | | 115 | |
115 | clean: | | 116 | clean: |
116 | rm -f ${CLEANFILES} | | 117 | rm -f ${CLEANFILES} |
117 | .if !empty(CLEANRECURSIVE) | | 118 | .if !empty(CLEANRECURSIVE) |
118 | rm -rf ${CLEANRECURSIVE} | | 119 | rm -rf ${CLEANRECURSIVE} |
119 | .endif | | 120 | .endif |
120 | | | 121 | |
121 | TEST_MAKE?= ${.MAKE} | | 122 | TEST_MAKE?= ${.MAKE} |
122 | TOOL_SED?= sed | | 123 | TOOL_SED?= sed |
123 | | | 124 | |
124 | # ensure consistent results from sort(1) | | 125 | # ensure consistent results from sort(1) |
125 | LC_ALL= C | | 126 | LC_ALL= C |
126 | LANG= C | | 127 | LANG= C |
127 | .export LANG LC_ALL | | 128 | .export LANG LC_ALL |
128 | | | 129 | |
129 | # the tests are actually done with sub-makes. | | 130 | # the tests are actually done with sub-makes. |
130 | .SUFFIXES: .mk .rawout .out | | 131 | .SUFFIXES: .mk .rawout .out |
131 | .mk.rawout: | | 132 | .mk.rawout: |
132 | @echo testing ${.IMPSRC} | | 133 | @echo testing ${.IMPSRC} |
133 | @set -eu; \ | | 134 | @set -eu; \ |
134 | cd ${.OBJDIR}; \ | | 135 | cd ${.OBJDIR}; \ |
135 | ${ENV.${.TARGET:R}} ${TEST_MAKE} \ | | 136 | ${ENV.${.TARGET:R}} ${TEST_MAKE} \ |
136 | ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} \ | | 137 | ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} \ |
137 | > ${.TARGET}.tmp 2>&1 \ | | 138 | > ${.TARGET}.tmp 2>&1 \ |
138 | && status=$$? || status=$$?; \ | | 139 | && status=$$? || status=$$?; \ |
139 | echo $$status > ${.TARGET:R}.status | | 140 | echo $$status > ${.TARGET:R}.status |
140 | @mv ${.TARGET}.tmp ${.TARGET} | | 141 | @mv ${.TARGET}.tmp ${.TARGET} |
141 | | | 142 | |
142 | # Post-process the test output so that the results can be compared. | | 143 | # Post-process the test output so that the results can be compared. |
143 | # | | 144 | # |
144 | # always pretend .MAKE was called 'make' | | 145 | # always pretend .MAKE was called 'make' |
145 | _SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,' | | 146 | _SED_CMDS+= -e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,' |
146 | _SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,' | | 147 | _SED_CMDS+= -e 's,${TEST_MAKE:S,.,\\.,g},make,' |
147 | # replace anything after 'stopped in' with unit-tests | | 148 | # replace anything after 'stopped in' with unit-tests |
148 | _SED_CMDS+= -e '/stopped/s, /.*, unit-tests,' | | 149 | _SED_CMDS+= -e '/stopped/s, /.*, unit-tests,' |
149 | # strip ${.CURDIR}/ from the output | | 150 | # strip ${.CURDIR}/ from the output |
150 | _SED_CMDS+= -e 's,${.CURDIR:S,.,\\.,g}/,,g' | | 151 | _SED_CMDS+= -e 's,${.CURDIR:S,.,\\.,g}/,,g' |
151 | _SED_CMDS+= -e 's,${UNIT_TESTS:S,.,\\.,g}/,,g' | | 152 | _SED_CMDS+= -e 's,${UNIT_TESTS:S,.,\\.,g}/,,g' |
152 | | | 153 | |
153 | .rawout.out: | | 154 | .rawout.out: |
154 | @echo postprocess ${.TARGET} | | 155 | @echo postprocess ${.TARGET} |
155 | @${TOOL_SED} ${_SED_CMDS} ${SED_CMDS.${.TARGET:R}} \ | | 156 | @${TOOL_SED} ${_SED_CMDS} ${SED_CMDS.${.TARGET:R}} \ |
156 | < ${.IMPSRC} > ${.TARGET}.tmp1 | | 157 | < ${.IMPSRC} > ${.TARGET}.tmp1 |
157 | @${POSTPROC.${.TARGET:R}:U${TOOL_SED}} < ${.TARGET}.tmp1 > ${.TARGET}.tmp2 | | 158 | @${POSTPROC.${.TARGET:R}:U${TOOL_SED}} < ${.TARGET}.tmp1 > ${.TARGET}.tmp2 |
158 | @rm ${.TARGET}.tmp1 | | 159 | @rm ${.TARGET}.tmp1 |
159 | @echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp2 | | 160 | @echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp2 |
160 | @mv ${.TARGET}.tmp2 ${.TARGET} | | 161 | @mv ${.TARGET}.tmp2 ${.TARGET} |
161 | | | 162 | |
162 | # Compare all output files | | 163 | # Compare all output files |
163 | test: ${OUTFILES} .PHONY | | 164 | test: ${OUTFILES} .PHONY |
164 | @failed= ; \ | | 165 | @failed= ; \ |
165 | for test in ${TESTS}; do \ | | 166 | for test in ${TESTS}; do \ |
166 | diff -u ${UNIT_TESTS}/$${test}.exp $${test}.out \ | | 167 | diff -u ${UNIT_TESTS}/$${test}.exp $${test}.out \ |
167 | || failed="$${failed}$${failed:+ }$${test}" ; \ | | 168 | || failed="$${failed}$${failed:+ }$${test}" ; \ |
168 | done ; \ | | 169 | done ; \ |
169 | if [ -n "$${failed}" ]; then \ | | 170 | if [ -n "$${failed}" ]; then \ |
170 | echo "Failed tests: $${failed}" ; false ; \ | | 171 | echo "Failed tests: $${failed}" ; false ; \ |
171 | else \ | | 172 | else \ |
172 | echo "All tests passed" ; \ | | 173 | echo "All tests passed" ; \ |
173 | fi | | 174 | fi |
174 | | | 175 | |
175 | accept: | | 176 | accept: |
176 | @for test in ${TESTS}; do \ | | 177 | @for test in ${TESTS}; do \ |
177 | cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \ | | 178 | cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \ |
178 | || { echo "Replacing $${test}.exp" ; \ | | 179 | || { echo "Replacing $${test}.exp" ; \ |
179 | cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \ | | 180 | cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \ |
180 | done | | 181 | done |
181 | | | 182 | |
182 | .if exists(${TEST_MAKE}) | | 183 | .if exists(${TEST_MAKE}) |
183 | ${TESTS:=.rawout}: ${TEST_MAKE} | | 184 | ${TESTS:=.rawout}: ${TEST_MAKE} |
184 | .endif | | 185 | .endif |
185 | | | 186 | |
186 | .-include <bsd.obj.mk> | | 187 | .-include <bsd.obj.mk> |