Makefile revision 133165
1126596Sbms# $FreeBSD: head/tools/build/make_check/Makefile 133165 2004-08-05 09:11:44Z harti $
2196155Ssam
3126596Sbms# Test for broken LHS expansion.
4126596Sbms# This *must* cause make(1) to detect a recursive variable, and fail as such.
5126596Sbms.if make(lhs_expn)
6126596SbmsFOO=		${BAR}
7126596SbmsBAR${NIL}=	${FOO}
8126596SbmsFOO${BAR}=	${FOO}
9126596Sbms.endif
10126596Sbms
11126596SbmsDATA1=	helllo
12126596SbmsDATA2:=	${DATA1}
13126596SbmsDATA3=	${DATA2:S/ll/rr/g}
14126596SbmsDATA4:=	${DATA2:S/ll/rr/g}
15126596SbmsDATA2?=	allo
16126596SbmsDATA5:= ${DATA2:S/ll/ii/g} ${DATA1:S/ll/rr/g}
17126596SbmsDATA2=	yello
18126596SbmsDATA1:=	${DATA5:S/l/r/g}
19126596SbmsNIL=
20126596Sbms
21126596Sbmsall:
22126596Sbms	@echo "Running test variables"
23126596Sbms	@echo 1:${DATA1} 2:${DATA2} 3:${DATA3} 4:${DATA4} 5:${DATA5} | \
24126596Sbms		diff -u ${.CURDIR}/regress.variables.out - || ${MAKE} failure
25126596Sbms	@echo "PASS: Test variables detected no regression, output matches."
26126596Sbms	@echo "Running test targets"
27126596Sbms	@${MAKE} double 2>/dev/null || ${MAKE} failure
28207325Srpaulo	@echo "PASS: Test targets detected no regression."
29207325Srpaulo	@echo "Running test sysvmatch"
30126596Sbms	@${MAKE} sysvmatch || ${MAKE} failure
31126596Sbms	@echo "PASS: Test sysvmatch detected no regression."
32233648Seadler	@echo "Running test lhs_expn"
33196155Ssam	@! ${MAKE} lhs_expn && true || ${MAKE} failure
34126596Sbms	@echo "PASS: Test lhs_expn detected no regression."
35126596Sbms	@echo "Running test notdef"
36126596Sbms	@${MAKE} notdef || ${MAKE} failure
37196155Ssam	@echo "PASS: Test notdef detected no regression."
38126596Sbms	@echo "Running test modifiers"
39196155Ssam	@${MAKE} modifiers || ${MAKE} failure
40126596Sbms	@echo "PASS: Test modifiers detected no regression."
41196155Ssam	@echo "Running test funny_targets"
42196155Ssam	@${MAKE} funny_targets || ${MAKE} failure
43196155Ssam	@echo "PASS: Test funny_targets detected no regression."
44196155Ssam	@echo "Running test arith_expr"
45196155Ssam	@${MAKE} arith_expr || ${MAKE} failure
46196155Ssam	@echo "PASS: Test arith_expr detected no regression."
47196155Ssam	@echo "Running test PATH_exists"
48196155Ssam	@${MAKE} PATH_exists || ${MAKE} failure
49196155Ssam	@echo "PASS: Test PATH_exists detected no regression."
50196155Ssam	@echo "Running test double_quotes"
51196155Ssam	@${MAKE} double_quotes || ${MAKE} failure
52196155Ssam	@echo "PASS: Test double_quotes detected no regression."
53196155Ssam	@echo "Running test double_quotes2"
54196155Ssam	@! ${MAKE} double_quotes2 >/dev/null 2>&1 && true || ${MAKE} failure
55196155Ssam	@echo "PASS: Test double_quotes2 detected no regression."
56196155Ssam	@echo "Running test pass_cmd_vars"
57196155Ssam	@${MAKE} pass_cmd_vars || ${MAKE} failure
58196155Ssam	@echo "PASS: Test pass_cmd_vars detected no regression."
59196155Ssam	@echo "Running test plus_flag"
60196155Ssam	@${MAKE} plus_flag || ${MAKE} failure
61196155Ssam	@echo "PASS: Test plus_flag detected no regression."
62196155Ssam
63196155Ssam.if make(double)
64196155Ssam# Doubly-defined targets.  make(1) will warn, but use the "right" one.  If it
65196155Ssam# switches to using the "non-right" one, it breaks things worse than a little
66196155Ssam# regression test.
67196155Ssamdouble:
68196155Ssam	@true
69126596Sbms
70196155Ssamdouble:
71196155Ssam	@false
72196155Ssam.endif
73196155Ssam
74196155Ssam.if make(sysvmatch)
75196155Ssam# Some versions of FreeBSD make(1) do not handle a nil LHS in sysvsubst.
76196155Ssamsysvmatch:
77196155Ssam	@echo EMPTY ${NIL:=foo} LHS | \
78196155Ssam		diff -u ${.CURDIR}/regress.sysvmatch.out - || false
79196155Ssam.endif
80196155Ssam
81196155Ssam# A bogus target for the lhs_expn test;  If this is reached, then the make(1)
82196155Ssam# program has not errored out because of the recursion caused by not expanding
83196155Ssam# the left-hand-side's embedded variables above.
84196155Ssamlhs_expn:
85196155Ssam	@true
86126596Sbms
87196155Ssam.if make(notdef)
88196155Ssam# make(1) claims to only evaluate a conditional as far as is necessary
89196155Ssam# to determine its value; that was not always the case.
90196155Ssam.undef notdef
91196155Ssamnotdef:
92196155Ssam.if defined(notdef) && ${notdef:U}
93196155Ssam.endif
94196155Ssam.endif
95196155Ssam
96196155Ssam.if make(modifiers)
97196155Ssam# See if make(1) supports the C modifier.
98196155Ssammodifiers:
99196155Ssam	@if ${MAKE} -V .CURDIR:C/.// 2>&1 >/dev/null | \
100196155Ssam	    grep -q "Unknown modifier 'C'"; then \
101126596Sbms		false; \
102196155Ssam	fi
103196155Ssam.endif
104196155Ssam
105196155Ssam.if make(funny_targets)
106196155Ssamfunny_targets: colons::target exclamation!target
107196155Ssamcolons::target:
108196155Ssamexclamation!target: 
109196155Ssam.endif
110126596Sbms
111196155Ssam.if make(arith_expr)
112196155Ssamarith_expr:
113196155Ssam# See if arithmetic expression parsing is broken.
114196155Ssam# The different spacing below is intentional.
115196155SsamVALUE=	0
116196155Ssam.if (${VALUE} < 0)||(${VALUE}>0)
117196155Ssam.endif
118196155Ssam.endif
119196155Ssam
120196155Ssam.if make(PATH_exists)
121196155SsamPATH_exists:
122196155Ssam.PATH: ${.CURDIR}
123126596Sbms.if !exists(${.CURDIR}/) || !exists(${.CURDIR}/.) || !exists(${.CURDIR}/..)
124196155Ssam.error exists() failed
125196155Ssam.endif
126196155Ssam.endif
127196155Ssam
128196155Ssam.if make(double_quotes)
129196155SsamVALUE=	foo ""
130196155Ssamdouble_quotes:
131196155Ssam.if ${VALUE:S/$//} != ${VALUE}
132196155Ssam.error "" reduced to "
133196155Ssam.endif
134126596Sbms.endif
135126596Sbms
136196155Ssam.if make(double_quotes2)
137196155Ssamdouble_quotes2:
138196155Ssam	@cat /dev/null ""
139196155Ssam.endif
140196155Ssam
141196155Ssam#
142196155Ssam# Check passing of variable via MAKEFLAGS
143196155Ssam#
144196155Ssam.if make(pass_cmd_vars)
145196155Ssampass_cmd_vars:
146196155Ssam	@${MAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_1
147196155Ssam	@${MAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_2
148196155Ssam	@${MAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_3
149196155Ssam	@${MAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_4
150196155Ssam.endif
151196155Ssam
152126596Sbms.if make(pass_cmd_vars_1)
153196155Ssam# Check that the variable definition arrived from the calling make
154196155Ssampass_cmd_vars_1:
155196155Ssam	@:
156196155Ssam
157196155Ssam.if ${CMD1} != cmd1 || ${CMD2} != cmd2
158196155Ssam.error variables not passed through MAKEFLAGS
159196155Ssam.endif
160196155Ssam
161196155Ssam# Check that the variable definition is in MAKEFLAGS
162196155Ssam.if ${.MAKEFLAGS:MCMD1=*} != "CMD1=cmd1" || ${.MAKEFLAGS:MCMD2=*} != "CMD2=cmd2"
163196155Ssam.error variable assignment not found in $${MAKEFLAGS}
164196155Ssam.endif
165196155Ssam
166196155Ssam# Check that the variable definition is not in MFLAGS
167233648Seadler.if ${MFLAGS:MCMD1=*} != "" || ${MFLAGS:MCMD2=*} != ""
168196155Ssam.error variable assignment found in $${MFLAGS}
169196155Ssam.endif
170126596Sbms.endif
171196155Ssam
172196155Ssam.if make(pass_cmd_vars_2)
173196155Ssam# Check that we cannot override the passed variables
174196155SsamCMD1=foo1
175196155SsamCMD2=foo2
176196155Ssam
177196155Ssam.if ${CMD1} != cmd1 || ${CMD2} != cmd2
178196155Ssam.error MAKEFLAGS-passed variables overridden
179196155Ssam.endif
180196155Ssam
181196155Ssampass_cmd_vars_2:
182196155Ssam	@:
183196155Ssam.endif
184196155Ssam
185196155Ssam.if make(pass_cmd_vars_3)
186196155Ssam# Check that we can override the passed variables on the next sub-make's
187196155Ssam# command line
188196155Ssam
189196155Ssampass_cmd_vars_3:
190196155Ssam	@${MAKE} CMD1=foo1 pass_cmd_vars_3_1
191196155Ssam.endif
192196155Ssam
193196155Ssam.if make(pass_cmd_vars_3_1)
194196155Ssam.if ${CMD1} != foo1 || ${CMD2} != cmd2
195196155Ssam.error MAKEFLAGS-passed variables not overridden on command line
196196155Ssam.endif
197196155Ssampass_cmd_vars_3_1:
198196155Ssam	@:
199196155Ssam.endif
200196155Ssam
201196155Ssam.if make(pass_cmd_vars_4)
202196155Ssam# Ensure that a variable assignment passed via MAKEFLAGS may be overwritten
203196155Ssam# by evaluating the .MAKEFLAGS target.
204196155Ssam
205196155Ssam.MAKEFLAGS: CMD1=baz1
206196155Ssam
207196155Ssampass_cmd_vars_4:
208211397Sjoel	@:
209196155Ssam# The following does not work yet (see standards/57295)
210196155Ssam#	@${MAKE} pass_cmd_vars_4_1
211196155Ssam
212211397Sjoel.if ${CMD1} != baz1 || ${CMD2} != cmd2
213196155Ssam.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target
214196155Ssam.endif
215196155Ssam
216196155Ssam.endif
217196155Ssam.if make(pass_cmd_vars_4_1)
218196155Ssam.if ${CMD1} != baz1 || ${CMD2} != cmd2
219196155Ssam.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target (2)
220196155Ssam.endif
221196155Ssampass_cmd_vars_4_1:
222196155Ssam	@:
223196155Ssam.endif
224233648Seadler
225196155Ssam#
226196155Ssam# Test whether make supports the '+' flag (meaning: execute even with -n)
227196155Ssam#
228197300Sbrueffer.if make(plus_flag)
229196155SsamOUT != ${MAKE} -n plus_flag_1
230196155Ssam.if ${OUT} != "/tmp"
231196155Ssam.error make doesn't handle + flag
232196155Ssam.endif
233196155Ssamplus_flag:
234196155Ssam	@:
235233648Seadler.endif
236196155Ssam.if make(plus_flag_1)
237196155Ssamplus_flag_1:
238196155Ssam	+@cd /tmp; pwd
239196155Ssam.endif
240196155Ssam
241196155Ssamfailure:
242196155Ssam	@echo "FAIL: Test failed: regression detected.  See above."
243196155Ssam	@false
244196155Ssam