1*b30d1939SAndy Fiddaman/* 2*b30d1939SAndy Fiddaman * regression test support 3*b30d1939SAndy Fiddaman * 4*b30d1939SAndy Fiddaman * @(#)TEST.mk (AT&T Research) 2010-05-19 5*b30d1939SAndy Fiddaman * 6*b30d1939SAndy Fiddaman * test management is still in the design phase 7*b30d1939SAndy Fiddaman */ 8*b30d1939SAndy Fiddaman 9*b30d1939SAndy Fiddaman/* 10*b30d1939SAndy Fiddaman * three forms for :TEST: 11*b30d1939SAndy Fiddaman * 12*b30d1939SAndy Fiddaman * :TEST: xxx yyy ... 13*b30d1939SAndy Fiddaman * 14*b30d1939SAndy Fiddaman * $(REGRESS) $(REGRESSFLAGS) xxx.tst 15*b30d1939SAndy Fiddaman * $(REGRESS) $(REGRESSFLAGS) yyy.tst 16*b30d1939SAndy Fiddaman * 17*b30d1939SAndy Fiddaman * :TEST: xxx.tst yyy ... 18*b30d1939SAndy Fiddaman * 19*b30d1939SAndy Fiddaman * $(REGRESS) $(REGRESSFLAGS) xxx.tst yyy ... 20*b30d1939SAndy Fiddaman * 21*b30d1939SAndy Fiddaman * :TEST: xxx.c [ :: test-prereq ... :: ] [ args [ : args ... ] ] 22*b30d1939SAndy Fiddaman * 23*b30d1939SAndy Fiddaman * :TEST: xxx.sh [ :: test-prereq ... :: ] [ args [ : args ... ] ] 24*b30d1939SAndy Fiddaman * 25*b30d1939SAndy Fiddaman * xxx :TEST: prereq ... 26*b30d1939SAndy Fiddaman * [ action ] 27*b30d1939SAndy Fiddaman * 28*b30d1939SAndy Fiddaman * $(*) if no action 29*b30d1939SAndy Fiddaman */ 30*b30d1939SAndy Fiddaman 31*b30d1939SAndy Fiddaman":TEST:" : .MAKE .OPERATOR 32*b30d1939SAndy Fiddaman local B G P S T 33*b30d1939SAndy Fiddaman test : .INSERT .TESTINIT 34*b30d1939SAndy Fiddaman if "$("tests":T=FD)" 35*b30d1939SAndy Fiddaman .SOURCE : tests 36*b30d1939SAndy Fiddaman end 37*b30d1939SAndy Fiddaman P := $(>:O=1) 38*b30d1939SAndy Fiddaman if "$(P:N=*.tst)" && ! "$(@:V)" 39*b30d1939SAndy Fiddaman B := $(P:B) 40*b30d1939SAndy Fiddaman if ! ( T = "$(<:V)" ) 41*b30d1939SAndy Fiddaman T := $(B) 42*b30d1939SAndy Fiddaman end 43*b30d1939SAndy Fiddaman test : - test.$(T) 44*b30d1939SAndy Fiddaman eval 45*b30d1939SAndy Fiddaman test.$$(T) : $$(B).tst 46*b30d1939SAndy Fiddaman $$(REGRESS) $$(REGRESSFLAGS) $$(*) $(>:V:O>1) 47*b30d1939SAndy Fiddaman :SAVE: $$(B).tst 48*b30d1939SAndy Fiddaman end 49*b30d1939SAndy Fiddaman elif "$(P:N=*@(.sh|$(.SUFFIX.c:/ /|/G)|$(.SUFFIX.C:/ /|/G)))" 50*b30d1939SAndy Fiddaman B := $(P:B) 51*b30d1939SAndy Fiddaman if ! ( T = "$(<:V)" ) 52*b30d1939SAndy Fiddaman T := $(B) 53*b30d1939SAndy Fiddaman end 54*b30d1939SAndy Fiddaman :INSTALLDIR: $(B) 55*b30d1939SAndy Fiddaman $(B) :: $(P) $(*:-l*|*$(CC.SUFFIX.ARCHIVE)) 56*b30d1939SAndy Fiddaman if "$(P:N=*.sh)" 57*b30d1939SAndy Fiddaman TESTCC == $(CC) 58*b30d1939SAndy Fiddaman $(B) : (TESTCC) 59*b30d1939SAndy Fiddaman end 60*b30d1939SAndy Fiddaman test : - test.$(T) 61*b30d1939SAndy Fiddaman if "$(@:V)" 62*b30d1939SAndy Fiddaman eval 63*b30d1939SAndy Fiddaman test.$$(T) : $$(B) $(>:V:O>1) 64*b30d1939SAndy Fiddaman set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x 65*b30d1939SAndy Fiddaman $(@:V) 66*b30d1939SAndy Fiddaman end 67*b30d1939SAndy Fiddaman elif "$(>:V:O>1)" 68*b30d1939SAndy Fiddaman local I A V X S R=0 69*b30d1939SAndy Fiddaman for A $(>:V:O>1) 70*b30d1939SAndy Fiddaman if A == "::" 71*b30d1939SAndy Fiddaman let R = !R 72*b30d1939SAndy Fiddaman elif A == ":" 73*b30d1939SAndy Fiddaman let I = I + 1 74*b30d1939SAndy Fiddaman test.$(T).$(I) := $(V:V) 75*b30d1939SAndy Fiddaman V = 76*b30d1939SAndy Fiddaman X := $(X:V)$(S)$$(*) $$(test.$(T).$(I):T=*) 77*b30d1939SAndy Fiddaman S = $("\n") 78*b30d1939SAndy Fiddaman elif A != "-l*|*$(CC.SUFFIX.ARCHIVE)" 79*b30d1939SAndy Fiddaman if R 80*b30d1939SAndy Fiddaman test.$(A) : .VIRTUAL .FORCE 81*b30d1939SAndy Fiddaman test.$(T) : test.$(A) 82*b30d1939SAndy Fiddaman else 83*b30d1939SAndy Fiddaman V += $(A:V) 84*b30d1939SAndy Fiddaman end 85*b30d1939SAndy Fiddaman end 86*b30d1939SAndy Fiddaman end 87*b30d1939SAndy Fiddaman if V 88*b30d1939SAndy Fiddaman let I = I + 1 89*b30d1939SAndy Fiddaman test.$(T).$(I) := $(V:V) 90*b30d1939SAndy Fiddaman X := $(X:V)$(S)$$(*) $$(test.$(T).$(I):T=*) 91*b30d1939SAndy Fiddaman end 92*b30d1939SAndy Fiddaman eval 93*b30d1939SAndy Fiddaman test.$$(T) : $$(B) 94*b30d1939SAndy Fiddaman set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x 95*b30d1939SAndy Fiddaman $(X:V) 96*b30d1939SAndy Fiddaman end 97*b30d1939SAndy Fiddaman else 98*b30d1939SAndy Fiddaman eval 99*b30d1939SAndy Fiddaman test.$$(T) : $$(B) 100*b30d1939SAndy Fiddaman set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x 101*b30d1939SAndy Fiddaman $$(*) 102*b30d1939SAndy Fiddaman end 103*b30d1939SAndy Fiddaman end 104*b30d1939SAndy Fiddaman elif ! "$(<:V)" 105*b30d1939SAndy Fiddaman G = 1 106*b30d1939SAndy Fiddaman for B $(>) 107*b30d1939SAndy Fiddaman if B == "-|--" 108*b30d1939SAndy Fiddaman let G = !G 109*b30d1939SAndy Fiddaman else 110*b30d1939SAndy Fiddaman if ! G 111*b30d1939SAndy Fiddaman T = 112*b30d1939SAndy Fiddaman elif ! ( T = "$(B:A=.COMMAND)" ) && ! "$(B:A=.TARGET)" 113*b30d1939SAndy Fiddaman for S .c .sh 114*b30d1939SAndy Fiddaman if "$(B:B:S=$(S):T=F)" 115*b30d1939SAndy Fiddaman :INSTALLDIR: $(B) 116*b30d1939SAndy Fiddaman $(B) :: $(B:B:S=$(S)) 117*b30d1939SAndy Fiddaman T := $(B) 118*b30d1939SAndy Fiddaman break 119*b30d1939SAndy Fiddaman end 120*b30d1939SAndy Fiddaman end 121*b30d1939SAndy Fiddaman end 122*b30d1939SAndy Fiddaman test : - test.$(B) 123*b30d1939SAndy Fiddaman test.$(B) : $(T) - $(B).tst 124*b30d1939SAndy Fiddaman $(REGRESS) $(REGRESSFLAGS) $(*:N=*.tst) $(*:N!=*.tst) 125*b30d1939SAndy Fiddaman :SAVE: $(B).tst 126*b30d1939SAndy Fiddaman end 127*b30d1939SAndy Fiddaman end 128*b30d1939SAndy Fiddaman else 129*b30d1939SAndy Fiddaman if "$(>:V)" || "$(@:V)" 130*b30d1939SAndy Fiddaman P := $(>) 131*b30d1939SAndy Fiddaman T := $(P:O=1) 132*b30d1939SAndy Fiddaman B := $(T:B) 133*b30d1939SAndy Fiddaman if "$(T)" != "$(B)" && "$(T:G=$(B))" 134*b30d1939SAndy Fiddaman :INSTALLDIR: $(B) 135*b30d1939SAndy Fiddaman $(B) :: $(T) $(P:O>1:N=-*) 136*b30d1939SAndy Fiddaman T := $(B) 137*b30d1939SAndy Fiddaman P := $(B) $(P:O>1:N!=-*) 138*b30d1939SAndy Fiddaman end 139*b30d1939SAndy Fiddaman if "$(<:V)" 140*b30d1939SAndy Fiddaman T := $(<:V) 141*b30d1939SAndy Fiddaman end 142*b30d1939SAndy Fiddaman test : - test.$(T) 143*b30d1939SAndy Fiddaman if "$(@:V)" 144*b30d1939SAndy Fiddaman eval 145*b30d1939SAndy Fiddaman test.$$(T) : $$(P) $(>:V:O>1) 146*b30d1939SAndy Fiddaman set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x 147*b30d1939SAndy Fiddaman $(@:V) 148*b30d1939SAndy Fiddaman end 149*b30d1939SAndy Fiddaman else 150*b30d1939SAndy Fiddaman test.$(T) : $(P) 151*b30d1939SAndy Fiddaman set +x; (ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0; set -x 152*b30d1939SAndy Fiddaman $(*) 153*b30d1939SAndy Fiddaman end 154*b30d1939SAndy Fiddaman else 155*b30d1939SAndy Fiddaman test : - test.$(<) 156*b30d1939SAndy Fiddaman test.$(<) : $(<).tst $(<:A=.COMMAND) 157*b30d1939SAndy Fiddaman $(REGRESS) $(REGRESSFLAGS) $(*) 158*b30d1939SAndy Fiddaman end 159*b30d1939SAndy Fiddaman end 160*b30d1939SAndy Fiddaman 161*b30d1939SAndy Fiddaman.TESTINIT : .MAKE .VIRTUAL .FORCE .REPEAT 162*b30d1939SAndy Fiddaman if VARIANT == "DLL" 163*b30d1939SAndy Fiddaman error 1 :DLL: tests skipped 164*b30d1939SAndy Fiddaman exit 0 165*b30d1939SAndy Fiddaman end 166*b30d1939SAndy Fiddaman set keepgoing 167*b30d1939SAndy Fiddaman REGRESSFLAGS &= $(TESTS:@/ /|/G:/.*/--test=&/:@Q) 168*b30d1939SAndy Fiddaman 169*b30d1939SAndy Fiddaman.SCAN.tst : .SCAN 170*b30d1939SAndy Fiddaman $(@.SCAN.sh) 171*b30d1939SAndy Fiddaman I| INCLUDE@ % | 172*b30d1939SAndy Fiddaman 173*b30d1939SAndy Fiddaman.ATTRIBUTE.%.tst : .SCAN.tst 174*b30d1939SAndy Fiddaman 175*b30d1939SAndy FiddamanMKTEST = mktest 176*b30d1939SAndy FiddamanMKTESTFLAGS = --style=regress 177*b30d1939SAndy Fiddaman 178*b30d1939SAndy Fiddaman/* 179*b30d1939SAndy Fiddaman * test scripts are only regenerated from *.rt when --force 180*b30d1939SAndy Fiddaman * is specified or the .rt file is newer than the script 181*b30d1939SAndy Fiddaman * otherwise the script is accepted if it exists 182*b30d1939SAndy Fiddaman * 183*b30d1939SAndy Fiddaman * this avoids the case where a fresh build with no state 184*b30d1939SAndy Fiddaman * would regenerate the test script and capture current 185*b30d1939SAndy Fiddaman * behavior instead of expected behavior 186*b30d1939SAndy Fiddaman */ 187*b30d1939SAndy Fiddaman 188*b30d1939SAndy Fiddaman%.tst : %.rt 189*b30d1939SAndy Fiddaman if [[ "$(-force)" || "$(>)" -nt "$(^|<)" ]] 190*b30d1939SAndy Fiddaman then $(MKTEST) $(MKTESTFLAGS) $(>) > $(<) 191*b30d1939SAndy Fiddaman fi 192*b30d1939SAndy Fiddaman 193*b30d1939SAndy Fiddamantest%.sh test%.out : %.rt 194*b30d1939SAndy Fiddaman if [[ "$(-force)" || "$(>)" -nt "$(^|<:O=1)" ]] 195*b30d1939SAndy Fiddaman then $(MKTEST) --style=shell $(>) > $(<:N=*.sh) 196*b30d1939SAndy Fiddaman $(SHELL) $(<:N=*.sh) --accept > $(<:N=*.out) 197*b30d1939SAndy Fiddaman fi 198