xref: /freebsd/tools/build/make_check/Makefile (revision fad3f0e44fbfbc7deac55efc530075b59baa8275)
16541d27cSJuli Mallett# $FreeBSD$
26541d27cSJuli Mallett
33c24f8e8SDavid E. O'Brien.MAKE.MODE=	normal
43c24f8e8SDavid E. O'Brien
5*fad3f0e4SIan Lepore# Failure is handled by the invoker, don't kill other legs of a parallel build.
6*fad3f0e4SIan LeporeMAKE_JOB_ERROR_TOKEN=no
7*fad3f0e4SIan Lepore
80aa9e01cSJuli Mallett# Test for broken LHS expansion.
9113cf9e6SRuslan Ermilov# This *must* cause make(1) to detect a recursive variable, and fail as such.
100aa9e01cSJuli Mallett.if make(lhs_expn)
110aa9e01cSJuli MallettFOO=		${BAR}
120aa9e01cSJuli MallettBAR${NIL}=	${FOO}
130aa9e01cSJuli MallettFOO${BAR}=	${FOO}
140aa9e01cSJuli Mallett.endif
150aa9e01cSJuli Mallett
166541d27cSJuli MallettDATA1=	helllo
176541d27cSJuli MallettDATA2:=	${DATA1}
186541d27cSJuli MallettDATA3=	${DATA2:S/ll/rr/g}
196541d27cSJuli MallettDATA4:=	${DATA2:S/ll/rr/g}
206541d27cSJuli MallettDATA2?=	allo
216541d27cSJuli MallettDATA5:= ${DATA2:S/ll/ii/g} ${DATA1:S/ll/rr/g}
226541d27cSJuli MallettDATA2=	yello
236541d27cSJuli MallettDATA1:=	${DATA5:S/l/r/g}
24a9b736adSJuli MallettNIL=
256541d27cSJuli Mallett
26d29cf9e2SRuslan ErmilovSMAKE=	MAKEFLAGS= ${MAKE} -C ${.CURDIR}
279c1f3ca3SHartmut Brandt
286541d27cSJuli Mallettall:
296e501706SDavid E. O'Brien	@echo '1..16'
309b6b6816SDavid E. O'Brien	@${SMAKE} C_check || { ${MAKE} -C ${.CURDIR} failure ; }
319c1f3ca3SHartmut Brandt	@echo "ok 1 - C_check # Test of -C flag existence detected no regression."
326541d27cSJuli Mallett	@echo 1:${DATA1} 2:${DATA2} 3:${DATA3} 4:${DATA4} 5:${DATA5} | \
339c1f3ca3SHartmut Brandt		diff -u ${.CURDIR}/regress.variables.out - || \
349c1f3ca3SHartmut Brandt		${SMAKE} failure
359c1f3ca3SHartmut Brandt	@echo "ok 2 - test_variables # Test variables detected no regression, output matches."
369c1f3ca3SHartmut Brandt	@${SMAKE} double 2>/dev/null || ${SMAKE} failure
379c1f3ca3SHartmut Brandt	@echo "ok 3 - test_targets # Test targets detected no regression."
389c1f3ca3SHartmut Brandt	@${SMAKE} sysvmatch || ${SMAKE} failure
399c1f3ca3SHartmut Brandt	@echo "ok 4 - sysvmatch # Test sysvmatch detected no regression."
409c1f3ca3SHartmut Brandt	@! ${SMAKE} lhs_expn && true || ${SMAKE} failure
419c1f3ca3SHartmut Brandt	@echo "ok 5 lhs_expn # Test lhs_expn detected no regression."
429c1f3ca3SHartmut Brandt	@${SMAKE} notdef || ${SMAKE} failure
439c1f3ca3SHartmut Brandt	@echo "ok 6 - notdef # Test notdef detected no regression."
449c1f3ca3SHartmut Brandt	@${SMAKE} modifiers || ${SMAKE} failure
459c1f3ca3SHartmut Brandt	@echo "ok 7 - modifiers # Test modifiers detected no regression."
469c1f3ca3SHartmut Brandt	@${SMAKE} arith_expr || ${SMAKE} failure
476e501706SDavid E. O'Brien	@echo "ok 8 arith_expr # Test arith_expr detected no regression."
489c1f3ca3SHartmut Brandt	@${SMAKE} PATH_exists || ${SMAKE} failure
496e501706SDavid E. O'Brien	@echo "ok 9 PATH_exists # Test PATH_exists detected no regression."
509c1f3ca3SHartmut Brandt	@${SMAKE} double_quotes || ${SMAKE} failure
516e501706SDavid E. O'Brien	@echo "ok 10 double_quotes # Test double_quotes detected no regression."
529c1f3ca3SHartmut Brandt	@! ${SMAKE} double_quotes2 >/dev/null 2>&1 && true || ${SMAKE} failure
536e501706SDavid E. O'Brien	@echo "ok 11 double_quotes2 # Test double_quotes2 detected no regression."
549c1f3ca3SHartmut Brandt	@${SMAKE} pass_cmd_vars || ${SMAKE} failure
556e501706SDavid E. O'Brien	@echo "ok 12 pass_cmd_vars # Test pass_cmd_vars detected no regression."
569c1f3ca3SHartmut Brandt	@${SMAKE} plus_flag || ${SMAKE} failure
576e501706SDavid E. O'Brien	@echo "ok 13 plus_flag # Test plus_flag detected no regression."
589c1f3ca3SHartmut Brandt	@! ${SMAKE} shell >/dev/null 2>&1 && true || ${SMAKE} failure
596e501706SDavid E. O'Brien	@echo "ok 14 shell # Test shell detected no regression."
609c1f3ca3SHartmut Brandt	@${SMAKE} shell_1 || ${SMAKE} failure
616e501706SDavid E. O'Brien	@echo "ok 15 shell_1 # Test shell_1 detected no regression."
620815243cSMarcel Moolenaar.if !defined(.PARSEDIR)
639c1f3ca3SHartmut Brandt	@${SMAKE} shell_2 || ${SMAKE} failure
646e501706SDavid E. O'Brien	@echo "ok 16 shell_2 # Test shell_2 detected no regression."
650815243cSMarcel Moolenaar.endif
669c1f3ca3SHartmut Brandt
679c1f3ca3SHartmut Brandt.if make(C_check)
689c1f3ca3SHartmut BrandtC_check:
699c1f3ca3SHartmut Brandt.endif
706d3ca9deSJuli Mallett
715661d4a7SJuli Mallett.if make(double)
7289d22e2fSJuli Mallett# Doubly-defined targets.  make(1) will warn, but use the "right" one.  If it
7389d22e2fSJuli Mallett# switches to using the "non-right" one, it breaks things worse than a little
7489d22e2fSJuli Mallett# regression test.
756d3ca9deSJuli Mallettdouble:
766d3ca9deSJuli Mallett	@true
776d3ca9deSJuli Mallett
786d3ca9deSJuli Mallettdouble:
796d3ca9deSJuli Mallett	@false
805661d4a7SJuli Mallett.endif
816541d27cSJuli Mallett
825661d4a7SJuli Mallett.if make(sysvmatch)
83a9b736adSJuli Mallett# Some versions of FreeBSD make(1) do not handle a nil LHS in sysvsubst.
84a9b736adSJuli Mallettsysvmatch:
85a9b736adSJuli Mallett	@echo EMPTY ${NIL:=foo} LHS | \
86a9b736adSJuli Mallett		diff -u ${.CURDIR}/regress.sysvmatch.out - || false
875661d4a7SJuli Mallett.endif
88a9b736adSJuli Mallett
890aa9e01cSJuli Mallett# A bogus target for the lhs_expn test;  If this is reached, then the make(1)
900aa9e01cSJuli Mallett# program has not errored out because of the recursion caused by not expanding
910aa9e01cSJuli Mallett# the left-hand-side's embedded variables above.
920aa9e01cSJuli Mallettlhs_expn:
936d5fda5fSJuli Mallett	@true
940aa9e01cSJuli Mallett
95113cf9e6SRuslan Ermilov.if make(notdef)
96113cf9e6SRuslan Ermilov# make(1) claims to only evaluate a conditional as far as is necessary
97113cf9e6SRuslan Ermilov# to determine its value; that was not always the case.
98113cf9e6SRuslan Ermilov.undef notdef
99113cf9e6SRuslan Ermilovnotdef:
1000815243cSMarcel Moolenaar.if defined(notdef) && ${notdef:M/}
101113cf9e6SRuslan Ermilov.endif
102113cf9e6SRuslan Ermilov.endif
103113cf9e6SRuslan Ermilov
104113cf9e6SRuslan Ermilov.if make(modifiers)
1050815243cSMarcel Moolenaar.if defined(.PARSEDIR)
1060815243cSMarcel Moolenaar# check if bmake can expand plain variables
1070815243cSMarcel Moolenaar.MAKE.EXPAND_VARIABLES= yes
1080815243cSMarcel Moolenaarx!= ${SMAKE} -V .CURDIR:H
109113cf9e6SRuslan Ermilovmodifiers:
1100815243cSMarcel Moolenaar.if ${.CURDIR:H} != "$x"
1110815243cSMarcel Moolenaar	@false
1120815243cSMarcel Moolenaar.endif
1130815243cSMarcel Moolenaar.else
1140815243cSMarcel Moolenaar# See if make(1) supports the C modifier.
1150815243cSMarcel Moolenaarmodifiers: dollarV
1169c1f3ca3SHartmut Brandt	@if ${SMAKE} -V .CURDIR:C/.// 2>&1 >/dev/null | \
117113cf9e6SRuslan Ermilov	    grep -q "Unknown modifier 'C'"; then \
118113cf9e6SRuslan Ermilov		false; \
119113cf9e6SRuslan Ermilov	fi
1200815243cSMarcel Moolenaar
1210815243cSMarcel Moolenaar# check that make -V '${VAR}' works
1220815243cSMarcel MoolenaarV_expn != V_OK=ok ${SMAKE} -r -f /dev/null -V '$${V_OK}'
1230815243cSMarcel MoolenaardollarV:
1240815243cSMarcel Moolenaar.if ${V_expn} == ""
1250815243cSMarcel Moolenaar	@false
1260815243cSMarcel Moolenaar.endif
1270815243cSMarcel Moolenaar.endif
128113cf9e6SRuslan Ermilov.endif
129113cf9e6SRuslan Ermilov
130c94d7043SRuslan Ermilov.if make(arith_expr)
131c94d7043SRuslan Ermilovarith_expr:
132c94d7043SRuslan Ermilov# See if arithmetic expression parsing is broken.
133c94d7043SRuslan Ermilov# The different spacing below is intentional.
134c94d7043SRuslan ErmilovVALUE=	0
135c94d7043SRuslan Ermilov.if (${VALUE} < 0)||(${VALUE}>0)
136c94d7043SRuslan Ermilov.endif
137c94d7043SRuslan Ermilov.endif
138c94d7043SRuslan Ermilov
13921159d16SRuslan Ermilov.if make(PATH_exists)
14021159d16SRuslan ErmilovPATH_exists:
14121159d16SRuslan Ermilov.PATH: ${.CURDIR}
14221159d16SRuslan Ermilov.if !exists(${.CURDIR}/) || !exists(${.CURDIR}/.) || !exists(${.CURDIR}/..)
14321159d16SRuslan Ermilov.error exists() failed
14421159d16SRuslan Ermilov.endif
14521159d16SRuslan Ermilov.endif
14621159d16SRuslan Ermilov
1479608d7e2SRuslan Ermilov.if make(double_quotes)
1489608d7e2SRuslan ErmilovVALUE=	foo ""
1499608d7e2SRuslan Ermilovdouble_quotes:
1509608d7e2SRuslan Ermilov.if ${VALUE:S/$//} != ${VALUE}
1519608d7e2SRuslan Ermilov.error "" reduced to "
1529608d7e2SRuslan Ermilov.endif
1539608d7e2SRuslan Ermilov.endif
1549608d7e2SRuslan Ermilov
15599d3652eSRuslan Ermilov.if make(double_quotes2)
15699d3652eSRuslan Ermilovdouble_quotes2:
15799d3652eSRuslan Ermilov	@cat /dev/null ""
15899d3652eSRuslan Ermilov.endif
15999d3652eSRuslan Ermilov
16048ec21e7SHartmut Brandt#
16148ec21e7SHartmut Brandt# Check passing of variable via MAKEFLAGS
16248ec21e7SHartmut Brandt#
16348ec21e7SHartmut Brandt.if make(pass_cmd_vars)
16448ec21e7SHartmut Brandtpass_cmd_vars:
1659c1f3ca3SHartmut Brandt	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_1
1669c1f3ca3SHartmut Brandt	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_2
1679c1f3ca3SHartmut Brandt	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_3
1689c1f3ca3SHartmut Brandt	@${SMAKE} CMD1=cmd1 CMD2=cmd2 pass_cmd_vars_4
16948ec21e7SHartmut Brandt.endif
17048ec21e7SHartmut Brandt
1713c24f8e8SDavid E. O'Brien#
17248ec21e7SHartmut Brandt# Check that the variable definition arrived from the calling make
1733c24f8e8SDavid E. O'Brien#
1743c24f8e8SDavid E. O'Brien.if make(pass_cmd_vars_1)
1753c24f8e8SDavid E. O'Brien# These values should get overridden by the commandline
1763c24f8e8SDavid E. O'BrienCMD1=oops1
1773c24f8e8SDavid E. O'BrienCMD2=oops2
17848ec21e7SHartmut Brandtpass_cmd_vars_1:
17948ec21e7SHartmut Brandt	@:
18048ec21e7SHartmut Brandt
18148ec21e7SHartmut Brandt.if ${CMD1} != cmd1 || ${CMD2} != cmd2
18282eb7072SHartmut Brandt.error variables not passed through MAKEFLAGS
18348ec21e7SHartmut Brandt.endif
18448ec21e7SHartmut Brandt.endif
18548ec21e7SHartmut Brandt
18648ec21e7SHartmut Brandt.if make(pass_cmd_vars_2)
18748ec21e7SHartmut Brandt# Check that we cannot override the passed variables
18848ec21e7SHartmut BrandtCMD1=foo1
18948ec21e7SHartmut BrandtCMD2=foo2
19048ec21e7SHartmut Brandt
19148ec21e7SHartmut Brandt.if ${CMD1} != cmd1 || ${CMD2} != cmd2
19282eb7072SHartmut Brandt.error MAKEFLAGS-passed variables overridden
19348ec21e7SHartmut Brandt.endif
19448ec21e7SHartmut Brandt
19548ec21e7SHartmut Brandtpass_cmd_vars_2:
19648ec21e7SHartmut Brandt	@:
19748ec21e7SHartmut Brandt.endif
19848ec21e7SHartmut Brandt
19948ec21e7SHartmut Brandt.if make(pass_cmd_vars_3)
20048ec21e7SHartmut Brandt# Check that we can override the passed variables on the next sub-make's
20148ec21e7SHartmut Brandt# command line
20248ec21e7SHartmut Brandt
20348ec21e7SHartmut Brandtpass_cmd_vars_3:
2049c1f3ca3SHartmut Brandt	@${SMAKE} CMD1=foo1 pass_cmd_vars_3_1
20548ec21e7SHartmut Brandt.endif
20648ec21e7SHartmut Brandt
20748ec21e7SHartmut Brandt.if make(pass_cmd_vars_3_1)
20848ec21e7SHartmut Brandt.if ${CMD1} != foo1 || ${CMD2} != cmd2
20982eb7072SHartmut Brandt.error MAKEFLAGS-passed variables not overridden on command line
21048ec21e7SHartmut Brandt.endif
21148ec21e7SHartmut Brandtpass_cmd_vars_3_1:
21248ec21e7SHartmut Brandt	@:
21348ec21e7SHartmut Brandt.endif
21448ec21e7SHartmut Brandt
21548ec21e7SHartmut Brandt.if make(pass_cmd_vars_4)
21648ec21e7SHartmut Brandt# Ensure that a variable assignment passed via MAKEFLAGS may be overwritten
21748ec21e7SHartmut Brandt# by evaluating the .MAKEFLAGS target.
21848ec21e7SHartmut Brandt
21948ec21e7SHartmut Brandt.MAKEFLAGS: CMD1=baz1
22048ec21e7SHartmut Brandt
22148ec21e7SHartmut Brandtpass_cmd_vars_4:
2229c1f3ca3SHartmut Brandt	@${SMAKE} pass_cmd_vars_4_1
22348ec21e7SHartmut Brandt
22448ec21e7SHartmut Brandt.if ${CMD1} != baz1 || ${CMD2} != cmd2
22582eb7072SHartmut Brandt.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target
22648ec21e7SHartmut Brandt.endif
22748ec21e7SHartmut Brandt
22848ec21e7SHartmut Brandt.endif
22948ec21e7SHartmut Brandt.if make(pass_cmd_vars_4_1)
23048ec21e7SHartmut Brandt.if ${CMD1} != baz1 || ${CMD2} != cmd2
23182eb7072SHartmut Brandt.error MAKEFLAGS-passed variables not overridden via .MAKEFLAGS target (2)
23248ec21e7SHartmut Brandt.endif
23348ec21e7SHartmut Brandtpass_cmd_vars_4_1:
23448ec21e7SHartmut Brandt	@:
23548ec21e7SHartmut Brandt.endif
23648ec21e7SHartmut Brandt
237c997f47bSHartmut Brandt#
238c997f47bSHartmut Brandt# Test whether make supports the '+' flag (meaning: execute even with -n)
239c997f47bSHartmut Brandt#
240c997f47bSHartmut Brandt.if make(plus_flag)
2419c1f3ca3SHartmut BrandtOUT != ${SMAKE} -n plus_flag_1
2423c24f8e8SDavid E. O'Brien.if ${OUT:M/tmp} != "/tmp"
24382eb7072SHartmut Brandt.error make doesn't handle + flag
244c997f47bSHartmut Brandt.endif
245c997f47bSHartmut Brandtplus_flag:
246c997f47bSHartmut Brandt	@:
247c997f47bSHartmut Brandt.endif
248c997f47bSHartmut Brandt.if make(plus_flag_1)
249c997f47bSHartmut Brandtplus_flag_1:
250c997f47bSHartmut Brandt	+@cd /tmp; pwd
251c997f47bSHartmut Brandt.endif
252c997f47bSHartmut Brandt
2539a5cf326SRuslan Ermilov.if make(shell)
2549a5cf326SRuslan Ermilov# Test if make fully supports the .SHELL specification.
2559a5cf326SRuslan Ermilov.SHELL: path=/nonexistent
2569a5cf326SRuslan ErmilovA!= echo ok
2579a5cf326SRuslan Ermilovshell:
2589a5cf326SRuslan Ermilov.endif
2599a5cf326SRuslan Ermilov
2607b54cddaSHartmut Brandt.if make(shell_1)
2617b54cddaSHartmut Brandt# Test if setting the shell by name only works. Because we have no ksh
2627b54cddaSHartmut Brandt# in the base system we test that we can set sh and csh. We try only exact
2637b54cddaSHartmut Brandt# matching names and do not exercise the rather strange matching algorithm.
2647b54cddaSHartmut Brandtshell_1:
2659c1f3ca3SHartmut Brandt	@${SMAKE} shell_1_csh
2669c1f3ca3SHartmut Brandt	@${SMAKE} shell_1_sh
2677b54cddaSHartmut Brandt.endif
2687b54cddaSHartmut Brandt.if make(shell_1_csh)
2697b54cddaSHartmut Brandt.SHELL: name="csh"
2707b54cddaSHartmut Brandtshell_1_csh:
2719c1f3ca3SHartmut Brandt	@ps -ax -opid,command | awk '$$1=="'$$$$'" { print $$2 }' | grep -E -q '^(/bin/)?csh$$'
2727b54cddaSHartmut Brandt.endif
2737b54cddaSHartmut Brandt.if make(shell_1_sh)
2747b54cddaSHartmut Brandt.SHELL: name="sh"
2757b54cddaSHartmut Brandtshell_1_sh:
2761b647f44SRuslan Ermilov	@ps -ax -opid,command | awk '$$1=="'$$$$'" { print $$2 }' | grep -E -q '^(/bin/)?sh$$'
2777b54cddaSHartmut Brandt.endif
2787b54cddaSHartmut Brandt
2797b54cddaSHartmut Brandt.if make(shell_2)
2807b54cddaSHartmut Brandt# Test if we can replace the shell specification. We do this by using
2817b54cddaSHartmut Brandt# a shell scripts that prints us its arguments and standard input as the shell
28289f087e8SHartmut Brandtshell_2: shell_test
2839c1f3ca3SHartmut Brandt	@${SMAKE} -B shell_2B | \
2847b54cddaSHartmut Brandt		diff -u ${.CURDIR}/regress.shell_2B.out - || false
2859c1f3ca3SHartmut Brandt	@${SMAKE} -j1 shell_2j | \
2867b54cddaSHartmut Brandt		diff -u ${.CURDIR}/regress.shell_2j.out - || false
2877b54cddaSHartmut Brandt.endif
2887b54cddaSHartmut Brandt
2897b54cddaSHartmut Brandt.if make(shell_2B)
2909c1f3ca3SHartmut Brandt.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"
2917b54cddaSHartmut Brandt
2927b54cddaSHartmut Brandtshell_2B:
2937b54cddaSHartmut Brandt	-@funny $$
2947b54cddaSHartmut Brandt	funnier $$
2957b54cddaSHartmut Brandt.endif
2967b54cddaSHartmut Brandt
2977b54cddaSHartmut Brandt.if make(shell_2j)
2989c1f3ca3SHartmut Brandt.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"
2997b54cddaSHartmut Brandt
3007b54cddaSHartmut Brandtshell_2j:
3017b54cddaSHartmut Brandt	-@funny $$
3027b54cddaSHartmut Brandt	funnier $$
3037b54cddaSHartmut Brandt.endif
3047b54cddaSHartmut Brandt
3056541d27cSJuli Mallettfailure:
30600e13b1dSNik Clayton	@echo "not ok # Test failed: regression detected.  See above."
3076541d27cSJuli Mallett	@false
3089c1f3ca3SHartmut Brandt
30989f087e8SHartmut BrandtCLEANFILES= shell_test
31089f087e8SHartmut Brandt
31189f087e8SHartmut Brandt.include <bsd.obj.mk>
312