summaryrefslogtreecommitdiff
path: root/tests/usr.bin/make
diff options
context:
space:
mode:
authorjruoho <jruoho@NetBSD.org>2012-03-17 16:33:10 +0000
committerjruoho <jruoho@NetBSD.org>2012-03-17 16:33:10 +0000
commite592667b95b63d6acc5c8661e5741dad44e1f333 (patch)
treeb17b53e64e2bed71c98e8495c1d4ad0f870392ee /tests/usr.bin/make
parentdcf6e45829bffcfb905230583c4ce43ee46677aa (diff)
Deprecate tests/util.
Diffstat (limited to 'tests/usr.bin/make')
-rw-r--r--tests/usr.bin/make/Makefile45
-rw-r--r--tests/usr.bin/make/d_comment.mk31
-rw-r--r--tests/usr.bin/make/d_comment.out4
-rw-r--r--tests/usr.bin/make/d_cond1.mk102
-rw-r--r--tests/usr.bin/make/d_cond1.out18
-rw-r--r--tests/usr.bin/make/d_dotwait.mk61
-rw-r--r--tests/usr.bin/make/d_dotwait.out29
-rw-r--r--tests/usr.bin/make/d_export.mk22
-rw-r--r--tests/usr.bin/make/d_export.out5
-rw-r--r--tests/usr.bin/make/d_export_all.mk11
-rw-r--r--tests/usr.bin/make/d_export_all.out9
-rw-r--r--tests/usr.bin/make/d_moderrs.mk31
-rw-r--r--tests/usr.bin/make/d_moderrs.out15
-rw-r--r--tests/usr.bin/make/d_modmatch.mk18
-rw-r--r--tests/usr.bin/make/d_modmatch.out15
-rw-r--r--tests/usr.bin/make/d_modmisc.mk33
-rw-r--r--tests/usr.bin/make/d_modmisc.out8
-rw-r--r--tests/usr.bin/make/d_modorder.mk22
-rw-r--r--tests/usr.bin/make/d_modorder.out10
-rw-r--r--tests/usr.bin/make/d_modts.mk32
-rw-r--r--tests/usr.bin/make/d_modts.out32
-rw-r--r--tests/usr.bin/make/d_modword.mk151
-rw-r--r--tests/usr.bin/make/d_modword.out121
-rw-r--r--tests/usr.bin/make/d_posix.mk24
-rw-r--r--tests/usr.bin/make/d_posix.out22
-rw-r--r--tests/usr.bin/make/d_qequals.mk8
-rw-r--r--tests/usr.bin/make/d_qequals.out1
-rw-r--r--tests/usr.bin/make/d_ternary.mk8
-rw-r--r--tests/usr.bin/make/d_ternary.out9
-rw-r--r--tests/usr.bin/make/d_unmatchedvarparen.mk3
-rw-r--r--tests/usr.bin/make/d_unmatchedvarparen.out1
-rw-r--r--tests/usr.bin/make/d_varcmd.mk49
-rw-r--r--tests/usr.bin/make/d_varcmd.out8
-rw-r--r--tests/usr.bin/make/t_make.sh89
34 files changed, 1047 insertions, 0 deletions
diff --git a/tests/usr.bin/make/Makefile b/tests/usr.bin/make/Makefile
new file mode 100644
index 00000000000..72d7d8b73c9
--- /dev/null
+++ b/tests/usr.bin/make/Makefile
@@ -0,0 +1,45 @@
+# $NetBSD: Makefile,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+NOMAN= # defined
+
+.include <bsd.own.mk>
+
+TESTSDIR= ${TESTSBASE}/usr.bin/make
+
+TESTS_SH= t_make
+
+FILESDIR= ${TESTSDIR}
+FILES= d_comment.mk
+FILES+= d_comment.out
+FILES+= d_cond1.mk
+FILES+= d_cond1.out
+FILES+= d_dotwait.mk
+FILES+= d_dotwait.out
+FILES+= d_export.mk
+FILES+= d_export.out
+FILES+= d_export_all.mk
+FILES+= d_export_all.out
+FILES+= d_moderrs.mk
+FILES+= d_moderrs.out
+FILES+= d_modmatch.mk
+FILES+= d_modmatch.out
+FILES+= d_modmisc.mk
+FILES+= d_modmisc.out
+FILES+= d_modorder.mk
+FILES+= d_modorder.out
+FILES+= d_modts.mk
+FILES+= d_modts.out
+FILES+= d_modword.mk
+FILES+= d_modword.out
+FILES+= d_posix.mk
+FILES+= d_posix.out
+FILES+= d_qequals.mk
+FILES+= d_qequals.out
+FILES+= d_ternary.mk
+FILES+= d_ternary.out
+FILES+= d_unmatchedvarparen.mk
+FILES+= d_unmatchedvarparen.out
+FILES+= d_varcmd.mk
+FILES+= d_varcmd.out
+
+.include <bsd.test.mk>
diff --git a/tests/usr.bin/make/d_comment.mk b/tests/usr.bin/make/d_comment.mk
new file mode 100644
index 00000000000..7dd7dbbe28b
--- /dev/null
+++ b/tests/usr.bin/make/d_comment.mk
@@ -0,0 +1,31 @@
+# This is a comment
+.if ${MACHINE_ARCH} == something
+FOO=bar
+.endif
+
+#\
+ Multiline comment
+
+BAR=# defined
+FOOBAR= # defined
+
+# This is an escaped comment \
+that keeps going until the end of this line
+
+# Another escaped comment \
+that \
+goes \
+on
+
+# This is NOT an escaped comment due to the double backslashes \\
+all: hi foo bar
+ @echo comment testing done
+
+hi:
+ @echo comment testing start
+
+foo:
+ @echo this is $@
+
+bar:
+ @echo This is how a comment looks: '# comment'
diff --git a/tests/usr.bin/make/d_comment.out b/tests/usr.bin/make/d_comment.out
new file mode 100644
index 00000000000..68ae8c05519
--- /dev/null
+++ b/tests/usr.bin/make/d_comment.out
@@ -0,0 +1,4 @@
+comment testing start
+this is foo
+This is how a comment looks: # comment
+comment testing done
diff --git a/tests/usr.bin/make/d_cond1.mk b/tests/usr.bin/make/d_cond1.mk
new file mode 100644
index 00000000000..a058ac6840d
--- /dev/null
+++ b/tests/usr.bin/make/d_cond1.mk
@@ -0,0 +1,102 @@
+# $NetBSD: d_cond1.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+# hard code these!
+TEST_UNAME_S= NetBSD
+TEST_UNAME_M= sparc
+TEST_MACHINE= i386
+
+.if ${TEST_UNAME_S}
+Ok=var,
+.endif
+.if ("${TEST_UNAME_S}")
+Ok+=(\"var\"),
+.endif
+.if (${TEST_UNAME_M} != ${TEST_MACHINE})
+Ok+=(var != var),
+.endif
+.if ${TEST_UNAME_M} != ${TEST_MACHINE}
+Ok+= var != var,
+.endif
+.if !((${TEST_UNAME_M} != ${TEST_MACHINE}) && defined(X))
+Ok+= !((var != var) && defined(name)),
+.endif
+# from bsd.obj.mk
+MKOBJ?=no
+.if ${MKOBJ} == "no"
+o= no
+Ok+= var == "quoted",
+.else
+.if defined(notMAKEOBJDIRPREFIX) || defined(norMAKEOBJDIR)
+.if defined(notMAKEOBJDIRPREFIX)
+o=${MAKEOBJDIRPREFIX}${__curdir}
+.else
+o= ${MAKEOBJDIR}
+.endif
+.endif
+o= o
+.endif
+
+# repeat the above to check we get the same result
+.if ${MKOBJ} == "no"
+o2= no
+.else
+.if defined(notMAKEOBJDIRPREFIX) || defined(norMAKEOBJDIR)
+.if defined(notMAKEOBJDIRPREFIX)
+o2=${MAKEOBJDIRPREFIX}${__curdir}
+.else
+o2= ${MAKEOBJDIR}
+.endif
+.endif
+o2= o
+.endif
+
+PRIMES=2 3 5 7 11
+NUMBERS=1 2 3 4 5
+
+n=2
+.if ${PRIMES:M$n} == ""
+X=not
+.else
+X=
+.endif
+
+.if ${MACHINE_ARCH} == no-such
+A=one
+.else
+.if ${MACHINE_ARCH} == not-this
+.if ${MACHINE_ARCH} == something-else
+A=unlikely
+.else
+A=no
+.endif
+.endif
+A=other
+# We expect an extra else warning - we're not skipping here
+.else
+A=this should be an error
+.endif
+
+.if $X != ""
+.if $X == not
+B=one
+.else
+B=other
+# We expect an extra else warning - we are skipping here
+.else
+B=this should be an error
+.endif
+.else
+B=unknown
+.endif
+
+.if "quoted" == quoted
+C=clever
+.else
+C=dim
+.endif
+
+all:
+ @echo "$n is $X prime"
+ @echo "A='$A' B='$B' C='$C' o='$o,${o2}'"
+ @echo "Passed:${.newline} ${Ok:S/,/${.newline}/}"
+ @echo "${NUMBERS:@n@$n is ${("${PRIMES:M$n}" == ""):?not:} prime${.newline}@}"
diff --git a/tests/usr.bin/make/d_cond1.out b/tests/usr.bin/make/d_cond1.out
new file mode 100644
index 00000000000..e51fb2ee977
--- /dev/null
+++ b/tests/usr.bin/make/d_cond1.out
@@ -0,0 +1,18 @@
+make: "cond1.mk" line 75: warning: extra else
+make: "cond1.mk" line 85: warning: extra else
+2 is prime
+A='other' B='unknown' C='clever' o='no,no'
+Passed:
+ var
+ ("var")
+ (var != var)
+ var != var
+ !((var != var) && defined(name))
+ var == quoted
+
+1 is not prime
+2 is prime
+3 is prime
+4 is not prime
+5 is prime
+
diff --git a/tests/usr.bin/make/d_dotwait.mk b/tests/usr.bin/make/d_dotwait.mk
new file mode 100644
index 00000000000..a4dc27257e7
--- /dev/null
+++ b/tests/usr.bin/make/d_dotwait.mk
@@ -0,0 +1,61 @@
+# $NetBSD: d_dotwait.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+THISMAKEFILE:= ${.PARSEDIR}/${.PARSEFILE}
+
+TESTS= simple recursive shared cycle
+PAUSE= sleep 1
+
+# Use a .for loop rather than dependencies here, to ensure
+# that the tests are run one by one, with parallelism
+# only within tests.
+# Ignore "--- target ---" lines printed by parallel make.
+all:
+.for t in ${TESTS}
+ @${.MAKE} -f ${THISMAKEFILE} -j4 $t | grep -v "^--- "
+.endfor
+
+#
+# Within each test, the names of the sub-targets follow these
+# conventions:
+# * If it's expected that two or more targets may be made in parallel,
+# then the target names will differ only in an alphabetic component
+# such as ".a" or ".b".
+# * If it's expected that two or more targets should be made in sequence
+# then the target names will differ in numeric components, such that
+# lexical ordering of the target names matches the expected order
+# in which the targets should be made.
+#
+# Targets may echo ${PARALLEL_TARG} to print a modified version
+# of their own name, in which alphabetic components like ".a" or ".b"
+# are converted to ".*". Two targets that are expected to
+# be made in parallel will thus print the same strings, so that the
+# output is independent of the order in which these targets are made.
+#
+PARALLEL_TARG= ${.TARGET:C/\.[a-z]/.*/g:Q}
+.DEFAULT:
+ @echo ${PARALLEL_TARG}; ${PAUSE}; echo ${PARALLEL_TARG}
+_ECHOUSE: .USE
+ @echo ${PARALLEL_TARG}; ${PAUSE}; echo ${PARALLEL_TARG}
+
+# simple: no recursion, no cycles
+simple: simple.1 .WAIT simple.2
+
+# recursive: all children of the left hand side of the .WAIT
+# must be made before any child of the right hand side.
+recursive: recursive.1.99 .WAIT recursive.2.99
+recursive.1.99: recursive.1.1.a recursive.1.1.b _ECHOUSE
+recursive.2.99: recursive.2.1.a recursive.2.1.b _ECHOUSE
+
+# shared: both shared.1.99 and shared.2.99 depend on shared.0.
+# shared.0 must be made first, even though it is a child of
+# the right hand side of the .WAIT.
+shared: shared.1.99 .WAIT shared.2.99
+shared.1.99: shared.0 _ECHOUSE
+shared.2.99: shared.2.1 shared.0 _ECHOUSE
+
+# cycle: the cyclic dependency must not cause infinite recursion
+# leading to stack overflow and a crash.
+cycle: cycle.1.99 .WAIT cycle.2.99
+cycle.2.99: cycle.2.98 _ECHOUSE
+cycle.2.98: cycle.2.97 _ECHOUSE
+cycle.2.97: cycle.2.99 _ECHOUSE
diff --git a/tests/usr.bin/make/d_dotwait.out b/tests/usr.bin/make/d_dotwait.out
new file mode 100644
index 00000000000..d72ae6757f7
--- /dev/null
+++ b/tests/usr.bin/make/d_dotwait.out
@@ -0,0 +1,29 @@
+simple.1
+simple.1
+simple.2
+simple.2
+recursive.1.1.*
+recursive.1.1.*
+recursive.1.1.*
+recursive.1.1.*
+recursive.1.99
+recursive.1.99
+recursive.2.1.*
+recursive.2.1.*
+recursive.2.1.*
+recursive.2.1.*
+recursive.2.99
+recursive.2.99
+shared.0
+shared.0
+shared.1.99
+shared.1.99
+shared.2.1
+shared.2.1
+shared.2.99
+shared.2.99
+make: Graph cycles through `cycle.2.99'
+make: Graph cycles through `cycle.2.98'
+make: Graph cycles through `cycle.2.97'
+cycle.1.99
+cycle.1.99
diff --git a/tests/usr.bin/make/d_export.mk b/tests/usr.bin/make/d_export.mk
new file mode 100644
index 00000000000..9c305f85410
--- /dev/null
+++ b/tests/usr.bin/make/d_export.mk
@@ -0,0 +1,22 @@
+# $NetBSD: d_export.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+UT_TEST=export
+UT_FOO=foo${BAR}
+UT_FU=fubar
+UT_ZOO=hoopie
+UT_NO=all
+# belive it or not, we expect this one to come out with $UT_FU unexpanded.
+UT_DOLLAR= This is $$UT_FU
+
+.export UT_FU UT_FOO
+.export UT_DOLLAR
+# this one will be ignored
+.export .MAKE.PID
+
+BAR=bar is ${UT_FU}
+
+.MAKE.EXPORTED+= UT_ZOO UT_TEST
+
+all:
+ @env | grep '^UT_' | sort
+
diff --git a/tests/usr.bin/make/d_export.out b/tests/usr.bin/make/d_export.out
new file mode 100644
index 00000000000..c765d339a4c
--- /dev/null
+++ b/tests/usr.bin/make/d_export.out
@@ -0,0 +1,5 @@
+UT_DOLLAR=This is $UT_FU
+UT_FOO=foobar is fubar
+UT_FU=fubar
+UT_TEST=export
+UT_ZOO=hoopie
diff --git a/tests/usr.bin/make/d_export_all.mk b/tests/usr.bin/make/d_export_all.mk
new file mode 100644
index 00000000000..8d2471f7b71
--- /dev/null
+++ b/tests/usr.bin/make/d_export_all.mk
@@ -0,0 +1,11 @@
+# $NetBSD: d_export_all.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+UT_OK=good
+UT_F=fine
+
+.export
+
+.include "d_export.mk"
+
+UT_TEST=export-all
+UT_ALL=even this gets exported
diff --git a/tests/usr.bin/make/d_export_all.out b/tests/usr.bin/make/d_export_all.out
new file mode 100644
index 00000000000..23052cfd0d3
--- /dev/null
+++ b/tests/usr.bin/make/d_export_all.out
@@ -0,0 +1,9 @@
+UT_ALL=even this gets exported
+UT_DOLLAR=This is $UT_FU
+UT_F=fine
+UT_FOO=foobar is fubar
+UT_FU=fubar
+UT_NO=all
+UT_OK=good
+UT_TEST=export-all
+UT_ZOO=hoopie
diff --git a/tests/usr.bin/make/d_moderrs.mk b/tests/usr.bin/make/d_moderrs.mk
new file mode 100644
index 00000000000..b4469846b2e
--- /dev/null
+++ b/tests/usr.bin/make/d_moderrs.mk
@@ -0,0 +1,31 @@
+# $NetBSD: d_moderrs.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+#
+# various modifier error tests
+
+VAR=TheVariable
+# incase we have to change it ;-)
+MOD_UNKN=Z
+MOD_TERM=S,V,v
+MOD_S:= ${MOD_TERM},
+
+all: modunkn modunknV varterm vartermV modtermV
+
+modunkn:
+ @echo "Expect: Unknown modifier 'Z'"
+ @echo "VAR:Z=${VAR:Z}"
+
+modunknV:
+ @echo "Expect: Unknown modifier 'Z'"
+ @echo "VAR:${MOD_UNKN}=${VAR:${MOD_UNKN}}"
+
+varterm:
+ @echo "Expect: Unclosed variable specification for VAR"
+ @echo VAR:S,V,v,=${VAR:S,V,v,
+
+vartermV:
+ @echo "Expect: Unclosed variable specification for VAR"
+ @echo VAR:${MOD_TERM},=${VAR:${MOD_S}
+
+modtermV:
+ @echo "Expect: Unclosed substitution for VAR (, missing)"
+ -@echo "VAR:${MOD_TERM}=${VAR:${MOD_TERM}}"
diff --git a/tests/usr.bin/make/d_moderrs.out b/tests/usr.bin/make/d_moderrs.out
new file mode 100644
index 00000000000..c37bde65f1c
--- /dev/null
+++ b/tests/usr.bin/make/d_moderrs.out
@@ -0,0 +1,15 @@
+Expect: Unknown modifier 'Z'
+make: Unknown modifier 'Z'
+VAR:Z=
+Expect: Unknown modifier 'Z'
+make: Unknown modifier 'Z'
+VAR:Z=
+Expect: Unclosed variable specification for VAR
+make: Unclosed variable specification (expecting '}') for "VAR" (value "Thevariable") modifier S
+VAR:S,V,v,=Thevariable
+Expect: Unclosed variable specification for VAR
+make: Unclosed variable specification after complex modifier (expecting '}') for VAR
+VAR:S,V,v,=Thevariable
+Expect: Unclosed substitution for VAR (, missing)
+make: Unclosed substitution for VAR (, missing)
+VAR:S,V,v=
diff --git a/tests/usr.bin/make/d_modmatch.mk b/tests/usr.bin/make/d_modmatch.mk
new file mode 100644
index 00000000000..4ada35e35fd
--- /dev/null
+++ b/tests/usr.bin/make/d_modmatch.mk
@@ -0,0 +1,18 @@
+
+X=a b c d e
+
+.for x in $X
+LIB${x:tu}=/tmp/lib$x.a
+.endfor
+
+X_LIBS= ${LIBA} ${LIBD} ${LIBE}
+
+LIB?=a
+
+all:
+ @for x in $X; do ${.MAKE} -f ${MAKEFILE} show LIB=$$x; done
+
+show:
+ @echo 'LIB=${LIB} X_LIBS:M$${LIB$${LIB:tu}} is "${X_LIBS:M${LIB${LIB:tu}}}"'
+ @echo 'LIB=${LIB} X_LIBS:M*/lib$${LIB}.a is "${X_LIBS:M*/lib${LIB}.a}"'
+ @echo 'LIB=${LIB} X_LIBS:M*/lib$${LIB}.a:tu is "${X_LIBS:M*/lib${LIB}.a:tu}"'
diff --git a/tests/usr.bin/make/d_modmatch.out b/tests/usr.bin/make/d_modmatch.out
new file mode 100644
index 00000000000..26245bdfd98
--- /dev/null
+++ b/tests/usr.bin/make/d_modmatch.out
@@ -0,0 +1,15 @@
+LIB=a X_LIBS:M${LIB${LIB:tu}} is "/tmp/liba.a"
+LIB=a X_LIBS:M*/lib${LIB}.a is "/tmp/liba.a"
+LIB=a X_LIBS:M*/lib${LIB}.a:tu is "/TMP/LIBA.A"
+LIB=b X_LIBS:M${LIB${LIB:tu}} is ""
+LIB=b X_LIBS:M*/lib${LIB}.a is ""
+LIB=b X_LIBS:M*/lib${LIB}.a:tu is ""
+LIB=c X_LIBS:M${LIB${LIB:tu}} is ""
+LIB=c X_LIBS:M*/lib${LIB}.a is ""
+LIB=c X_LIBS:M*/lib${LIB}.a:tu is ""
+LIB=d X_LIBS:M${LIB${LIB:tu}} is "/tmp/libd.a"
+LIB=d X_LIBS:M*/lib${LIB}.a is "/tmp/libd.a"
+LIB=d X_LIBS:M*/lib${LIB}.a:tu is "/TMP/LIBD.A"
+LIB=e X_LIBS:M${LIB${LIB:tu}} is "/tmp/libe.a"
+LIB=e X_LIBS:M*/lib${LIB}.a is "/tmp/libe.a"
+LIB=e X_LIBS:M*/lib${LIB}.a:tu is "/TMP/LIBE.A"
diff --git a/tests/usr.bin/make/d_modmisc.mk b/tests/usr.bin/make/d_modmisc.mk
new file mode 100644
index 00000000000..ff56d5de613
--- /dev/null
+++ b/tests/usr.bin/make/d_modmisc.mk
@@ -0,0 +1,33 @@
+# $NetBSD: d_modmisc.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+#
+# miscellaneous modifier tests
+
+path=:/bin:/usr/bin::/sbin:/usr/sbin:.:/home/user/bin:.
+# strip cwd from path.
+MOD_NODOT=S/:/ /g:N.:ts:
+# and decorate, note that $'s need to be doubled. Also note that
+# the modifier_variable can be used with other modifiers.
+MOD_NODOTX=S/:/ /g:N.:@d@'$$d'@
+# another mod - pretend it is more interesting
+MOD_HOMES=S,/home/,/homes/,
+MOD_OPT=@d@$${exists($$d):?$$d:$${d:S,/usr,/opt,}}@
+MOD_SEP=S,:, ,g
+
+all: modvar modvarloop
+
+modvar:
+ @echo "path='${path}'"
+ @echo "path='${path:${MOD_NODOT}}'"
+ @echo "path='${path:S,home,homes,:${MOD_NODOT}}'"
+ @echo "path=${path:${MOD_NODOTX}:ts:}"
+ @echo "path=${path:${MOD_HOMES}:${MOD_NODOTX}:ts:}"
+
+.for d in ${path:${MOD_SEP}:N.} /usr/xbin
+path_$d?= ${d:${MOD_OPT}:${MOD_HOMES}}/
+paths+= ${d:${MOD_OPT}:${MOD_HOMES}}
+.endfor
+
+modvarloop:
+ @echo "path_/usr/xbin=${path_/usr/xbin}"
+ @echo "paths=${paths}"
+ @echo "PATHS=${paths:tu}"
diff --git a/tests/usr.bin/make/d_modmisc.out b/tests/usr.bin/make/d_modmisc.out
new file mode 100644
index 00000000000..58708c265cb
--- /dev/null
+++ b/tests/usr.bin/make/d_modmisc.out
@@ -0,0 +1,8 @@
+path=':/bin:/usr/bin::/sbin:/usr/sbin:.:/home/user/bin:.'
+path='/bin:/usr/bin:/sbin:/usr/sbin:/home/user/bin'
+path='/bin:/usr/bin:/sbin:/usr/sbin:/homes/user/bin'
+path='/bin':'/usr/bin':'/sbin':'/usr/sbin':'/home/user/bin'
+path='/bin':'/usr/bin':'/sbin':'/usr/sbin':'/homes/user/bin'
+path_/usr/xbin=/opt/xbin/
+paths=/bin /usr/bin /sbin /usr/sbin /homes/user/bin /opt/xbin
+PATHS=/BIN /USR/BIN /SBIN /USR/SBIN /HOMES/USER/BIN /OPT/XBIN
diff --git a/tests/usr.bin/make/d_modorder.mk b/tests/usr.bin/make/d_modorder.mk
new file mode 100644
index 00000000000..3e133f40fbd
--- /dev/null
+++ b/tests/usr.bin/make/d_modorder.mk
@@ -0,0 +1,22 @@
+# $NetBSD: d_modorder.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+LIST= one two three four five six seven eight nine ten
+LISTX= ${LIST:Ox}
+LISTSX:= ${LIST:Ox}
+TEST_RESULT= && echo Ok || echo Failed
+
+# unit-tests have to produce the same results on each run
+# so we cannot actually include :Ox output.
+all:
+ @echo "LIST = ${LIST}"
+ @echo "LIST:O = ${LIST:O}"
+ # Note that 1 in every 10! trials two independently generated
+ # randomized orderings will be the same. The test framework doesn't
+ # support checking probabilistic output, so we accept that the test
+ # will incorrectly fail with probability 2.8E-7.
+ @echo "LIST:Ox = `test '${LIST:Ox}' != '${LIST:Ox}' ${TEST_RESULT}`"
+ @echo "LIST:O:Ox = `test '${LIST:O:Ox}' != '${LIST:O:Ox}' ${TEST_RESULT}`"
+ @echo "LISTX = `test '${LISTX}' != '${LISTX}' ${TEST_RESULT}`"
+ @echo "LISTSX = `test '${LISTSX}' = '${LISTSX}' ${TEST_RESULT}`"
+ @echo "BADMOD 1 = ${LIST:OX}"
+ @echo "BADMOD 2 = ${LIST:OxXX}"
diff --git a/tests/usr.bin/make/d_modorder.out b/tests/usr.bin/make/d_modorder.out
new file mode 100644
index 00000000000..6d273a9d160
--- /dev/null
+++ b/tests/usr.bin/make/d_modorder.out
@@ -0,0 +1,10 @@
+LIST = one two three four five six seven eight nine ten
+LIST:O = eight five four nine one seven six ten three two
+LIST:Ox = Ok
+LIST:O:Ox = Ok
+LISTX = Ok
+LISTSX = Ok
+make: Bad modifier `:OX' for LIST
+BADMOD 1 = }
+make: Bad modifier `:OxXX' for LIST
+BADMOD 2 = XX}
diff --git a/tests/usr.bin/make/d_modts.mk b/tests/usr.bin/make/d_modts.mk
new file mode 100644
index 00000000000..d0efd6d19c0
--- /dev/null
+++ b/tests/usr.bin/make/d_modts.mk
@@ -0,0 +1,32 @@
+
+LIST= one two three
+LIST+= four five six
+
+FU_mod-ts = a / b / cool
+
+AAA= a a a
+B.aaa= Baaa
+
+all: mod-ts
+
+mod-ts:
+ @echo 'LIST="${LIST}"'
+ @echo 'LIST:ts,="${LIST:ts,}"'
+ @echo 'LIST:ts/:tu="${LIST:ts/:tu}"'
+ @echo 'LIST:ts::tu="${LIST:ts::tu}"'
+ @echo 'LIST:ts:tu="${LIST:ts:tu}"'
+ @echo 'LIST:tu:ts/="${LIST:tu:ts/}"'
+ @echo 'LIST:ts:="${LIST:ts:}"'
+ @echo 'LIST:ts="${LIST:ts}"'
+ @echo 'LIST:ts:S/two/2/="${LIST:ts:S/two/2/}"'
+ @echo 'LIST:S/two/2/:ts="${LIST:S/two/2/:ts}"'
+ @echo 'LIST:ts/:S/two/2/="${LIST:ts/:S/two/2/}"'
+ @echo "Pretend the '/' in '/n' etc. below are back-slashes."
+ @echo 'LIST:ts/n="${LIST:ts\n}"'
+ @echo 'LIST:ts/t="${LIST:ts\t}"'
+ @echo 'LIST:ts/012:tu="${LIST:ts\012:tu}"'
+ @echo 'LIST:tx="${LIST:tx}"'
+ @echo 'LIST:ts/x:tu="${LIST:ts\x:tu}"'
+ @echo 'FU_$@="${FU_${@:ts}:ts}"'
+ @echo 'FU_$@:ts:T="${FU_${@:ts}:ts:T}" == cool?'
+ @echo 'B.$${AAA:ts}="${B.${AAA:ts}}" == Baaa?'
diff --git a/tests/usr.bin/make/d_modts.out b/tests/usr.bin/make/d_modts.out
new file mode 100644
index 00000000000..54527d8e8aa
--- /dev/null
+++ b/tests/usr.bin/make/d_modts.out
@@ -0,0 +1,32 @@
+LIST="one two three four five six"
+LIST:ts,="one,two,three,four,five,six"
+LIST:ts/:tu="ONE/TWO/THREE/FOUR/FIVE/SIX"
+LIST:ts::tu="ONE:TWO:THREE:FOUR:FIVE:SIX"
+LIST:ts:tu="ONETWOTHREEFOURFIVESIX"
+LIST:tu:ts/="ONE/TWO/THREE/FOUR/FIVE/SIX"
+LIST:ts:="one:two:three:four:five:six"
+LIST:ts="onetwothreefourfivesix"
+LIST:ts:S/two/2/="one2threefourfivesix"
+LIST:S/two/2/:ts="one2threefourfivesix"
+LIST:ts/:S/two/2/="one/2/three/four/five/six"
+Pretend the '/' in '/n' etc. below are back-slashes.
+LIST:ts/n="one
+two
+three
+four
+five
+six"
+LIST:ts/t="one two three four five six"
+LIST:ts/012:tu="ONE
+TWO
+THREE
+FOUR
+FIVE
+SIX"
+make: Bad modifier `:tx' for LIST
+LIST:tx="}"
+make: Bad modifier `:ts\x' for LIST
+LIST:ts/x:tu="\x:tu}"
+FU_mod-ts="a/b/cool"
+FU_mod-ts:ts:T="cool" == cool?
+B.${AAA:ts}="Baaa" == Baaa?
diff --git a/tests/usr.bin/make/d_modword.mk b/tests/usr.bin/make/d_modword.mk
new file mode 100644
index 00000000000..311bc481f13
--- /dev/null
+++ b/tests/usr.bin/make/d_modword.mk
@@ -0,0 +1,151 @@
+# $NetBSD: d_modword.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+#
+# Test behaviour of new :[] modifier
+
+all: mod-squarebrackets mod-S-W mod-C-W mod-tW-tw
+
+LIST= one two three
+LIST+= four five six
+LONGLIST= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
+
+EMPTY= # the space should be ignored
+ESCAPEDSPACE=\ # escaped space before the '#'
+REALLYSPACE:=${EMPTY:C/^/ /W}
+HASH= \#
+AT= @
+STAR= *
+ZERO= 0
+ONE= 1
+MINUSONE= -1
+
+mod-squarebrackets: mod-squarebrackets-0-star-at \
+ mod-squarebrackets-hash \
+ mod-squarebrackets-n \
+ mod-squarebrackets-start-end \
+ mod-squarebrackets-nested
+
+mod-squarebrackets-0-star-at:
+ @echo 'LIST:[]="${LIST:[]}" is an error'
+ @echo 'LIST:[0]="${LIST:[0]}"'
+ @echo 'LIST:[0x0]="${LIST:[0x0]}"'
+ @echo 'LIST:[000]="${LIST:[000]}"'
+ @echo 'LIST:[*]="${LIST:[*]}"'
+ @echo 'LIST:[@]="${LIST:[@]}"'
+ @echo 'LIST:[0]:C/ /,/="${LIST:[0]:C/ /,/}"'
+ @echo 'LIST:[0]:C/ /,/g="${LIST:[0]:C/ /,/g}"'
+ @echo 'LIST:[0]:C/ /,/1g="${LIST:[0]:C/ /,/1g}"'
+ @echo 'LIST:[*]:C/ /,/="${LIST:[*]:C/ /,/}"'
+ @echo 'LIST:[*]:C/ /,/g="${LIST:[*]:C/ /,/g}"'
+ @echo 'LIST:[*]:C/ /,/1g="${LIST:[*]:C/ /,/1g}"'
+ @echo 'LIST:[@]:C/ /,/="${LIST:[@]:C/ /,/}"'
+ @echo 'LIST:[@]:C/ /,/g="${LIST:[@]:C/ /,/g}"'
+ @echo 'LIST:[@]:C/ /,/1g="${LIST:[@]:C/ /,/1g}"'
+ @echo 'LIST:[@]:[0]:C/ /,/="${LIST:[@]:[0]:C/ /,/}"'
+ @echo 'LIST:[0]:[@]:C/ /,/="${LIST:[0]:[@]:C/ /,/}"'
+ @echo 'LIST:[@]:[*]:C/ /,/="${LIST:[@]:[*]:C/ /,/}"'
+ @echo 'LIST:[*]:[@]:C/ /,/="${LIST:[*]:[@]:C/ /,/}"'
+
+mod-squarebrackets-hash:
+ @echo 'EMPTY="${EMPTY}"'
+ @echo 'EMPTY:[#]="${EMPTY:[#]}" == 1 ?'
+ @echo 'ESCAPEDSPACE="${ESCAPEDSPACE}"'
+ @echo 'ESCAPEDSPACE:[#]="${ESCAPEDSPACE:[#]}" == 1 ?'
+ @echo 'REALLYSPACE="${REALLYSPACE}"'
+ @echo 'REALLYSPACE:[#]="${REALLYSPACE:[#]}" == 1 ?'
+ @echo 'LIST:[#]="${LIST:[#]}"'
+ @echo 'LIST:[0]:[#]="${LIST:[0]:[#]}" == 1 ?'
+ @echo 'LIST:[*]:[#]="${LIST:[*]:[#]}" == 1 ?'
+ @echo 'LIST:[@]:[#]="${LIST:[@]:[#]}"'
+ @echo 'LIST:[1]:[#]="${LIST:[1]:[#]}"'
+ @echo 'LIST:[1..3]:[#]="${LIST:[1..3]:[#]}"'
+
+mod-squarebrackets-n:
+ @echo 'EMPTY:[1]="${EMPTY:[1]}"'
+ @echo 'ESCAPEDSPACE="${ESCAPEDSPACE}"'
+ @echo 'ESCAPEDSPACE:[1]="${ESCAPEDSPACE:[1]}"'
+ @echo 'REALLYSPACE="${REALLYSPACE}"'
+ @echo 'REALLYSPACE:[1]="${REALLYSPACE:[1]}" == "" ?'
+ @echo 'REALLYSPACE:[*]:[1]="${REALLYSPACE:[*]:[1]}" == " " ?'
+ @echo 'LIST:[1]="${LIST:[1]}"'
+ @echo 'LIST:[1.]="${LIST:[1.]}" is an error'
+ @echo 'LIST:[1].="${LIST:[1].}" is an error'
+ @echo 'LIST:[2]="${LIST:[2]}"'
+ @echo 'LIST:[6]="${LIST:[6]}"'
+ @echo 'LIST:[7]="${LIST:[7]}"'
+ @echo 'LIST:[999]="${LIST:[999]}"'
+ @echo 'LIST:[-]="${LIST:[-]}" is an error'
+ @echo 'LIST:[--]="${LIST:[--]}" is an error'
+ @echo 'LIST:[-1]="${LIST:[-1]}"'
+ @echo 'LIST:[-2]="${LIST:[-2]}"'
+ @echo 'LIST:[-6]="${LIST:[-6]}"'
+ @echo 'LIST:[-7]="${LIST:[-7]}"'
+ @echo 'LIST:[-999]="${LIST:[-999]}"'
+ @echo 'LONGLIST:[17]="${LONGLIST:[17]}"'
+ @echo 'LONGLIST:[0x11]="${LONGLIST:[0x11]}"'
+ @echo 'LONGLIST:[021]="${LONGLIST:[021]}"'
+ @echo 'LIST:[0]:[1]="${LIST:[0]:[1]}"'
+ @echo 'LIST:[*]:[1]="${LIST:[*]:[1]}"'
+ @echo 'LIST:[@]:[1]="${LIST:[@]:[1]}"'
+ @echo 'LIST:[0]:[2]="${LIST:[0]:[2]}"'
+ @echo 'LIST:[*]:[2]="${LIST:[*]:[2]}"'
+ @echo 'LIST:[@]:[2]="${LIST:[@]:[2]}"'
+ @echo 'LIST:[*]:C/ /,/:[2]="${LIST:[*]:C/ /,/:[2]}"'
+ @echo 'LIST:[*]:C/ /,/:[*]:[2]="${LIST:[*]:C/ /,/:[*]:[2]}"'
+ @echo 'LIST:[*]:C/ /,/:[@]:[2]="${LIST:[*]:C/ /,/:[@]:[2]}"'
+
+mod-squarebrackets-start-end:
+ @echo 'LIST:[1.]="${LIST:[1.]}" is an error'
+ @echo 'LIST:[1..]="${LIST:[1..]}" is an error'
+ @echo 'LIST:[1..1]="${LIST:[1..1]}"'
+ @echo 'LIST:[1..1.]="${LIST:[1..1.]}" is an error'
+ @echo 'LIST:[1..2]="${LIST:[1..2]}"'
+ @echo 'LIST:[2..1]="${LIST:[2..1]}"'
+ @echo 'LIST:[3..-2]="${LIST:[3..-2]}"'
+ @echo 'LIST:[-4..4]="${LIST:[-4..4]}"'
+ @echo 'LIST:[0..1]="${LIST:[0..1]}" is an error'
+ @echo 'LIST:[-1..0]="${LIST:[-1..0]}" is an error'
+ @echo 'LIST:[-1..1]="${LIST:[-1..1]}"'
+ @echo 'LIST:[0..0]="${LIST:[0..0]}"'
+ @echo 'LIST:[3..99]="${LIST:[3..99]}"'
+ @echo 'LIST:[-3..-99]="${LIST:[-3..-99]}"'
+ @echo 'LIST:[-99..-3]="${LIST:[-99..-3]}"'
+
+mod-squarebrackets-nested:
+ @echo 'HASH="${HASH}" == "#" ?'
+ @echo 'LIST:[$${HASH}]="${LIST:[${HASH}]}"'
+ @echo 'LIST:[$${ZERO}]="${LIST:[${ZERO}]}"'
+ @echo 'LIST:[$${ZERO}x$${ONE}]="${LIST:[${ZERO}x${ONE}]}"'
+ @echo 'LIST:[$${ONE}]="${LIST:[${ONE}]}"'
+ @echo 'LIST:[$${MINUSONE}]="${LIST:[${MINUSONE}]}"'
+ @echo 'LIST:[$${STAR}]="${LIST:[${STAR}]}"'
+ @echo 'LIST:[$${AT}]="${LIST:[${AT}]}"'
+ @echo 'LIST:[$${EMPTY}]="${LIST:[${EMPTY}]}" is an error'
+ @echo 'LIST:[$${LONGLIST:[21]:S/2//}]="${LIST:[${LONGLIST:[21]:S/2//}]}"'
+ @echo 'LIST:[$${LIST:[#]}]="${LIST:[${LIST:[#]}]}"'
+ @echo 'LIST:[$${LIST:[$${HASH}]}]="${LIST:[${LIST:[${HASH}]}]}"'
+
+mod-C-W:
+ @echo 'LIST:C/ /,/="${LIST:C/ /,/}"'
+ @echo 'LIST:C/ /,/W="${LIST:C/ /,/W}"'
+ @echo 'LIST:C/ /,/gW="${LIST:C/ /,/gW}"'
+ @echo 'EMPTY:C/^/,/="${EMPTY:C/^/,/}"'
+ @echo 'EMPTY:C/^/,/W="${EMPTY:C/^/,/W}"'
+
+mod-S-W:
+ @echo 'LIST:S/ /,/="${LIST:S/ /,/}"'
+ @echo 'LIST:S/ /,/W="${LIST:S/ /,/W}"'
+ @echo 'LIST:S/ /,/gW="${LIST:S/ /,/gW}"'
+ @echo 'EMPTY:S/^/,/="${EMPTY:S/^/,/}"'
+ @echo 'EMPTY:S/^/,/W="${EMPTY:S/^/,/W}"'
+
+mod-tW-tw:
+ @echo 'LIST:tW="${LIST:tW}"'
+ @echo 'LIST:tw="${LIST:tw}"'
+ @echo 'LIST:tW:C/ /,/="${LIST:tW:C/ /,/}"'
+ @echo 'LIST:tW:C/ /,/g="${LIST:tW:C/ /,/g}"'
+ @echo 'LIST:tW:C/ /,/1g="${LIST:tW:C/ /,/1g}"'
+ @echo 'LIST:tw:C/ /,/="${LIST:tw:C/ /,/}"'
+ @echo 'LIST:tw:C/ /,/g="${LIST:tw:C/ /,/g}"'
+ @echo 'LIST:tw:C/ /,/1g="${LIST:tw:C/ /,/1g}"'
+ @echo 'LIST:tw:tW:C/ /,/="${LIST:tw:tW:C/ /,/}"'
+ @echo 'LIST:tW:tw:C/ /,/="${LIST:tW:tw:C/ /,/}"'
diff --git a/tests/usr.bin/make/d_modword.out b/tests/usr.bin/make/d_modword.out
new file mode 100644
index 00000000000..4bfdd672b0e
--- /dev/null
+++ b/tests/usr.bin/make/d_modword.out
@@ -0,0 +1,121 @@
+make: Bad modifier `:[]' for LIST
+LIST:[]="" is an error
+LIST:[0]="one two three four five six"
+LIST:[0x0]="one two three four five six"
+LIST:[000]="one two three four five six"
+LIST:[*]="one two three four five six"
+LIST:[@]="one two three four five six"
+LIST:[0]:C/ /,/="one,two three four five six"
+LIST:[0]:C/ /,/g="one,two,three,four,five,six"
+LIST:[0]:C/ /,/1g="one,two,three,four,five,six"
+LIST:[*]:C/ /,/="one,two three four five six"
+LIST:[*]:C/ /,/g="one,two,three,four,five,six"
+LIST:[*]:C/ /,/1g="one,two,three,four,five,six"
+LIST:[@]:C/ /,/="one two three four five six"
+LIST:[@]:C/ /,/g="one two three four five six"
+LIST:[@]:C/ /,/1g="one two three four five six"
+LIST:[@]:[0]:C/ /,/="one,two three four five six"
+LIST:[0]:[@]:C/ /,/="one two three four five six"
+LIST:[@]:[*]:C/ /,/="one,two three four five six"
+LIST:[*]:[@]:C/ /,/="one two three four five six"
+EMPTY=""
+EMPTY:[#]="1" == 1 ?
+ESCAPEDSPACE="\ "
+ESCAPEDSPACE:[#]="1" == 1 ?
+REALLYSPACE=" "
+REALLYSPACE:[#]="1" == 1 ?
+LIST:[#]="6"
+LIST:[0]:[#]="1" == 1 ?
+LIST:[*]:[#]="1" == 1 ?
+LIST:[@]:[#]="6"
+LIST:[1]:[#]="1"
+LIST:[1..3]:[#]="3"
+EMPTY:[1]=""
+ESCAPEDSPACE="\ "
+ESCAPEDSPACE:[1]="\ "
+REALLYSPACE=" "
+REALLYSPACE:[1]="" == "" ?
+REALLYSPACE:[*]:[1]=" " == " " ?
+LIST:[1]="one"
+make: Bad modifier `:[1.]' for LIST
+LIST:[1.]="" is an error
+make: Bad modifier `:[1].' for LIST
+LIST:[1].="}" is an error
+LIST:[2]="two"
+LIST:[6]="six"
+LIST:[7]=""
+LIST:[999]=""
+make: Bad modifier `:[-]' for LIST
+LIST:[-]="" is an error
+make: Bad modifier `:[--]' for LIST
+LIST:[--]="" is an error
+LIST:[-1]="six"
+LIST:[-2]="five"
+LIST:[-6]="one"
+LIST:[-7]=""
+LIST:[-999]=""
+LONGLIST:[17]="17"
+LONGLIST:[0x11]="17"
+LONGLIST:[021]="17"
+LIST:[0]:[1]="one two three four five six"
+LIST:[*]:[1]="one two three four five six"
+LIST:[@]:[1]="one"
+LIST:[0]:[2]=""
+LIST:[*]:[2]=""
+LIST:[@]:[2]="two"
+LIST:[*]:C/ /,/:[2]=""
+LIST:[*]:C/ /,/:[*]:[2]=""
+LIST:[*]:C/ /,/:[@]:[2]="three"
+make: Bad modifier `:[1.]' for LIST
+LIST:[1.]="" is an error
+make: Bad modifier `:[1..]' for LIST
+LIST:[1..]="" is an error
+LIST:[1..1]="one"
+make: Bad modifier `:[1..1.]' for LIST
+LIST:[1..1.]="" is an error
+LIST:[1..2]="one two"
+LIST:[2..1]="two one"
+LIST:[3..-2]="three four five"
+LIST:[-4..4]="three four"
+make: Bad modifier `:[0..1]' for LIST
+LIST:[0..1]="" is an error
+make: Bad modifier `:[-1..0]' for LIST
+LIST:[-1..0]="" is an error
+LIST:[-1..1]="six five four three two one"
+LIST:[0..0]="one two three four five six"
+LIST:[3..99]="three four five six"
+LIST:[-3..-99]="four three two one"
+LIST:[-99..-3]="one two three four"
+HASH="#" == "#" ?
+LIST:[${HASH}]="6"
+LIST:[${ZERO}]="one two three four five six"
+LIST:[${ZERO}x${ONE}]="one"
+LIST:[${ONE}]="one"
+LIST:[${MINUSONE}]="six"
+LIST:[${STAR}]="one two three four five six"
+LIST:[${AT}]="one two three four five six"
+make: Bad modifier `:[${EMPTY' for LIST
+LIST:[${EMPTY}]="" is an error
+LIST:[${LONGLIST:[21]:S/2//}]="one"
+LIST:[${LIST:[#]}]="six"
+LIST:[${LIST:[${HASH}]}]="six"
+LIST:S/ /,/="one two three four five six"
+LIST:S/ /,/W="one,two three four five six"
+LIST:S/ /,/gW="one,two,three,four,five,six"
+EMPTY:S/^/,/=","
+EMPTY:S/^/,/W=","
+LIST:C/ /,/="one two three four five six"
+LIST:C/ /,/W="one,two three four five six"
+LIST:C/ /,/gW="one,two,three,four,five,six"
+EMPTY:C/^/,/=","
+EMPTY:C/^/,/W=","
+LIST:tW="one two three four five six"
+LIST:tw="one two three four five six"
+LIST:tW:C/ /,/="one,two three four five six"
+LIST:tW:C/ /,/g="one,two,three,four,five,six"
+LIST:tW:C/ /,/1g="one,two,three,four,five,six"
+LIST:tw:C/ /,/="one two three four five six"
+LIST:tw:C/ /,/g="one two three four five six"
+LIST:tw:C/ /,/1g="one two three four five six"
+LIST:tw:tW:C/ /,/="one,two three four five six"
+LIST:tW:tw:C/ /,/="one two three four five six"
diff --git a/tests/usr.bin/make/d_posix.mk b/tests/usr.bin/make/d_posix.mk
new file mode 100644
index 00000000000..ba7d3c4c5d5
--- /dev/null
+++ b/tests/usr.bin/make/d_posix.mk
@@ -0,0 +1,24 @@
+# $NetBSD: d_posix.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+all: x plus subs err
+
+x:
+ @echo "Posix says we should execute the command as if run by system(3)"
+ @echo "Expect 'Hello,' and 'World!'"
+ @echo Hello,; false; echo "World!"
+
+plus:
+ @echo a command
+ +@echo "a command prefixed by '+' executes even with -n"
+ @echo another command
+
+subs:
+ @echo make -n
+ @${.MAKE} -f ${MAKEFILE} -n plus
+ @echo make -n -j1
+ @${.MAKE} -f ${MAKEFILE} -n -j1 plus
+
+err:
+ @(echo Now we expect an error...; exit 1)
+ @echo "Oops! you shouldn't see this!"
+
diff --git a/tests/usr.bin/make/d_posix.out b/tests/usr.bin/make/d_posix.out
new file mode 100644
index 00000000000..00aa5a33dcf
--- /dev/null
+++ b/tests/usr.bin/make/d_posix.out
@@ -0,0 +1,22 @@
+Posix says we should execute the command as if run by system(3)
+Expect 'Hello,' and 'World!'
+Hello,
+World!
+a command
+a command prefixed by '+' executes even with -n
+another command
+make -n
+echo a command
+echo "a command prefixed by '+' executes even with -n"
+a command prefixed by '+' executes even with -n
+echo another command
+make -n -j1
+{ echo a command
+} || exit $?
+echo "a command prefixed by '+' executes even with -n"
+a command prefixed by '+' executes even with -n
+{ echo another command
+} || exit $?
+Now we expect an error...
+*** Error code 1 (continuing)
+`all' not remade because of errors.
diff --git a/tests/usr.bin/make/d_qequals.mk b/tests/usr.bin/make/d_qequals.mk
new file mode 100644
index 00000000000..8cac59716b8
--- /dev/null
+++ b/tests/usr.bin/make/d_qequals.mk
@@ -0,0 +1,8 @@
+# $NetBSD: d_qequals.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+
+M= i386
+V.i386= OK
+V.$M ?= bug
+
+all:
+ @echo 'V.$M ?= ${V.$M}'
diff --git a/tests/usr.bin/make/d_qequals.out b/tests/usr.bin/make/d_qequals.out
new file mode 100644
index 00000000000..c4c87aacf1d
--- /dev/null
+++ b/tests/usr.bin/make/d_qequals.out
@@ -0,0 +1 @@
+V.i386 ?= OK
diff --git a/tests/usr.bin/make/d_ternary.mk b/tests/usr.bin/make/d_ternary.mk
new file mode 100644
index 00000000000..77f834981c6
--- /dev/null
+++ b/tests/usr.bin/make/d_ternary.mk
@@ -0,0 +1,8 @@
+
+all:
+ @for x in "" A= A=42; do ${.MAKE} -f ${MAKEFILE} show $$x; done
+
+show:
+ @echo "The answer is ${A:?known:unknown}"
+ @echo "The answer is ${A:?$A:unknown}"
+ @echo "The answer is ${empty(A):?empty:$A}"
diff --git a/tests/usr.bin/make/d_ternary.out b/tests/usr.bin/make/d_ternary.out
new file mode 100644
index 00000000000..0c41a12a8cc
--- /dev/null
+++ b/tests/usr.bin/make/d_ternary.out
@@ -0,0 +1,9 @@
+The answer is unknown
+The answer is unknown
+The answer is empty
+The answer is known
+The answer is
+The answer is empty
+The answer is known
+The answer is 42
+The answer is 42
diff --git a/tests/usr.bin/make/d_unmatchedvarparen.mk b/tests/usr.bin/make/d_unmatchedvarparen.mk
new file mode 100644
index 00000000000..21fd1454108
--- /dev/null
+++ b/tests/usr.bin/make/d_unmatchedvarparen.mk
@@ -0,0 +1,3 @@
+
+all:
+ @echo $(foo::=foo-text)
diff --git a/tests/usr.bin/make/d_unmatchedvarparen.out b/tests/usr.bin/make/d_unmatchedvarparen.out
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/tests/usr.bin/make/d_unmatchedvarparen.out
@@ -0,0 +1 @@
+
diff --git a/tests/usr.bin/make/d_varcmd.mk b/tests/usr.bin/make/d_varcmd.mk
new file mode 100644
index 00000000000..31bc4f538ed
--- /dev/null
+++ b/tests/usr.bin/make/d_varcmd.mk
@@ -0,0 +1,49 @@
+# $NetBSD: d_varcmd.mk,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+#
+# Test behaviour of recursive make and vars set on command line.
+
+FU=fu
+FOO?=foo
+.if !empty(.TARGETS)
+TAG=${.TARGETS}
+.endif
+TAG?=default
+
+all: one
+
+show:
+ @echo "${TAG} FU=<v>${FU}</v> FOO=<v>${FOO}</v> VAR=<v>${VAR}</v>"
+
+one: show
+ @${.MAKE} -f ${MAKEFILE} FU=bar FOO=goo two
+
+two: show
+ @${.MAKE} -f ${MAKEFILE} three
+
+three: show
+ @${.MAKE} -f ${MAKEFILE} four
+
+
+.ifmake four
+VAR=Internal
+.MAKEOVERRIDES+= VAR
+.endif
+
+four: show
+ @${.MAKE} -f ${MAKEFILE} five
+
+M = x
+V.y = is y
+V.x = is x
+V := ${V.$M}
+K := ${V}
+
+show-v:
+ @echo '${TAG} v=${V} k=${K}'
+
+five: show show-v
+ @${.MAKE} -f ${MAKEFILE} M=y six
+
+six: show-v
+ @${.MAKE} -f ${MAKEFILE} V=override show-v
+
diff --git a/tests/usr.bin/make/d_varcmd.out b/tests/usr.bin/make/d_varcmd.out
new file mode 100644
index 00000000000..b1b6596ecdc
--- /dev/null
+++ b/tests/usr.bin/make/d_varcmd.out
@@ -0,0 +1,8 @@
+default FU=<v>fu</v> FOO=<v>foo</v> VAR=<v></v>
+two FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v>
+three FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v>
+four FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>
+five FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>
+five v=is x k=is x
+six v=is y k=is y
+show-v v=override k=override
diff --git a/tests/usr.bin/make/t_make.sh b/tests/usr.bin/make/t_make.sh
new file mode 100644
index 00000000000..b9da56a7479
--- /dev/null
+++ b/tests/usr.bin/make/t_make.sh
@@ -0,0 +1,89 @@
+# $NetBSD: t_make.sh,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+#
+# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+# Executes make and compares the output to a golden file.
+run_and_check()
+{
+ local name="${1}"; shift
+
+ local srcdir="$(atf_get_srcdir)"
+ atf_check -o file:"${srcdir}/d_${name}.out" -x \
+ "make -k -f ${srcdir}/d_${name}.mk 2>&1 | sed -e 's,${srcdir}/d_,,'"
+}
+
+# Defines a test case for make(1), parsing a given file and comparing the
+# output to prerecorded results.
+test_case()
+{
+ local name="${1}"; shift
+ local descr="${1}"; shift
+
+ atf_test_case "${name}"
+ eval "${name}_head() { \
+ atf_set descr '${descr}'; \
+ }"
+ eval "${name}_body() { \
+ run_and_check '${name}'; \
+ }"
+}
+
+test_case comment "Checks comments (PR/17732, PR/30536)"
+test_case cond1 "Checks conditionals (PR/24420)"
+test_case dotwait "Checks .WAIT"
+test_case export "Checks .export of provided variables"
+test_case export_all "Checks .export of all global variables"
+test_case moderrs "Checks correct handling of errors in modifiers usage"
+test_case modmatch "Checks modifier :M"
+test_case modmisc "Checks modifiers specified in variables"
+test_case modorder "Checks modifier :Ox"
+test_case modts "Checks modifier :ts"
+test_case modword "Checks modifier :[]"
+test_case posix "Checks conformance to POSIX"
+test_case qequals "Checks operator ?="
+test_case ternary "Checks ternary modifier"
+test_case varcmd "Checks behavior of command line variable assignments"
+test_case unmatchedvarparen "Checks $ ( ) matches"
+
+atf_init_test_cases()
+{
+ atf_add_test_case comment
+ atf_add_test_case cond1
+ atf_add_test_case dotwait
+ atf_add_test_case export
+ atf_add_test_case export_all
+ atf_add_test_case moderrs
+ atf_add_test_case modmatch
+ atf_add_test_case modmisc
+ atf_add_test_case modorder
+ atf_add_test_case modts
+ atf_add_test_case modword
+ atf_add_test_case posix
+ atf_add_test_case qequals
+ atf_add_test_case ternary
+ atf_add_test_case varcmd
+ atf_add_test_case unmatchedvarparen
+}