Makefile revision 138432
1# $FreeBSD: head/tools/build/make_check/Makefile 138432 2004-12-06 08:51:30Z ru $
2
3# Test for broken LHS expansion.
4# This *must* cause make(1) to detect a recursive variable, and fail as such.
5.if make(lhs_expn)
6FOO=		${BAR}
7BAR${NIL}=	${FOO}
8FOO${BAR}=	${FOO}
9.endif
10
11DATA1=	helllo
12DATA2:=	${DATA1}
13DATA3=	${DATA2:S/ll/rr/g}
14DATA4:=	${DATA2:S/ll/rr/g}
15DATA2?=	allo
16DATA5:= ${DATA2:S/ll/ii/g} ${DATA1:S/ll/rr/g}
17DATA2=	yello
18DATA1:=	${DATA5:S/l/r/g}
19NIL=
20
21SMAKE=	MAKEFLAGS= ${MAKE} -C ${.CURDIR}
22
23all:
24	@if [ ! -x ./shell_test ] ; then \
25		${INSTALL} -m 555 ${.CURDIR}/shell_test.sh shell_test ; \
26	fi
27	@echo '1..17'
28	@${SMAKE} C_check || { cd ${.CURDIR} ; ${MAKE} failure ; }
29	@echo "ok 1 - C_check # Test of -C flag existence detected no regression."
30	@echo 1:${DATA1} 2:${DATA2} 3:${DATA3} 4:${DATA4} 5:${DATA5} | \
31		diff -u ${.CURDIR}/regress.variables.out - || \
32		${SMAKE} failure
33	@echo "ok 2 - test_variables # Test variables detected no regression, output matches."
34	@${SMAKE} double 2>/dev/null || ${SMAKE} failure
35	@echo "ok 3 - test_targets # Test targets detected no regression."
36	@${SMAKE} sysvmatch || ${SMAKE} failure
37	@echo "ok 4 - sysvmatch # Test sysvmatch detected no regression."
38	@! ${SMAKE} lhs_expn && true || ${SMAKE} failure
39	@echo "ok 5 lhs_expn # Test lhs_expn detected no regression."
40	@${SMAKE} notdef || ${SMAKE} failure
41	@echo "ok 6 - notdef # Test notdef detected no regression."
42	@${SMAKE} modifiers || ${SMAKE} failure
43	@echo "ok 7 - modifiers # Test modifiers detected no regression."
44	@${SMAKE} funny_targets || ${SMAKE} failure
45	@echo "ok 8 funny_targets # Test funny_targets detected no regression."
46	@${SMAKE} arith_expr || ${SMAKE} failure
47	@echo "ok 9 arith_expr # Test arith_expr detected no regression."
48	@${SMAKE} PATH_exists || ${SMAKE} failure
49	@echo "ok 10 PATH_exists # Test PATH_exists detected no regression."
50	@${SMAKE} double_quotes || ${SMAKE} failure
51	@echo "ok 11 double_quotes # Test double_quotes detected no regression."
52	@! ${SMAKE} double_quotes2 >/dev/null 2>&1 && true || ${SMAKE} failure
53	@echo "ok 12 double_quotes2 # Test double_quotes2 detected no regression."
54	@${SMAKE} pass_cmd_vars || ${SMAKE} failure
55	@echo "ok 13 pass_cmd_vars # Test pass_cmd_vars detected no regression."
56	@${SMAKE} plus_flag || ${SMAKE} failure
57	@echo "ok 14 plus_flag # Test plus_flag detected no regression."
58	@! ${SMAKE} shell >/dev/null 2>&1 && true || ${SMAKE} failure
59	@echo "ok 15 shell # Test shell detected no regression."
60	@${SMAKE} shell_1 || ${SMAKE} failure
61	@echo "ok 16 shell_1 # Test shell_1 detected no regression."
62	@${SMAKE} shell_2 || ${SMAKE} failure
63	@echo "ok 17 shell_2 # Test shell_2 detected no regression."
64
65.if make(C_check)
66C_check:
67.endif
68
69.if make(double)
70# Doubly-defined targets.  make(1) will warn, but use the "right" one.  If it
71# switches to using the "non-right" one, it breaks things worse than a little
72# regression test.
73double:
74	@true
75
76double:
77	@false
78.endif
79
80.if make(sysvmatch)
81# Some versions of FreeBSD make(1) do not handle a nil LHS in sysvsubst.
82sysvmatch:
83	@echo EMPTY ${NIL:=foo} LHS | \
84		diff -u ${.CURDIR}/regress.sysvmatch.out - || false
85.endif
86
87# A bogus target for the lhs_expn test;  If this is reached, then the make(1)
88# program has not errored out because of the recursion caused by not expanding
89# the left-hand-side's embedded variables above.
90lhs_expn:
91	@true
92
93.if make(notdef)
94# make(1) claims to only evaluate a conditional as far as is necessary
95# to determine its value; that was not always the case.
96.undef notdef
97notdef:
98.if defined(notdef) && ${notdef:U}
99.endif
100.endif
101
102.if make(modifiers)
103# See if make(1) supports the C modifier.
104modifiers:
105	@if ${SMAKE} -V .CURDIR:C/.// 2>&1 >/dev/null | \
106	    grep -q "Unknown modifier 'C'"; then \
107		false; \
108	fi
109.endif
110
111.if make(funny_targets)
112funny_targets: colons::target exclamation!target
113colons::target:
114exclamation!target: 
115.endif
116
117.if make(arith_expr)
118arith_expr:
119# See if arithmetic expression parsing is broken.
120# The different spacing below is intentional.
121VALUE=	0
122.if (${VALUE} < 0)||(${VALUE}>0)
123.endif
124.endif
125
126.if make(PATH_exists)
127PATH_exists:
128.PATH: ${.CURDIR}
129.if !exists(${.CURDIR}/) || !exists(${.CURDIR}/.) || !exists(${.CURDIR}/..)
130.error exists() failed
131.endif
132.endif
133
134.if make(double_quotes)
135VALUE=	foo ""
136double_quotes:
137.if ${VALUE:S/$//} != ${VALUE}
138.error "" reduced to "
139.endif
140.endif
141
142.if make(double_quotes2)
143double_quotes2:
144	@cat /dev/null ""
145.endif
146
147#
148# Check passing of variable via MAKEFLAGS
149#
150.if make(pass_cmd_vars)
151pass_cmd_vars:
152	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_1
153	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_2
154	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_3
155	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_4
156.endif
157
158.if make(pass_cmd_vars_1)
159# Check that the variable definition arrived from the calling make
160pass_cmd_vars_1:
161	@:
162
163.if ${CMD1} != cmd1 || ${CMD2} != cmd2
164.error variables not passed through MAKEFLAGS
165.endif
166
167# Check that the variable definition is in MAKEFLAGS
168.if ${.MAKEFLAGS:MCMD1=*} != "CMD1=cmd1" || ${.MAKEFLAGS:MCMD2=*} != "CMD2=cmd2"
169.error variable assignment not found in $${MAKEFLAGS}
170.endif
171
172# Check that the variable definition is not in MFLAGS
173.if ${MFLAGS:MCMD1=*} != "" || ${MFLAGS:MCMD2=*} != ""
174.error variable assignment found in $${MFLAGS}
175.endif
176.endif
177
178.if make(pass_cmd_vars_2)
179# Check that we cannot override the passed variables
180CMD1=foo1
181CMD2=foo2
182
183.if ${CMD1} != cmd1 || ${CMD2} != cmd2
184.error MAKEFLAGS-passed variables overridden
185.endif
186
187pass_cmd_vars_2:
188	@:
189.endif
190
191.if make(pass_cmd_vars_3)
192# Check that we can override the passed variables on the next sub-make's
193# command line
194
195pass_cmd_vars_3:
196	@${SMAKE} CMD1=foo1 pass_cmd_vars_3_1
197.endif
198
199.if make(pass_cmd_vars_3_1)
200.if ${CMD1} != foo1 || ${CMD2} != cmd2
201.error MAKEFLAGS-passed variables not overridden on command line
202.endif
203pass_cmd_vars_3_1:
204	@:
205.endif
206
207.if make(pass_cmd_vars_4)
208# Ensure that a variable assignment passed via MAKEFLAGS may be overwritten
209# by evaluating the .MAKEFLAGS target.
210
211.MAKEFLAGS: CMD1=baz1
212
213pass_cmd_vars_4:
214	@${SMAKE} pass_cmd_vars_4_1
215
216.if ${CMD1} != baz1 || ${CMD2} != cmd2
217.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target
218.endif
219
220.endif
221.if make(pass_cmd_vars_4_1)
222.if ${CMD1} != baz1 || ${CMD2} != cmd2
223.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target (2)
224.endif
225pass_cmd_vars_4_1:
226	@:
227.endif
228
229#
230# Test whether make supports the '+' flag (meaning: execute even with -n)
231#
232.if make(plus_flag)
233OUT != ${SMAKE} -n plus_flag_1
234.if ${OUT} != "/tmp"
235.error make doesn't handle + flag
236.endif
237plus_flag:
238	@:
239.endif
240.if make(plus_flag_1)
241plus_flag_1:
242	+@cd /tmp; pwd
243.endif
244
245.if make(shell)
246# Test if make fully supports the .SHELL specification.
247.SHELL: path=/nonexistent
248A!= echo ok
249shell:
250.endif
251
252.if make(shell_1)
253# Test if setting the shell by name only works. Because we have no ksh
254# in the base system we test that we can set sh and csh. We try only exact
255# matching names and do not exercise the rather strange matching algorithm.
256shell_1:
257	@${SMAKE} shell_1_csh
258	@${SMAKE} shell_1_sh
259.endif
260.if make(shell_1_csh)
261.SHELL: name="csh"
262shell_1_csh:
263	@ps -ax -opid,command | awk '$$1=="'$$$$'" { print $$2 }' | grep -E -q '^(/bin/)?csh$$'
264.endif
265.if make(shell_1_sh)
266.SHELL: name="sh"
267shell_1_sh:
268	@ps -ax -opid,command | awk '$$1=="'$$$$'" { print $$2 }' | grep -q '^/bin/sh$$'
269.endif
270
271.if make(shell_2)
272# Test if we can replace the shell specification. We do this by using
273# a shell scripts that prints us its arguments and standard input as the shell
274shell_2:
275	@${SMAKE} -B shell_2B | \
276		diff -u ${.CURDIR}/regress.shell_2B.out - || false
277	@${SMAKE} -j1 shell_2j | \
278		diff -u ${.CURDIR}/regress.shell_2j.out - || false
279.endif
280
281.if make(shell_2B)
282.SHELL: name="echo" path="${.OBJDIR}/shell_test" quiet="be quiet" echo="be verbose" filter="be verbose" echoFlag="x" errFlag="y" hasErrCtl=y check="check errors" ignore="ignore errors"
283
284shell_2B:
285	-@funny $$
286	funnier $$
287.endif
288
289.if make(shell_2j)
290.SHELL: name="echo" path="${.OBJDIR}/shell_test" quiet="be quiet" echo="be verbose" filter="be verbose" echoFlag="x" errFlag="y" hasErrCtl=y check="check errors" ignore="ignore errors"
291
292shell_2j:
293	-@funny $$
294	funnier $$
295.endif
296
297failure:
298	@echo "not ok # Test failed: regression detected.  See above."
299	@false
300
301clean:
302	rm -f shell_test
303