xref: /illumos-gate/usr/src/contrib/ast/src/cmd/INIT/TEST.mk (revision b30d1939)
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