xref: /freebsd/contrib/bmake/unit-tests/Makefile (revision 3841c287)
13841c287SSimon J. Gerraty# $Id: Makefile,v 1.60 2020/07/10 00:48:32 sjg Exp $
249caa483SSimon J. Gerraty#
33841c287SSimon J. Gerraty# $NetBSD: Makefile,v 1.63 2020/07/09 22:40:14 sjg Exp $
449caa483SSimon J. Gerraty#
549caa483SSimon J. Gerraty# Unit tests for make(1)
63841c287SSimon J. Gerraty#
749caa483SSimon J. Gerraty# The main targets are:
849caa483SSimon J. Gerraty#
93841c287SSimon J. Gerraty# all:
103841c287SSimon J. Gerraty#	run all the tests
113841c287SSimon J. Gerraty# test:
123841c287SSimon J. Gerraty#	run 'all', and compare to expected results
133841c287SSimon J. Gerraty# accept:
143841c287SSimon J. Gerraty#	move generated output to expected results
1549caa483SSimon J. Gerraty#
163841c287SSimon J. Gerraty# Settable variables
173841c287SSimon J. Gerraty#
183841c287SSimon J. Gerraty# TEST_MAKE
193841c287SSimon J. Gerraty#	The make program to be tested.
203841c287SSimon J. Gerraty#
213841c287SSimon J. Gerraty#
223841c287SSimon J. Gerraty# Adding a test case
233841c287SSimon J. Gerraty#
2449caa483SSimon J. Gerraty# Each feature should get its own set of tests in its own suitably
2549caa483SSimon J. Gerraty# named makefile (*.mk), with its own set of expected results (*.exp),
263841c287SSimon J. Gerraty# and it should be added to the TESTS list.
2749caa483SSimon J. Gerraty#
283841c287SSimon J. Gerraty# Any added files must also be added to src/distrib/sets/lists/tests/mi.
293841c287SSimon J. Gerraty# Makefiles that are not added to TESTS must be ignored in
303841c287SSimon J. Gerraty# src/tests/usr.bin/make/t_make.sh (example: include-sub).
313841c287SSimon J. Gerraty#
323841c287SSimon J. Gerraty
333841c287SSimon J. Gerraty# Each test is in a sub-makefile.
343841c287SSimon J. Gerraty# Keep the list sorted.
353841c287SSimon J. GerratyTESTS+=		comment
363841c287SSimon J. GerratyTESTS+=		cond-late
373841c287SSimon J. GerratyTESTS+=		cond-short
383841c287SSimon J. GerratyTESTS+=		cond1
393841c287SSimon J. GerratyTESTS+=		cond2
403841c287SSimon J. GerratyTESTS+=		dollar
413841c287SSimon J. GerratyTESTS+=		doterror
423841c287SSimon J. GerratyTESTS+=		dotwait
433841c287SSimon J. GerratyTESTS+=		error
443841c287SSimon J. GerratyTESTS+=		# escape	# broken by reverting POSIX changes
453841c287SSimon J. GerratyTESTS+=		export
463841c287SSimon J. GerratyTESTS+=		export-all
473841c287SSimon J. GerratyTESTS+=		export-env
483841c287SSimon J. GerratyTESTS+=		forloop
493841c287SSimon J. GerratyTESTS+=		forsubst
503841c287SSimon J. GerratyTESTS+=		hash
513841c287SSimon J. GerratyTESTS+=		# impsrc	# broken by reverting POSIX changes
523841c287SSimon J. GerratyTESTS+=		include-main
533841c287SSimon J. GerratyTESTS+=		misc
543841c287SSimon J. GerratyTESTS+=		moderrs
553841c287SSimon J. GerratyTESTS+=		modmatch
563841c287SSimon J. GerratyTESTS+=		modmisc
573841c287SSimon J. GerratyTESTS+=		modorder
583841c287SSimon J. GerratyTESTS+=		modts
593841c287SSimon J. GerratyTESTS+=		modword
603841c287SSimon J. GerratyTESTS+=		order
613841c287SSimon J. GerratyTESTS+=		# phony-end	# broken by reverting POSIX changes
623841c287SSimon J. GerratyTESTS+=		posix
633841c287SSimon J. GerratyTESTS+=		# posix1	# broken by reverting POSIX changes
643841c287SSimon J. GerratyTESTS+=		qequals
653841c287SSimon J. GerratyTESTS+=		# suffixes	# broken by reverting POSIX changes
663841c287SSimon J. GerratyTESTS+=		sunshcmd
673841c287SSimon J. GerratyTESTS+=		sysv
683841c287SSimon J. GerratyTESTS+=		ternary
693841c287SSimon J. GerratyTESTS+=		unexport
703841c287SSimon J. GerratyTESTS+=		unexport-env
713841c287SSimon J. GerratyTESTS+=		varcmd
723841c287SSimon J. GerratyTESTS+=		varmisc
733841c287SSimon J. GerratyTESTS+=		varmod-edge
743841c287SSimon J. GerratyTESTS+=		varquote
753841c287SSimon J. GerratyTESTS+=		varshell
763841c287SSimon J. Gerraty
773841c287SSimon J. Gerraty# Override make flags for certain tests; default is -k.
783841c287SSimon J. GerratyFLAGS.doterror=		# none
793841c287SSimon J. GerratyFLAGS.order=		-j1
803841c287SSimon J. Gerraty
813841c287SSimon J. Gerraty# Some tests need extra post-processing.
823841c287SSimon J. GerratySED_CMDS.modmisc+=	-e 's,\(substitution error:\).*,\1 (details omitted),'
833841c287SSimon J. GerratySED_CMDS.varshell+=	-e 's,^[a-z]*sh: ,,'
843841c287SSimon J. GerratySED_CMDS.varshell+=	-e '/command/s,No such.*,not found,'
853841c287SSimon J. Gerraty
863841c287SSimon J. Gerraty# End of the configuration section.
8749caa483SSimon J. Gerraty
8849caa483SSimon J. Gerraty.MAIN: all
8949caa483SSimon J. Gerraty
9049caa483SSimon J. Gerraty.-include "Makefile.config"
9149caa483SSimon J. Gerraty
9249caa483SSimon J. GerratyUNIT_TESTS:=	${.PARSEDIR}
9349caa483SSimon J. Gerraty.PATH: ${UNIT_TESTS}
9449caa483SSimon J. Gerraty
953841c287SSimon J. GerratyOUTFILES=	${TESTS:=.out}
9649caa483SSimon J. Gerraty
9749caa483SSimon J. Gerratyall: ${OUTFILES}
9849caa483SSimon J. Gerraty
9949caa483SSimon J. GerratyCLEANFILES+=		*.rawout *.out *.status *.tmp *.core *.tmp
10049caa483SSimon J. GerratyCLEANFILES+=		obj*.[och] lib*.a	# posix1.mk
10149caa483SSimon J. GerratyCLEANFILES+=		issue* .[ab]*		# suffixes.mk
10249caa483SSimon J. GerratyCLEANRECURSIVE+=	dir dummy		# posix1.mk
10349caa483SSimon J. Gerraty
10449caa483SSimon J. Gerratyclean:
10549caa483SSimon J. Gerraty	rm -f ${CLEANFILES}
10649caa483SSimon J. Gerraty.if !empty(CLEANRECURSIVE)
10749caa483SSimon J. Gerraty	rm -rf ${CLEANRECURSIVE}
10849caa483SSimon J. Gerraty.endif
10949caa483SSimon J. Gerraty
11049caa483SSimon J. GerratyTEST_MAKE?=	${.MAKE}
11149caa483SSimon J. GerratyTOOL_SED?=	sed
11249caa483SSimon J. GerratyTOOL_TR?=	tr
11349caa483SSimon J. GerratyTOOL_DIFF?=	diff
1143841c287SSimon J. GerratyDIFF_FLAGS?=	-u
11549caa483SSimon J. Gerraty
11649caa483SSimon J. Gerraty.if defined(.PARSEDIR)
11749caa483SSimon J. Gerraty# ensure consistent results from sort(1)
11849caa483SSimon J. GerratyLC_ALL=		C
11949caa483SSimon J. GerratyLANG=		C
12049caa483SSimon J. Gerraty.export LANG LC_ALL
12149caa483SSimon J. Gerraty.endif
12249caa483SSimon J. Gerraty
12349caa483SSimon J. Gerraty# the tests are actually done with sub-makes.
12449caa483SSimon J. Gerraty.SUFFIXES: .mk .rawout .out
12549caa483SSimon J. Gerraty.mk.rawout:
1263841c287SSimon J. Gerraty	@echo ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC}
12749caa483SSimon J. Gerraty	-@cd ${.OBJDIR} && \
1283841c287SSimon J. Gerraty	{ ${TEST_MAKE} ${FLAGS.${.TARGET:R}:U-k} -f ${.IMPSRC} \
12949caa483SSimon J. Gerraty	  2>&1 ; echo $$? >${.TARGET:R}.status ; } > ${.TARGET}.tmp
13049caa483SSimon J. Gerraty	@mv ${.TARGET}.tmp ${.TARGET}
13149caa483SSimon J. Gerraty
1323841c287SSimon J. Gerraty# Post-process the test output so that the results can be compared.
1333841c287SSimon J. Gerraty#
1343841c287SSimon J. Gerraty# always pretend .MAKE was called 'make'
1353841c287SSimon J. Gerraty_SED_CMDS+=	-e 's,^${TEST_MAKE:T:S,.,\\.,g}[][0-9]*:,make:,'
1363841c287SSimon J. Gerraty_SED_CMDS+=	-e 's,${TEST_MAKE:S,.,\\.,g},make,'
1373841c287SSimon J. Gerraty# replace anything after 'stopped in' with unit-tests
1383841c287SSimon J. Gerraty_SED_CMDS+=	-e '/stopped/s, /.*, unit-tests,'
1393841c287SSimon J. Gerraty# strip ${.CURDIR}/ from the output
1403841c287SSimon J. Gerraty_SED_CMDS+=	-e 's,${.CURDIR:S,.,\\.,g}/,,g'
1413841c287SSimon J. Gerraty_SED_CMDS+=	-e 's,${UNIT_TESTS:S,.,\\.,g}/,,g'
1423841c287SSimon J. Gerraty
14349caa483SSimon J. Gerraty.rawout.out:
14449caa483SSimon J. Gerraty	@echo postprocess ${.TARGET}
1453841c287SSimon J. Gerraty	@${TOOL_SED} ${_SED_CMDS} ${SED_CMDS.${.TARGET:R}} \
14649caa483SSimon J. Gerraty	  < ${.IMPSRC} > ${.TARGET}.tmp
14749caa483SSimon J. Gerraty	@echo "exit status `cat ${.TARGET:R}.status`" >> ${.TARGET}.tmp
14849caa483SSimon J. Gerraty	@mv ${.TARGET}.tmp ${.TARGET}
14949caa483SSimon J. Gerraty
15049caa483SSimon J. Gerraty# Compare all output files
15149caa483SSimon J. Gerratytest:	${OUTFILES} .PHONY
15249caa483SSimon J. Gerraty	@failed= ; \
1533841c287SSimon J. Gerraty	for test in ${TESTS}; do \
15449caa483SSimon J. Gerraty	  ${TOOL_DIFF} ${DIFF_FLAGS} ${UNIT_TESTS}/$${test}.exp $${test}.out \
15549caa483SSimon J. Gerraty	  || failed="$${failed}$${failed:+ }$${test}" ; \
15649caa483SSimon J. Gerraty	done ; \
15749caa483SSimon J. Gerraty	if [ -n "$${failed}" ]; then \
15849caa483SSimon J. Gerraty	  echo "Failed tests: $${failed}" ; false ; \
15949caa483SSimon J. Gerraty	else \
16049caa483SSimon J. Gerraty	  echo "All tests passed" ; \
16149caa483SSimon J. Gerraty	fi
16249caa483SSimon J. Gerraty
16349caa483SSimon J. Gerratyaccept:
1643841c287SSimon J. Gerraty	@for test in ${TESTS}; do \
16549caa483SSimon J. Gerraty	  cmp -s ${UNIT_TESTS}/$${test}.exp $${test}.out \
16649caa483SSimon J. Gerraty	  || { echo "Replacing $${test}.exp" ; \
16749caa483SSimon J. Gerraty	       cp $${test}.out ${UNIT_TESTS}/$${test}.exp ; } \
16849caa483SSimon J. Gerraty	done
16949caa483SSimon J. Gerraty
17049caa483SSimon J. Gerraty.if exists(${TEST_MAKE})
1713841c287SSimon J. Gerraty${TESTS:=.rawout}: ${TEST_MAKE}
17249caa483SSimon J. Gerraty.endif
17349caa483SSimon J. Gerraty
17449caa483SSimon J. Gerraty.-include <obj.mk>
175