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