/* * regression test support * * @(#)TEST.mk (AT&T Research) 2010-05-19 * * test management is still in the design phase */ /* * three forms for :TEST: * * :TEST: xxx yyy ... * * $(REGRESS) $(REGRESSFLAGS) xxx.tst * $(REGRESS) $(REGRESSFLAGS) yyy.tst * * :TEST: xxx.tst yyy ... * * $(REGRESS) $(REGRESSFLAGS) xxx.tst yyy ... * * :TEST: xxx.c [ :: test-prereq ... :: ] [ args [ : args ... ] ] * * :TEST: xxx.sh [ :: test-prereq ... :: ] [ args [ : args ... ] ] * * xxx :TEST: prereq ... * [ action ] * * $(*) if no action */ ":TEST:" : .MAKE .OPERATOR local B G P S T test : .INSERT .TESTINIT if "$("tests":T=FD)" .SOURCE : tests end P := $(>:O=1) if "$(P:N=*.tst)" && ! "$(@:V)" B := $(P:B) if ! ( T = "$(<:V)" ) T := $(B) end test : - test.$(T) eval test.$$(T) : $$(B).tst $$(REGRESS) $$(REGRESSFLAGS) $$(*) $(>:V:O>1) :SAVE: $$(B).tst end elif "$(P:N=*@(.sh|$(.SUFFIX.c:/ /|/G)|$(.SUFFIX.C:/ /|/G)))" B := $(P:B) if ! ( T = "$(<:V)" ) T := $(B) end :INSTALLDIR: $(B) $(B) :: $(P) $(*:-l*|*$(CC.SUFFIX.ARCHIVE)) if "$(P:N=*.sh)" TESTCC == $(CC) $(B) : (TESTCC) end test : - test.$(T) if "$(@:V)" eval test.$$(T) : $$(B) $(>:V:O>1) set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x $(@:V) end elif "$(>:V:O>1)" local I A V X S R=0 for A $(>:V:O>1) if A == "::" let R = !R elif A == ":" let I = I + 1 test.$(T).$(I) := $(V:V) V = X := $(X:V)$(S)$$(*) $$(test.$(T).$(I):T=*) S = $("\n") elif A != "-l*|*$(CC.SUFFIX.ARCHIVE)" if R test.$(A) : .VIRTUAL .FORCE test.$(T) : test.$(A) else V += $(A:V) end end end if V let I = I + 1 test.$(T).$(I) := $(V:V) X := $(X:V)$(S)$$(*) $$(test.$(T).$(I):T=*) end eval test.$$(T) : $$(B) set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x $(X:V) end else eval test.$$(T) : $$(B) set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x $$(*) end end elif ! "$(<:V)" G = 1 for B $(>) if B == "-|--" let G = !G else if ! G T = elif ! ( T = "$(B:A=.COMMAND)" ) && ! "$(B:A=.TARGET)" for S .c .sh if "$(B:B:S=$(S):T=F)" :INSTALLDIR: $(B) $(B) :: $(B:B:S=$(S)) T := $(B) break end end end test : - test.$(B) test.$(B) : $(T) - $(B).tst $(REGRESS) $(REGRESSFLAGS) $(*:N=*.tst) $(*:N!=*.tst) :SAVE: $(B).tst end end else if "$(>:V)" || "$(@:V)" P := $(>) T := $(P:O=1) B := $(T:B) if "$(T)" != "$(B)" && "$(T:G=$(B))" :INSTALLDIR: $(B) $(B) :: $(T) $(P:O>1:N=-*) T := $(B) P := $(B) $(P:O>1:N!=-*) end if "$(<:V)" T := $(<:V) end test : - test.$(T) if "$(@:V)" eval test.$$(T) : $$(P) $(>:V:O>1) set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x $(@:V) end else test.$(T) : $(P) set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x $(*) end else test : - test.$(<) test.$(<) : $(<).tst $(<:A=.COMMAND) $(REGRESS) $(REGRESSFLAGS) $(*) end end .TESTINIT : .MAKE .VIRTUAL .FORCE .REPEAT if VARIANT == "DLL" error 1 :DLL: tests skipped exit 0 end set keepgoing REGRESSFLAGS &= $(TESTS:@/ /|/G:/.*/--test=&/:@Q) .SCAN.tst : .SCAN $(@.SCAN.sh) I| INCLUDE@ % | .ATTRIBUTE.%.tst : .SCAN.tst MKTEST = mktest MKTESTFLAGS = --style=regress /* * test scripts are only regenerated from *.rt when --force * is specified or the .rt file is newer than the script * otherwise the script is accepted if it exists * * this avoids the case where a fresh build with no state * would regenerate the test script and capture current * behavior instead of expected behavior */ %.tst : %.rt if [[ "$(-force)" || "$(>)" -nt "$(^|<)" ]] then $(MKTEST) $(MKTESTFLAGS) $(>) > $(<) fi test%.sh test%.out : %.rt if [[ "$(-force)" || "$(>)" -nt "$(^|<:O=1)" ]] then $(MKTEST) --style=shell $(>) > $(<:N=*.sh) $(SHELL) $(<:N=*.sh) --accept > $(<:N=*.out) fi