aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/bmake/tests
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/bmake/tests')
-rw-r--r--usr.bin/bmake/tests/Makefile15
-rw-r--r--usr.bin/bmake/tests/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/Makefile.inc1
-rw-r--r--usr.bin/bmake/tests/README173
-rw-r--r--usr.bin/bmake/tests/archives/Makefile5
-rw-r--r--usr.bin/bmake/tests/archives/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/Makefile31
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.test60
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.11
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.21
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.31
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.41
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.51
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.51
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.50
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.60
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.70
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/legacy_test.sh14
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd/libtest.abin0 -> 2104 bytes
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile31
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.test63
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.11
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.21
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.31
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.41
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.51
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.51
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.50
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.60
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.70
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/legacy_test.sh14
-rw-r--r--usr.bin/bmake/tests/archives/fmt_44bsd_mod/libtest.abin0 -> 2104 bytes
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.test61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.11
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.21
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.31
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.41
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.51
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.50
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.61
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.71
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.20
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.30
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.40
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.50
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.60
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.70
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/legacy_test.sh14
-rw-r--r--usr.bin/bmake/tests/archives/fmt_oldbsd/libtest.abin0 -> 2016 bytes
-rw-r--r--usr.bin/bmake/tests/basic/Makefile5
-rw-r--r--usr.bin/bmake/tests/basic/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/basic/t0/Makefile11
-rw-r--r--usr.bin/bmake/tests/basic/t0/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/basic/t0/expected.status.11
-rw-r--r--usr.bin/bmake/tests/basic/t0/expected.stderr.11
-rw-r--r--usr.bin/bmake/tests/basic/t0/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/basic/t0/legacy_test.sh15
-rw-r--r--usr.bin/bmake/tests/basic/t1/Makefile12
-rw-r--r--usr.bin/bmake/tests/basic/t1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/basic/t1/Makefile.test4
-rw-r--r--usr.bin/bmake/tests/basic/t1/expected.status.11
-rw-r--r--usr.bin/bmake/tests/basic/t1/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/basic/t1/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/basic/t1/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/basic/t2/Makefile12
-rw-r--r--usr.bin/bmake/tests/basic/t2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/basic/t2/Makefile.test5
-rw-r--r--usr.bin/bmake/tests/basic/t2/expected.status.11
-rw-r--r--usr.bin/bmake/tests/basic/t2/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/basic/t2/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/basic/t2/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/basic/t3/Makefile11
-rw-r--r--usr.bin/bmake/tests/basic/t3/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/basic/t3/expected.status.11
-rw-r--r--usr.bin/bmake/tests/basic/t3/expected.stderr.11
-rw-r--r--usr.bin/bmake/tests/basic/t3/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/basic/t3/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/common.sh532
-rw-r--r--usr.bin/bmake/tests/execution/Makefile5
-rw-r--r--usr.bin/bmake/tests/execution/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/Makefile12
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/Makefile.test19
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/expected.status.11
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/expected.stdout.112
-rw-r--r--usr.bin/bmake/tests/execution/ellipsis/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/execution/empty/Makefile12
-rw-r--r--usr.bin/bmake/tests/execution/empty/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/execution/empty/Makefile.test11
-rw-r--r--usr.bin/bmake/tests/execution/empty/expected.status.11
-rw-r--r--usr.bin/bmake/tests/execution/empty/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/execution/empty/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/execution/empty/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/execution/joberr/Makefile12
-rw-r--r--usr.bin/bmake/tests/execution/joberr/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/execution/joberr/Makefile.test8
-rw-r--r--usr.bin/bmake/tests/execution/joberr/expected.status.11
-rw-r--r--usr.bin/bmake/tests/execution/joberr/expected.stderr.130
-rw-r--r--usr.bin/bmake/tests/execution/joberr/expected.stdout.190
-rw-r--r--usr.bin/bmake/tests/execution/joberr/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/execution/plus/Makefile12
-rw-r--r--usr.bin/bmake/tests/execution/plus/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/execution/plus/Makefile.test5
-rw-r--r--usr.bin/bmake/tests/execution/plus/expected.status.11
-rw-r--r--usr.bin/bmake/tests/execution/plus/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/execution/plus/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/execution/plus/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/shell/Makefile5
-rw-r--r--usr.bin/bmake/tests/shell/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/builtin/Makefile16
-rw-r--r--usr.bin/bmake/tests/shell/builtin/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/builtin/Makefile.test17
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/shell/builtin/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/shell/builtin/legacy_test.sh16
-rw-r--r--usr.bin/bmake/tests/shell/builtin/sh5
-rw-r--r--usr.bin/bmake/tests/shell/meta/Makefile16
-rw-r--r--usr.bin/bmake/tests/shell/meta/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/meta/Makefile.test17
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/shell/meta/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/shell/meta/legacy_test.sh16
-rw-r--r--usr.bin/bmake/tests/shell/meta/sh5
-rw-r--r--usr.bin/bmake/tests/shell/path/Makefile16
-rw-r--r--usr.bin/bmake/tests/shell/path/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/path/Makefile.test30
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/shell/path/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/shell/path/legacy_test.sh19
-rw-r--r--usr.bin/bmake/tests/shell/path/sh5
-rw-r--r--usr.bin/bmake/tests/shell/path_select/Makefile16
-rw-r--r--usr.bin/bmake/tests/shell/path_select/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/path_select/Makefile.test30
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/shell/path_select/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/shell/path_select/legacy_test.sh18
-rw-r--r--usr.bin/bmake/tests/shell/path_select/shell5
-rw-r--r--usr.bin/bmake/tests/shell/replace/Makefile16
-rw-r--r--usr.bin/bmake/tests/shell/replace/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/replace/Makefile.test20
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.stdout.13
-rw-r--r--usr.bin/bmake/tests/shell/replace/expected.stdout.26
-rw-r--r--usr.bin/bmake/tests/shell/replace/legacy_test.sh16
-rw-r--r--usr.bin/bmake/tests/shell/replace/shell5
-rw-r--r--usr.bin/bmake/tests/shell/select/Makefile15
-rw-r--r--usr.bin/bmake/tests/shell/select/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/shell/select/Makefile.test27
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.status.11
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.status.21
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/shell/select/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/shell/select/legacy_test.sh15
-rw-r--r--usr.bin/bmake/tests/suffixes/Makefile5
-rw-r--r--usr.bin/bmake/tests/suffixes/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/Makefile13
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/Makefile.test12
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/TEST1.a1
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/expected.status.11
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/suffixes/basic/legacy_test.sh18
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/Makefile14
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/Makefile.test5
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/TEST1.a1
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/TEST2.a1
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/expected.status.11
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild1/legacy_test.sh18
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/Makefile14
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/Makefile.test11
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/TEST1.a1
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/TEST2.a1
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/expected.status.11
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/suffixes/src_wild2/legacy_test.sh18
-rw-r--r--usr.bin/bmake/tests/syntax/Makefile5
-rw-r--r--usr.bin/bmake/tests/syntax/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/Makefile12
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/Makefile.test7
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/expected.status.11
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/expected.stderr.12
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/expected.stdout.10
-rw-r--r--usr.bin/bmake/tests/syntax/directive-t0/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/syntax/enl/Makefile24
-rw-r--r--usr.bin/bmake/tests/syntax/enl/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/syntax/enl/Makefile.test58
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.status.11
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.status.21
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.status.31
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.status.41
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.status.51
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stderr.30
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stderr.40
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stderr.50
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stdout.32
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stdout.41
-rw-r--r--usr.bin/bmake/tests/syntax/enl/expected.stdout.51
-rw-r--r--usr.bin/bmake/tests/syntax/enl/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/Makefile15
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/Makefile.test13
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.status.11
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.status.21
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/syntax/funny-targets/legacy_test.sh11
-rw-r--r--usr.bin/bmake/tests/syntax/semi/Makefile15
-rw-r--r--usr.bin/bmake/tests/syntax/semi/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/syntax/semi/Makefile.test25
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.status.11
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.status.21
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/syntax/semi/expected.stdout.22
-rw-r--r--usr.bin/bmake/tests/syntax/semi/legacy_test.sh12
-rw-r--r--usr.bin/bmake/tests/sysmk/Makefile5
-rw-r--r--usr.bin/bmake/tests/sysmk/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/Makefile12
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.test5
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/expected.status.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/1/legacy_test.sh14
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/Makefile5
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/Makefile6
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/mk/Makefile9
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/mk/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t0/mk/sys.mk.test2
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/Makefile12
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/cleanup2
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/expected.status.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/1/legacy_test.sh16
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/Makefile5
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/Makefile6
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/mk/Makefile9
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/mk/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t1/mk/sys.mk.test2
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/Makefile12
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/cleanup2
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/expected.status.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/1/legacy_test.sh16
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/Makefile5
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/Makefile6
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/mk/Makefile9
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/mk/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/sysmk/t2/mk/sys.mk.test2
-rw-r--r--usr.bin/bmake/tests/test-new.mk8
-rw-r--r--usr.bin/bmake/tests/variables/Makefile5
-rw-r--r--usr.bin/bmake/tests/variables/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/Makefile12
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/Makefile.test17
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/expected.status.11
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/expected.stdout.17
-rw-r--r--usr.bin/bmake/tests/variables/modifier_M/legacy_test.sh8
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/Makefile18
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/Makefile.test14
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.status.11
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.status.21
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.status.31
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stderr.30
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stdout.11
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stdout.21
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/expected.stdout.31
-rw-r--r--usr.bin/bmake/tests/variables/modifier_t/legacy_test.sh11
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/Makefile15
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/Makefile.test14
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.status.11
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.status.21
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.stderr.20
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.stdout.12
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/expected.stdout.22
-rw-r--r--usr.bin/bmake/tests/variables/opt_V/legacy_test.sh11
-rw-r--r--usr.bin/bmake/tests/variables/t0/Makefile12
-rw-r--r--usr.bin/bmake/tests/variables/t0/Makefile.depend10
-rw-r--r--usr.bin/bmake/tests/variables/t0/Makefile.test22
-rw-r--r--usr.bin/bmake/tests/variables/t0/expected.status.11
-rw-r--r--usr.bin/bmake/tests/variables/t0/expected.stderr.10
-rw-r--r--usr.bin/bmake/tests/variables/t0/expected.stdout.115
-rw-r--r--usr.bin/bmake/tests/variables/t0/legacy_test.sh8
370 files changed, 3126 insertions, 0 deletions
diff --git a/usr.bin/bmake/tests/Makefile b/usr.bin/bmake/tests/Makefile
new file mode 100644
index 000000000000..4dabc8879b4e
--- /dev/null
+++ b/usr.bin/bmake/tests/Makefile
@@ -0,0 +1,15 @@
+PACKAGE= tests
+
+${PACKAGE}FILES+= common.sh
+${PACKAGE}FILES+= test-new.mk
+
+TESTS_SUBDIRS= archives
+TESTS_SUBDIRS+= basic
+TESTS_SUBDIRS+= execution
+TESTS_SUBDIRS+= shell
+TESTS_SUBDIRS+= suffixes
+TESTS_SUBDIRS+= syntax
+TESTS_SUBDIRS+= sysmk
+TESTS_SUBDIRS+= variables
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/Makefile.depend b/usr.bin/bmake/tests/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/Makefile.inc b/usr.bin/bmake/tests/Makefile.inc
new file mode 100644
index 000000000000..eb3565f76d52
--- /dev/null
+++ b/usr.bin/bmake/tests/Makefile.inc
@@ -0,0 +1 @@
+SUBDIR_PARALLEL= t
diff --git a/usr.bin/bmake/tests/README b/usr.bin/bmake/tests/README
new file mode 100644
index 000000000000..d71e265d18b7
--- /dev/null
+++ b/usr.bin/bmake/tests/README
@@ -0,0 +1,173 @@
+
+This directory contains regression tests for make(1).
+
+To invoke the tests, please refer to tests(7).
+
+----------------------------------------------------------------------------
+
+The rest of this file is intended for developers.
+
+The tests are invoked via the test.sh script or prove(1) from p5-Test-Harness.
+Tests are normally executed in a special test directory that is built under
+/tmp. The reason for this is, that make tests are generally influenced by
+all file in a directory, by files in one of make's obscure object directories
+as well as in other directories make happens to look into. Therefor the
+test scripts build a clean environment in the temp directory and the
+tests are executed by cd-ing into that directory and invoking make. The
+output of the make run (standard output, standard error and the exit status)
+are written into files that are created in another directory. So the layout
+for the shell/builtin test looks like:
+
+ ./shell/builtin/ - directory with test stuff
+ /tmp/make.${USER}/shell/builtin - actual test directory
+ /tmp/make.${USER}/shell/builtin.OUTPUT - output files
+
+So a full test consists of the following steps:
+
+ setup - Set up the test environment by creating the test directory
+ and populating it with the needed files. If the test
+ directory already exists an error is printed.
+
+ run - Run the test and produce the output into the output
+ directory.
+
+ show - Show the result files on the screen.
+
+ compare - Compare the results in the output directory with those
+ in the test source directory. This just prints whether
+ the test was ok or not in the format used by prove(1).
+
+ diff - Diff the output files and the expected output files.
+
+ reset - Reset the test to its initial state.
+
+ clean - Remove both the test directory and the output directory.
+
+Each of these steps can independently be invoked with the test script
+contained in each directory. These test scripts are called test.t.
+Additionally the scripts understand the following commands:
+
+ test - Run setup, run and compare.
+
+ prove - Run setup, run, compare and clean. This is identically
+ to invoking the script without an argument.
+
+ desc - Print a short test description.
+
+ update - Update the expected results from the actual results.
+
+The test script has the following syntax:
+
+ % test.t [-v] [-m path_to_make_binary] command
+
+To invoke it via prove(1) use:
+
+ % [MAKE_PROG=path_to_make_binary] prove [options] [files/directories]
+
+Example:
+ % sh test.t -m `pwd`/../obj/make run
+ % MAKE_PROG=/usr/obj/usr/src/usr.bin/make/make prove -r
+
+The test scripts use the following environment variables that can be set
+by the user in the test script's environment:
+
+ WORK_BASE
+ - Base directory for working files. If not set
+ /tmp/make.${USER} is used.
+
+ MAKE_PROG
+ - Path to the make program to test. If not set
+ /usr/bin/make is used.
+
+The following variables are available to test scripts:
+
+ SRC_BASE
+ - test source base directory. This is determined by
+ repeatedly doing cd .. and checking for common.sh.
+ Therefor this can fail if a test source directory is
+ actually a symbolic link and is physically not located
+ below the directory containing common.sh.
+
+ SUBDIR
+ - subdirectory below WORK_BASE and SRC_BASE for current test
+
+ WORK_DIR
+ - ${WORK_BASE}/${SUBDIR}
+
+ SRC_DIR
+ - ${SRC_BASE}/${SUBDIR}
+
+The following variables and functions may be defined by the test script.
+This also lists special filenames.
+
+ DESC
+ A one-line description of the test.
+
+ TEST_MAKE_DIRS
+ A list of pairs of directory names and modes. These
+ directories are created during setup and reset. When
+ the directory already exists (during reset) only the
+ mode change is applied.
+
+ TEST_MAKE_DIRS="subdir 775 subdir/sub 555"
+
+ TEST_COPY_FILES
+ A list of pairs of file names and modes. These files
+ are copied from the source to the working directory
+ during setup and reset. When the file already exists
+ (during reset) only the mode change is applied. Files
+ may be copied from/to sub-directories. The sub-directory
+ in the working directory must already exists (see
+ TEST_MAKE_DIRS).
+
+ TEST_COPY_FILES="libtest.a 444 subdir/libfoo.a 444"
+
+ TEST_TOUCH
+ List of pairs of file names and arguments to touch(1).
+ During setup and reset for each list element touch(1)
+ is executed.
+
+ TEST_TOUCH="file1 '-t 200501011257'"
+
+ TEST_LINK
+ List of pairs of filenames. Each pair is passed to ln(1).
+ All names are prefixed with the working directory.
+
+ Makefile
+ If a file with this name exists in the source directory
+ it is automatically copied to the working directory.
+
+ setup_test()
+ If this function exists it is executed at the end of the
+ setup.
+
+ reset_test()
+ If this function exists it is executed at the end of the
+ reset.
+
+ TEST_CLEAN_FILES
+ A list of file to be deleted when resetting.
+
+ TEST_N
+ Number of tests in this script. If not set this is assumed
+ to be 1.
+
+ TEST_<number>
+ Arguments to make for test number <number>. If not set
+ the default argument of test<number> is used. To run a test
+ without argument to make, set TEST_<number> to the empty string.
+
+ TEST_<number>_SKIP
+ To skip a test (for whatever reason) this should be set
+ to a string explaining the reason for skipping the test.
+
+ TEST_<number>_TODO
+ For a test that should fail this is a short string describing
+ what the problem in make(1) is that should be fixed.
+
+ run_test()
+ Function to run a test. This function gets a single argument
+ which is the number of the test to executed. The default
+ function evaluates the variable TEST_<number> and calls
+ make with the arguments in this variable.
+
diff --git a/usr.bin/bmake/tests/archives/Makefile b/usr.bin/bmake/tests/archives/Makefile
new file mode 100644
index 000000000000..01437afa8c3c
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/archives
+
+TESTS_SUBDIRS= fmt_44bsd fmt_44bsd_mod fmt_oldbsd
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/archives/Makefile.depend b/usr.bin/bmake/tests/archives/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile
new file mode 100644
index 000000000000..7afea8dd044b
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile
@@ -0,0 +1,31 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/archives/fmt_44bsd
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.status.3
+${PACKAGE}FILES+= expected.status.4
+${PACKAGE}FILES+= expected.status.5
+${PACKAGE}FILES+= expected.status.6
+${PACKAGE}FILES+= expected.status.7
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stderr.3
+${PACKAGE}FILES+= expected.stderr.4
+${PACKAGE}FILES+= expected.stderr.5
+${PACKAGE}FILES+= expected.stderr.6
+${PACKAGE}FILES+= expected.stderr.7
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= expected.stdout.3
+${PACKAGE}FILES+= expected.stdout.4
+${PACKAGE}FILES+= expected.stdout.5
+${PACKAGE}FILES+= expected.stdout.6
+${PACKAGE}FILES+= expected.stdout.7
+${PACKAGE}FILES+= libtest.a
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.depend b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.test b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.test
new file mode 100644
index 000000000000..99f9d504463c
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/Makefile.test
@@ -0,0 +1,60 @@
+# This test checks the code reading archive files. The archive file
+# is a BSD4.4 file with __.SYMTAB and #1/N long file names.
+
+#############################################################################
+
+# should be ok
+test1: libtest.a(short.o)
+ @:
+
+libtest.a(short.o): ood
+ @:
+
+#############################################################################
+
+# should be ok
+test2: libtest.a(exactly15char.o)
+ @:
+
+libtest.a(exactly15char.o): ood
+ @:
+
+#############################################################################
+
+# should be ok
+test3: libtest.a(exactly16chars.o)
+ @:
+
+libtest.a(exactly16chars.o): ood
+ @:
+
+#############################################################################
+
+# should be ok
+test4: libtest.a(verylongobjectname.o)
+ @:
+
+libtest.a(verylongobjectname.o): ood
+ @:
+
+#############################################################################
+
+# Truncated to 16 characters
+# should fail
+test5: libtest.a(verylongobjectna)
+ @:
+
+#############################################################################
+
+# Truncated to 15 characters
+# should fail
+test6: libtest.a(verylongobjectn)
+ @:
+
+#############################################################################
+
+# should fail
+test7: libtest.a(\#1/20)
+ @:
+
+ood:
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.1 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.2 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.3 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.3
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.3
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.4 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.4
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.4
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.5 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.5
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.5
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.6 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.6
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.6
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.7 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.7
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.status.7
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.1 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.1
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.2 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.3 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.3
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.4 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.4
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.5 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.5
new file mode 100644
index 000000000000..7b91643a3821
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.5
@@ -0,0 +1 @@
+make: don't know how to make verylongobjectna. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.6 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.6
new file mode 100644
index 000000000000..fd1519039acc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.6
@@ -0,0 +1 @@
+make: don't know how to make verylongobjectn. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.7 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.7
new file mode 100644
index 000000000000..cb572e189eb1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stderr.7
@@ -0,0 +1 @@
+make: don't know how to make #1/20. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.1 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.1
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.2 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.3 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.3
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.4 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.4
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.5 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.5
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.5
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.6 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.6
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.6
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.7 b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.7
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/expected.stdout.7
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/legacy_test.sh b/usr.bin/bmake/tests/archives/fmt_44bsd/legacy_test.sh
new file mode 100644
index 000000000000..9f75b3767061
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/legacy_test.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Archive parsing (BSD4.4 format)."
+
+# Setup
+TEST_COPY_FILES="libtest.a 644"
+
+# Run
+TEST_N=7
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd/libtest.a b/usr.bin/bmake/tests/archives/fmt_44bsd/libtest.a
new file mode 100644
index 000000000000..891ce6e652d7
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd/libtest.a
Binary files differ
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile
new file mode 100644
index 000000000000..ec8d7437ae9e
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile
@@ -0,0 +1,31 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/archives/fmt_44bsd_mod
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.status.3
+${PACKAGE}FILES+= expected.status.4
+${PACKAGE}FILES+= expected.status.5
+${PACKAGE}FILES+= expected.status.6
+${PACKAGE}FILES+= expected.status.7
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stderr.3
+${PACKAGE}FILES+= expected.stderr.4
+${PACKAGE}FILES+= expected.stderr.5
+${PACKAGE}FILES+= expected.stderr.6
+${PACKAGE}FILES+= expected.stderr.7
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= expected.stdout.3
+${PACKAGE}FILES+= expected.stdout.4
+${PACKAGE}FILES+= expected.stdout.5
+${PACKAGE}FILES+= expected.stdout.6
+${PACKAGE}FILES+= expected.stdout.7
+${PACKAGE}FILES+= libtest.a
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.depend b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.test b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.test
new file mode 100644
index 000000000000..f831f6c6b064
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/Makefile.test
@@ -0,0 +1,63 @@
+# This test checks the code reading archive files. The archive file
+# is a BSD4.4 file with __.SYMTAB and #1/N long file names.
+#
+# The modification of the archive consists in slashes appended to short names.
+#
+
+#############################################################################
+
+# must be ok
+test1: libtest.a(short.o)
+ @:
+
+libtest.a(short.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test2: libtest.a(exactly15char.o)
+ @:
+
+libtest.a(exactly15char.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test3: libtest.a(exactly16chars.o)
+ @:
+
+libtest.a(exactly16chars.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test4: libtest.a(verylongobjectname.o)
+ @:
+
+libtest.a(verylongobjectname.o): ood
+ @:
+
+#############################################################################
+
+# Truncated to 16 characters
+# must fail
+test5: libtest.a(verylongobjectna)
+ @:
+
+#############################################################################
+
+# Truncated to 15 characters
+# must fail
+test6: libtest.a(verylongobjectn)
+ @:
+
+#############################################################################
+
+# must fail
+test7: libtest.a(\#1/20)
+ @:
+
+ood:
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.1 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.2 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.3 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.3
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.3
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.4 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.4
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.4
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.5 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.5
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.5
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.6 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.6
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.6
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.7 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.7
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.status.7
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.1 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.1
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.2 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.3 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.3
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.4 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.4
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.5 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.5
new file mode 100644
index 000000000000..7b91643a3821
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.5
@@ -0,0 +1 @@
+make: don't know how to make verylongobjectna. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.6 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.6
new file mode 100644
index 000000000000..fd1519039acc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.6
@@ -0,0 +1 @@
+make: don't know how to make verylongobjectn. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.7 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.7
new file mode 100644
index 000000000000..cb572e189eb1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stderr.7
@@ -0,0 +1 @@
+make: don't know how to make #1/20. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.1 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.1
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.2 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.2
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.3 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.3
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.4 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.4
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.5 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.5
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.5
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.6 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.6
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.6
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.7 b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.7
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/expected.stdout.7
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/legacy_test.sh b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/legacy_test.sh
new file mode 100644
index 000000000000..ba0590c070fb
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/legacy_test.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Archive parsing (modified BSD4.4 format)."
+
+# Setup
+TEST_COPY_FILES="libtest.a 644"
+
+# Run
+TEST_N=7
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/archives/fmt_44bsd_mod/libtest.a b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/libtest.a
new file mode 100644
index 000000000000..57bc407a2723
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_44bsd_mod/libtest.a
Binary files differ
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile
new file mode 100644
index 000000000000..f30bfd2ed5d7
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile
@@ -0,0 +1,30 @@
+PACKAGE= tests
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/archives/fmt_oldbsd
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.status.3
+${PACKAGE}FILES+= expected.status.4
+${PACKAGE}FILES+= expected.status.5
+${PACKAGE}FILES+= expected.status.6
+${PACKAGE}FILES+= expected.status.7
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stderr.3
+${PACKAGE}FILES+= expected.stderr.4
+${PACKAGE}FILES+= expected.stderr.5
+${PACKAGE}FILES+= expected.stderr.6
+${PACKAGE}FILES+= expected.stderr.7
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= expected.stdout.3
+${PACKAGE}FILES+= expected.stdout.4
+${PACKAGE}FILES+= expected.stdout.5
+${PACKAGE}FILES+= expected.stdout.6
+${PACKAGE}FILES+= expected.stdout.7
+${PACKAGE}FILES+= libtest.a
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.depend b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.test b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.test
new file mode 100644
index 000000000000..1dafe5c7370a
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/Makefile.test
@@ -0,0 +1,61 @@
+# This test checks the code reading archive files. The archive file
+# is an old BSD file with __.SYMTAB and no long file names. Filenames
+# are truncated to 16 characters.
+
+#############################################################################
+
+# must be ok
+test1: libtest.a(short.o)
+ @:
+
+libtest.a(short.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test2: libtest.a(exactly15char.o)
+ @:
+
+libtest.a(exactly15char.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test3: libtest.a(exactly16chars.o)
+ @:
+
+libtest.a(exactly16chars.o): ood
+ @:
+
+#############################################################################
+
+# must be ok
+test4: libtest.a(verylongobjectname.o)
+ @:
+
+libtest.a(verylongobjectname.o): ood
+ @:
+
+#############################################################################
+
+# Truncated to 16 characters
+# must be ok
+test5: libtest.a(verylongobjectna)
+ @:
+
+#############################################################################
+
+# Truncated to 15 characters
+# must fail
+test6: libtest.a(verylongobjectn)
+ @:
+
+#############################################################################
+
+# must fail
+test7: libtest.a(\#1/20)
+ @:
+
+ood:
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.1 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.2 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.3 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.3
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.3
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.4 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.4
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.4
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.5 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.5
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.5
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.6 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.6
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.6
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.7 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.7
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.status.7
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.1 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.1
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.2 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.2
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.3 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.3
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.4 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.4
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.5 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.5
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.5
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.6 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.6
new file mode 100644
index 000000000000..fd1519039acc
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.6
@@ -0,0 +1 @@
+make: don't know how to make verylongobjectn. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.7 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.7
new file mode 100644
index 000000000000..cb572e189eb1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stderr.7
@@ -0,0 +1 @@
+make: don't know how to make #1/20. Stop
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.1 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.1
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.2 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.2
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.3 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.3
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.4 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.4
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.5 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.5
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.5
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.6 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.6
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.6
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.7 b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.7
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/expected.stdout.7
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/legacy_test.sh b/usr.bin/bmake/tests/archives/fmt_oldbsd/legacy_test.sh
new file mode 100644
index 000000000000..9fece6fda680
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/legacy_test.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Archive parsing (old BSD format)."
+
+# Setup
+TEST_COPY_FILES="libtest.a 644"
+
+# Run
+TEST_N=7
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/archives/fmt_oldbsd/libtest.a b/usr.bin/bmake/tests/archives/fmt_oldbsd/libtest.a
new file mode 100644
index 000000000000..3434c53898a1
--- /dev/null
+++ b/usr.bin/bmake/tests/archives/fmt_oldbsd/libtest.a
Binary files differ
diff --git a/usr.bin/bmake/tests/basic/Makefile b/usr.bin/bmake/tests/basic/Makefile
new file mode 100644
index 000000000000..129ca34c06f9
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/basic
+
+TESTS_SUBDIRS= t0 t1 t2 t3
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/basic/Makefile.depend b/usr.bin/bmake/tests/basic/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/basic/t0/Makefile b/usr.bin/bmake/tests/basic/t0/Makefile
new file mode 100644
index 000000000000..6f7cf0fec6f5
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/Makefile
@@ -0,0 +1,11 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/basic/t0
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/basic/t0/Makefile.depend b/usr.bin/bmake/tests/basic/t0/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/basic/t0/expected.status.1 b/usr.bin/bmake/tests/basic/t0/expected.status.1
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/expected.status.1
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/basic/t0/expected.stderr.1 b/usr.bin/bmake/tests/basic/t0/expected.stderr.1
new file mode 100644
index 000000000000..90280c8298b9
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/expected.stderr.1
@@ -0,0 +1 @@
+make: no target to make.
diff --git a/usr.bin/bmake/tests/basic/t0/expected.stdout.1 b/usr.bin/bmake/tests/basic/t0/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/expected.stdout.1
diff --git a/usr.bin/bmake/tests/basic/t0/legacy_test.sh b/usr.bin/bmake/tests/basic/t0/legacy_test.sh
new file mode 100644
index 000000000000..60ed3a79599f
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t0/legacy_test.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="An empty Makefile file and no target given."
+
+# Setup
+TEST_TOUCH="Makefile ''"
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/basic/t1/Makefile b/usr.bin/bmake/tests/basic/t1/Makefile
new file mode 100644
index 000000000000..921c35705f2f
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/basic/t1
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/basic/t1/Makefile.depend b/usr.bin/bmake/tests/basic/t1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/basic/t1/Makefile.test b/usr.bin/bmake/tests/basic/t1/Makefile.test
new file mode 100644
index 000000000000..3394bdb325ad
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/Makefile.test
@@ -0,0 +1,4 @@
+#
+# Just a target and nothing else. No target on command line.
+#
+all:
diff --git a/usr.bin/bmake/tests/basic/t1/expected.status.1 b/usr.bin/bmake/tests/basic/t1/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/basic/t1/expected.stderr.1 b/usr.bin/bmake/tests/basic/t1/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/expected.stderr.1
diff --git a/usr.bin/bmake/tests/basic/t1/expected.stdout.1 b/usr.bin/bmake/tests/basic/t1/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/expected.stdout.1
diff --git a/usr.bin/bmake/tests/basic/t1/legacy_test.sh b/usr.bin/bmake/tests/basic/t1/legacy_test.sh
new file mode 100644
index 000000000000..31b85e5db3c3
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t1/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="A Makefile file with only a 'all:' file dependency specification."
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/basic/t2/Makefile b/usr.bin/bmake/tests/basic/t2/Makefile
new file mode 100644
index 000000000000..c75e752580bb
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/basic/t2
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/basic/t2/Makefile.depend b/usr.bin/bmake/tests/basic/t2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/basic/t2/Makefile.test b/usr.bin/bmake/tests/basic/t2/Makefile.test
new file mode 100644
index 000000000000..39889e90da07
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/Makefile.test
@@ -0,0 +1,5 @@
+#
+# Just a target and a command. No command line targets.
+#
+all:
+ echo hello
diff --git a/usr.bin/bmake/tests/basic/t2/expected.status.1 b/usr.bin/bmake/tests/basic/t2/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/basic/t2/expected.stderr.1 b/usr.bin/bmake/tests/basic/t2/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/expected.stderr.1
diff --git a/usr.bin/bmake/tests/basic/t2/expected.stdout.1 b/usr.bin/bmake/tests/basic/t2/expected.stdout.1
new file mode 100644
index 000000000000..e618540e387d
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/expected.stdout.1
@@ -0,0 +1,2 @@
+echo hello
+hello
diff --git a/usr.bin/bmake/tests/basic/t2/legacy_test.sh b/usr.bin/bmake/tests/basic/t2/legacy_test.sh
new file mode 100644
index 000000000000..df8cab594cac
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t2/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="A Makefile file with only a 'all:' file dependency specification, and shell command."
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/basic/t3/Makefile b/usr.bin/bmake/tests/basic/t3/Makefile
new file mode 100644
index 000000000000..292071adcbc7
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/Makefile
@@ -0,0 +1,11 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/basic/t3
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/basic/t3/Makefile.depend b/usr.bin/bmake/tests/basic/t3/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/basic/t3/expected.status.1 b/usr.bin/bmake/tests/basic/t3/expected.status.1
new file mode 100644
index 000000000000..0cfbf08886fc
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/expected.status.1
@@ -0,0 +1 @@
+2
diff --git a/usr.bin/bmake/tests/basic/t3/expected.stderr.1 b/usr.bin/bmake/tests/basic/t3/expected.stderr.1
new file mode 100644
index 000000000000..90280c8298b9
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/expected.stderr.1
@@ -0,0 +1 @@
+make: no target to make.
diff --git a/usr.bin/bmake/tests/basic/t3/expected.stdout.1 b/usr.bin/bmake/tests/basic/t3/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/expected.stdout.1
diff --git a/usr.bin/bmake/tests/basic/t3/legacy_test.sh b/usr.bin/bmake/tests/basic/t3/legacy_test.sh
new file mode 100644
index 000000000000..4011c6def4d1
--- /dev/null
+++ b/usr.bin/bmake/tests/basic/t3/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="No Makefile file, no command line target."
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/common.sh b/usr.bin/bmake/tests/common.sh
new file mode 100644
index 000000000000..fa078ef84c4f
--- /dev/null
+++ b/usr.bin/bmake/tests/common.sh
@@ -0,0 +1,532 @@
+#
+# Common code used run regression tests for usr.bin/make.
+
+#
+# Output a message and exit with an error.
+#
+fatal()
+{
+ echo "fatal: $*" >/dev/stderr
+ exit 1
+}
+
+make_is_fmake() {
+ # This test is not very reliable but works for now: the old fmake
+ # does have a -v option while bmake doesn't.
+ ${MAKE_PROG} -f Makefile.non-existent -v 2>&1 | \
+ grep -q "cannot open.*non-existent"
+}
+
+#
+# Check whether the working directory exists - it must.
+#
+ensure_workdir()
+{
+ if [ ! -d ${WORK_DIR} ] ; then
+ fatal "working directory ${WORK_DIR} does not exist."
+ fi
+}
+
+#
+# Make sure all tests have been run
+#
+ensure_run()
+{
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ FAIL=
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ if ! skip_test ${N} ; then
+ if [ ! -f ${OUTPUT_DIR}/status.${N} -o \
+ ! -f ${OUTPUT_DIR}/stdout.${N} -o \
+ ! -f ${OUTPUT_DIR}/stderr.${N} ] ; then
+ echo "Test ${SUBDIR}/${N} no yet run"
+ FAIL=yes
+ fi
+ fi
+ N=$((N + 1))
+ done
+
+ if [ ! -z "${FAIL}" ] ; then
+ exit 1
+ fi
+}
+
+#
+# Output usage message.
+#
+print_usage()
+{
+ echo "Usage: sh -v -m <path> -w <dir> $0 command(s)"
+ echo " setup - setup working directory"
+ echo " run - run the tests"
+ echo " show - show test results"
+ echo " compare - compare actual and expected results"
+ echo " diff - diff actual and expected results"
+ echo " reset - reset the test to its initial state"
+ echo " clean - delete working and output directory"
+ echo " test - setup + run + compare"
+ echo " prove - setup + run + compare + clean"
+ echo " desc - print short description"
+ echo " update - update the expected results with the current results"
+ echo " help - show this information"
+}
+
+#
+# Return 0 if we should skip the test. 1 otherwise
+#
+skip_test()
+{
+ eval skip=\${TEST_${1}_SKIP}
+ if [ -z "${skip}" ] ; then
+ return 1
+ else
+ return 0
+ fi
+}
+
+#
+# Common function for setup and reset.
+#
+common_setup()
+{
+ #
+ # If a Makefile exists in the source directory - copy it over
+ #
+ if [ -e ${SRC_DIR}/Makefile.test -a ! -e ${WORK_DIR}/Makefile ] ; then
+ cp ${SRC_DIR}/Makefile.test ${WORK_DIR}/Makefile
+ fi
+
+ #
+ # If the TEST_MAKE_DIRS variable is set, create those directories
+ #
+ set -- ${TEST_MAKE_DIRS}
+ while [ $# -ne 0 ] ; do
+ if [ ! -d ${WORK_DIR}/${1} ] ; then
+ mkdir -p -m ${2} ${WORK_DIR}/${1}
+ else
+ chmod ${2} ${WORK_DIR}/${1}
+ fi
+ shift ; shift
+ done
+
+ #
+ # If the TEST_COPY_FILES variable is set, copy those files over to
+ # the working directory. The value is assumed to be pairs of
+ # filenames and modes.
+ #
+ set -- ${TEST_COPY_FILES}
+ while [ $# -ne 0 ] ; do
+ local dstname="$(echo ${1} | sed -e 's,Makefile.test,Makefile,')"
+ if [ ! -e ${WORK_DIR}/${dstname} ] ; then
+ cp ${SRC_DIR}/${1} ${WORK_DIR}/${dstname}
+ fi
+ chmod ${2} ${WORK_DIR}/${dstname}
+ shift ; shift
+ done
+
+ #
+ # If the TEST_TOUCH variable is set, it is taken to be a list
+ # of pairs of filenames and arguments to touch(1). The arguments
+ # to touch must be surrounded by single quotes if there are more
+ # than one argument.
+ #
+ eval set -- ${TEST_TOUCH}
+ while [ $# -ne 0 ] ; do
+ eval touch ${2} ${WORK_DIR}/${1}
+ shift ; shift
+ done
+
+ #
+ # Now create links
+ #
+ eval set -- ${TEST_LINKS}
+ while [ $# -ne 0 ] ; do
+ eval ln ${WORK_DIR}/${1} ${WORK_DIR}/${2}
+ shift ; shift
+ done
+}
+
+#
+# Setup the test. This creates the working and output directories and
+# populates it with files. If there is a setup_test() function - call it.
+#
+eval_setup()
+{
+ #
+ # Check whether the working directory exists. If it does exit
+ # fatally so that we don't clobber a test the user is working on.
+ #
+ if [ -d ${WORK_DIR} ] ; then
+ fatal "working directory ${WORK_DIR} already exists."
+ fi
+
+ #
+ # Now create it and the output directory
+ #
+ mkdir -p ${WORK_DIR}
+ rm -rf ${OUTPUT_DIR}
+ mkdir -p ${OUTPUT_DIR}
+
+ #
+ # Common stuff
+ #
+ common_setup
+
+ #
+ # Now after all execute the user's setup function if it exists.
+ #
+ setup_test
+}
+
+#
+# Default setup_test function does nothing. This may be overriden by
+# the test.
+#
+setup_test()
+{
+}
+
+#
+# Reset the test. Here we need to rely on information from the test.
+# We executed the same steps as in the setup, by try not to clobber existing
+# files.
+# All files and directories that are listed on the TEST_CLEAN_FILES
+# variable are removed. Then the TEST_TOUCH list is executed and finally
+# the reset_test() function called if it exists.
+#
+eval_reset()
+{
+ ensure_workdir
+
+ #
+ # Clean the output directory
+ #
+ rm -rf ${OUTPUT_DIR}/*
+
+ #
+ # Common stuff
+ #
+ common_setup
+
+ #
+ # Remove files.
+ #
+ for f in ${TEST_CLEAN_FILES} ; do
+ rm -rf ${WORK_DIR}/${f}
+ done
+
+ #
+ # Execute test's function
+ #
+ reset_test
+}
+
+#
+# Default reset_test function does nothing. This may be overriden by
+# the test.
+#
+reset_test()
+{
+}
+
+#
+# Clean the test. This simply removes the working and output directories.
+#
+eval_clean()
+{
+ #
+ # If you have special cleaning needs, provide a 'cleanup' shell script.
+ #
+ if [ -n "${TEST_CLEANUP}" ] ; then
+ . ${SRC_DIR}/cleanup
+ fi
+ if [ -z "${NO_TEST_CLEANUP}" ] ; then
+ rm -rf ${WORK_DIR}
+ rm -rf ${OUTPUT_DIR}
+ fi
+}
+
+#
+# Run the test.
+#
+eval_run()
+{
+ ensure_workdir
+
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ if ! skip_test ${N} ; then
+ ( cd ${WORK_DIR} ;
+ exec 1>${OUTPUT_DIR}/stdout.${N} 2>${OUTPUT_DIR}/stderr.${N}
+ run_test ${N}
+ echo $? >${OUTPUT_DIR}/status.${N}
+ )
+ fi
+ N=$((N + 1))
+ done
+}
+
+#
+# Default run_test() function. It can be replaced by the
+# user specified regression test. The argument to this function is
+# the test number.
+#
+run_test()
+{
+ eval args=\${TEST_${1}-test${1}}
+ ${MAKE_PROG} $args
+}
+
+#
+# Show test results.
+#
+eval_show()
+{
+ ensure_workdir
+
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ if ! skip_test ${N} ; then
+ echo "=== Test ${N} Status =================="
+ cat ${OUTPUT_DIR}/status.${N}
+ echo ".......... Stdout .................."
+ cat ${OUTPUT_DIR}/stdout.${N}
+ echo ".......... Stderr .................."
+ cat ${OUTPUT_DIR}/stderr.${N}
+ fi
+ N=$((N + 1))
+ done
+}
+
+#
+# Compare results with expected results
+#
+eval_compare()
+{
+ ensure_workdir
+ ensure_run
+
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ echo "1..${TEST_N}"
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ fail=
+ todo=
+ skip=
+ if ! skip_test ${N} ; then
+ do_compare stdout ${N} || fail="${fail}stdout "
+ do_compare stderr ${N} || fail="${fail}stderr "
+ do_compare status ${N} || fail="${fail}status "
+ eval todo=\${TEST_${N}_TODO}
+ else
+ eval skip=\${TEST_${N}_SKIP}
+ fi
+ msg=
+ if [ ! -z "$fail" ]; then
+ msg="${msg}not "
+ fi
+ msg="${msg}ok ${N} ${SUBDIR}/${N}"
+ if [ ! -z "$fail" -o ! -z "$todo" -o ! -z "$skip" ]; then
+ msg="${msg} # "
+ fi
+ if [ ! -z "$skip" ] ; then
+ msg="${msg}skip ${skip}; "
+ fi
+ if [ ! -z "$todo" ] ; then
+ msg="${msg}TODO ${todo}; "
+ fi
+ if [ ! -z "$fail" ] ; then
+ msg="${msg}reason: ${fail}"
+ fi
+ echo ${msg}
+ N=$((N + 1))
+ done
+}
+
+#
+# Check if the test result is the same as the expected result.
+#
+# $1 Input file
+# $2 Test number
+#
+do_compare()
+{
+ local EXPECTED RESULT
+ EXPECTED="${SRC_DIR}/expected.$1.$2"
+ RESULT="${OUTPUT_DIR}/$1.$2"
+
+ if [ -f $EXPECTED ]; then
+ cat $RESULT | sed -e "s,^$(basename $MAKE_PROG):,make:," | \
+ diff -u $EXPECTED -
+ #diff -q $EXPECTED - 1>/dev/null 2>/dev/null
+ return $?
+ else
+ return 1 # FAIL
+ fi
+}
+
+#
+# Diff current and expected results
+#
+eval_diff()
+{
+ ensure_workdir
+ ensure_run
+
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ if ! skip_test ${N} ; then
+ FAIL=
+ do_diff stdout ${N}
+ do_diff stderr ${N}
+ do_diff status ${N}
+ fi
+ N=$((N + 1))
+ done
+}
+
+#
+# Check if the test result is the same as the expected result.
+#
+# $1 Input file
+# $2 Test number
+#
+do_diff()
+{
+ local EXPECTED RESULT
+ EXPECTED="${SRC_DIR}/expected.$1.$2"
+ RESULT="${OUTPUT_DIR}/$1.$2"
+
+ echo diff -u $EXPECTED $RESULT
+ if [ -f $EXPECTED ]; then
+ diff -u $EXPECTED $RESULT
+ else
+ echo "${EXPECTED} does not exist"
+ fi
+}
+
+#
+# Update expected results
+#
+eval_update()
+{
+ ensure_workdir
+ ensure_run
+
+ if [ -z "${TEST_N}" ] ; then
+ TEST_N=1
+ fi
+
+ FAIL=
+ N=1
+ while [ ${N} -le ${TEST_N} ] ; do
+ if ! skip_test ${N} ; then
+ cp ${OUTPUT_DIR}/stdout.${N} expected.stdout.${N}
+ cp ${OUTPUT_DIR}/stderr.${N} expected.stderr.${N}
+ cp ${OUTPUT_DIR}/status.${N} expected.status.${N}
+ fi
+ N=$((N + 1))
+ done
+}
+
+#
+# Print description
+#
+eval_desc()
+{
+ echo "${SUBDIR}: ${DESC}"
+}
+
+#
+# Run the test
+#
+eval_test()
+{
+ eval_setup
+ eval_run
+ eval_compare
+}
+
+#
+# Run the test for prove(1)
+#
+eval_prove()
+{
+ eval_setup
+ eval_run
+ eval_compare
+ eval_clean
+}
+
+#
+# Main function. Execute the command(s) on the command line.
+#
+eval_cmd()
+{
+ if [ $# -eq 0 ] ; then
+ # if no arguments given default to 'prove'
+ set -- prove
+ fi
+
+ if ! make_is_fmake ; then
+ for i in $(jot ${TEST_N:-1}) ; do
+ eval TEST_${i}_SKIP=\"make is not fmake\"
+ done
+ fi
+
+ for i
+ do
+ case $i in
+
+ setup | run | compare | diff | clean | reset | show | \
+ test | prove | desc | update)
+ eval eval_$i
+ ;;
+ * | help)
+ print_usage
+ ;;
+ esac
+ done
+}
+
+##############################################################################
+#
+# Main code
+#
+
+#
+# Determine our sub-directory. Argh.
+#
+SRC_DIR=$(dirname $0)
+SRC_BASE=`cd ${SRC_DIR} ; while [ ! -f common.sh ] ; do cd .. ; done ; pwd`
+SUBDIR=`echo ${SRC_DIR} | sed "s@${SRC_BASE}/@@"`
+
+#
+# Construct working directory
+#
+WORK_DIR=$(pwd)/work/${SUBDIR}
+OUTPUT_DIR=${WORK_DIR}.OUTPUT
+
+#
+# Make to use
+#
+MAKE_PROG=${MAKE_PROG:-/usr/bin/make}
diff --git a/usr.bin/bmake/tests/execution/Makefile b/usr.bin/bmake/tests/execution/Makefile
new file mode 100644
index 000000000000..c979fd447b8c
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/execution
+
+TESTS_SUBDIRS= ellipsis empty joberr plus
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/execution/Makefile.depend b/usr.bin/bmake/tests/execution/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/execution/ellipsis/Makefile b/usr.bin/bmake/tests/execution/ellipsis/Makefile
new file mode 100644
index 000000000000..b4f9a0362556
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/execution/ellipsis
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/execution/ellipsis/Makefile.depend b/usr.bin/bmake/tests/execution/ellipsis/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/execution/ellipsis/Makefile.test b/usr.bin/bmake/tests/execution/ellipsis/Makefile.test
new file mode 100644
index 000000000000..a208171e29ad
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/Makefile.test
@@ -0,0 +1,19 @@
+ELLIPSIS= ...
+
+check-ellipsis:
+ @${MAKE} -f ${MAKEFILE} do-$@
+ @${MAKE} -f ${MAKEFILE} -j2 do-$@
+ @${MAKE} -f ${MAKEFILE} -j2 -B do-$@
+
+do-check-ellipsis: do-check-ellipsis-1 do-check-ellipsis-2
+.ORDER: do-check-ellipsis-1 do-check-ellipsis-2
+
+do-check-ellipsis-1:
+ @echo before $@
+ ${ELLIPSIS}
+ @echo after $@
+
+do-check-ellipsis-2:
+ @echo before $@
+ ${ELLIPSIS}
+ @echo after $@
diff --git a/usr.bin/bmake/tests/execution/ellipsis/expected.status.1 b/usr.bin/bmake/tests/execution/ellipsis/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/execution/ellipsis/expected.stderr.1 b/usr.bin/bmake/tests/execution/ellipsis/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/expected.stderr.1
diff --git a/usr.bin/bmake/tests/execution/ellipsis/expected.stdout.1 b/usr.bin/bmake/tests/execution/ellipsis/expected.stdout.1
new file mode 100644
index 000000000000..a7e5727b5181
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/expected.stdout.1
@@ -0,0 +1,12 @@
+before do-check-ellipsis-1
+before do-check-ellipsis-2
+after do-check-ellipsis-1
+after do-check-ellipsis-2
+before do-check-ellipsis-1
+before do-check-ellipsis-2
+after do-check-ellipsis-1
+after do-check-ellipsis-2
+before do-check-ellipsis-1
+before do-check-ellipsis-2
+after do-check-ellipsis-1
+after do-check-ellipsis-2
diff --git a/usr.bin/bmake/tests/execution/ellipsis/legacy_test.sh b/usr.bin/bmake/tests/execution/ellipsis/legacy_test.sh
new file mode 100644
index 000000000000..0c011e3a158c
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/ellipsis/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Ellipsis command from variable"
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/execution/empty/Makefile b/usr.bin/bmake/tests/execution/empty/Makefile
new file mode 100644
index 000000000000..0917b2881011
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/execution/empty
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/execution/empty/Makefile.depend b/usr.bin/bmake/tests/execution/empty/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/execution/empty/Makefile.test b/usr.bin/bmake/tests/execution/empty/Makefile.test
new file mode 100644
index 000000000000..d7567955e6d9
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/Makefile.test
@@ -0,0 +1,11 @@
+EMPTY=
+
+check-empty:
+ @${MAKE} -f ${MAKEFILE} do-$@
+ @${MAKE} -f ${MAKEFILE} -j2 do-$@
+ @${MAKE} -f ${MAKEFILE} -j2 -B do-$@
+
+do-check-empty:
+ ${EMPTY}
+ @${EMPTY}
+ @-${EMPTY}
diff --git a/usr.bin/bmake/tests/execution/empty/expected.status.1 b/usr.bin/bmake/tests/execution/empty/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/execution/empty/expected.stderr.1 b/usr.bin/bmake/tests/execution/empty/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/expected.stderr.1
diff --git a/usr.bin/bmake/tests/execution/empty/expected.stdout.1 b/usr.bin/bmake/tests/execution/empty/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/expected.stdout.1
diff --git a/usr.bin/bmake/tests/execution/empty/legacy_test.sh b/usr.bin/bmake/tests/execution/empty/legacy_test.sh
new file mode 100644
index 000000000000..4a0d809a9773
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/empty/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Empty command (from variable)"
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/execution/joberr/Makefile b/usr.bin/bmake/tests/execution/joberr/Makefile
new file mode 100644
index 000000000000..89d93bbee65f
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/execution/joberr
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/execution/joberr/Makefile.depend b/usr.bin/bmake/tests/execution/joberr/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/execution/joberr/Makefile.test b/usr.bin/bmake/tests/execution/joberr/Makefile.test
new file mode 100644
index 000000000000..8849a3d39651
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/Makefile.test
@@ -0,0 +1,8 @@
+check-joberr:
+.for _t in 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ @-${MAKE} -f ${MAKEFILE} -j2 do-$@
+.endfor
+
+do-check-joberr:
+ @echo "Error: build failed"
+ @exit 1
diff --git a/usr.bin/bmake/tests/execution/joberr/expected.status.1 b/usr.bin/bmake/tests/execution/joberr/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/execution/joberr/expected.stderr.1 b/usr.bin/bmake/tests/execution/joberr/expected.stderr.1
new file mode 100644
index 000000000000..d0c8a2eb27b2
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/expected.stderr.1
@@ -0,0 +1,30 @@
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
+1 error
diff --git a/usr.bin/bmake/tests/execution/joberr/expected.stdout.1 b/usr.bin/bmake/tests/execution/joberr/expected.stdout.1
new file mode 100644
index 000000000000..0ee28f4fd515
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/expected.stdout.1
@@ -0,0 +1,90 @@
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+Error: build failed
+*** [do-check-joberr] Error code 1
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
+*** [check-joberr] Error code 2 (ignored)
diff --git a/usr.bin/bmake/tests/execution/joberr/legacy_test.sh b/usr.bin/bmake/tests/execution/joberr/legacy_test.sh
new file mode 100644
index 000000000000..f5f24411bdfc
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/joberr/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Test job make error output"
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/execution/plus/Makefile b/usr.bin/bmake/tests/execution/plus/Makefile
new file mode 100644
index 000000000000..1e7ea12a087d
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/execution/plus
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/execution/plus/Makefile.depend b/usr.bin/bmake/tests/execution/plus/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/execution/plus/Makefile.test b/usr.bin/bmake/tests/execution/plus/Makefile.test
new file mode 100644
index 000000000000..d423d8a7c405
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/Makefile.test
@@ -0,0 +1,5 @@
+check-+:
+ @${MAKE} -f ${MAKEFILE} -j2 -n do-$@
+
+do-check-+:
+ @+echo $@
diff --git a/usr.bin/bmake/tests/execution/plus/expected.status.1 b/usr.bin/bmake/tests/execution/plus/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/execution/plus/expected.stderr.1 b/usr.bin/bmake/tests/execution/plus/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/expected.stderr.1
diff --git a/usr.bin/bmake/tests/execution/plus/expected.stdout.1 b/usr.bin/bmake/tests/execution/plus/expected.stdout.1
new file mode 100644
index 000000000000..b334fc734706
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/expected.stdout.1
@@ -0,0 +1 @@
+do-check-+
diff --git a/usr.bin/bmake/tests/execution/plus/legacy_test.sh b/usr.bin/bmake/tests/execution/plus/legacy_test.sh
new file mode 100644
index 000000000000..c0a83013f96e
--- /dev/null
+++ b/usr.bin/bmake/tests/execution/plus/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Test '+command' execution with -n -jX"
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/Makefile b/usr.bin/bmake/tests/shell/Makefile
new file mode 100644
index 000000000000..7d15b940f412
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell
+
+TESTS_SUBDIRS= builtin meta path path_select replace select
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/Makefile.depend b/usr.bin/bmake/tests/shell/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/builtin/Makefile b/usr.bin/bmake/tests/shell/builtin/Makefile
new file mode 100644
index 000000000000..802d4511e56d
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/builtin
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= sh
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/builtin/Makefile.depend b/usr.bin/bmake/tests/shell/builtin/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/builtin/Makefile.test b/usr.bin/bmake/tests/shell/builtin/Makefile.test
new file mode 100644
index 000000000000..111bb1821bf9
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/Makefile.test
@@ -0,0 +1,17 @@
+#
+# In compat mode (the default without -j) a line that contains no shell
+# meta characters and no shell builtins is not passed to the shell but
+# executed directly. In our example the ls line without meta characters
+# will really execute ls, while the line with meta characters will execute
+# our special shell.
+#
+
+.SHELL: path="${.CURDIR}/sh"
+
+.PHONY: builtin no-builtin
+
+builtin:
+ @exec ls -d .
+
+no-builtin:
+ @ls -d .
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.status.1 b/usr.bin/bmake/tests/shell/builtin/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.status.2 b/usr.bin/bmake/tests/shell/builtin/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.stderr.1 b/usr.bin/bmake/tests/shell/builtin/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.stderr.2 b/usr.bin/bmake/tests/shell/builtin/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.stdout.1 b/usr.bin/bmake/tests/shell/builtin/expected.stdout.1
new file mode 100644
index 000000000000..9c558e357c41
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.stdout.1
@@ -0,0 +1 @@
+.
diff --git a/usr.bin/bmake/tests/shell/builtin/expected.stdout.2 b/usr.bin/bmake/tests/shell/builtin/expected.stdout.2
new file mode 100644
index 000000000000..e350eaf8c7ea
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/expected.stdout.2
@@ -0,0 +1 @@
+-ec exec ls -d .
diff --git a/usr.bin/bmake/tests/shell/builtin/legacy_test.sh b/usr.bin/bmake/tests/shell/builtin/legacy_test.sh
new file mode 100644
index 000000000000..d569508902fb
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/legacy_test.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Check that a command line with a builtin is passed to the shell."
+
+# Setup
+TEST_COPY_FILES="sh 755"
+
+# Run
+TEST_N=2
+TEST_1="-B no-builtin"
+TEST_2="-B builtin"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/builtin/sh b/usr.bin/bmake/tests/shell/builtin/sh
new file mode 100644
index 000000000000..2c246c988ce8
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/builtin/sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo "$@"
+if ! test -t 0 ; then
+ cat
+fi
diff --git a/usr.bin/bmake/tests/shell/meta/Makefile b/usr.bin/bmake/tests/shell/meta/Makefile
new file mode 100644
index 000000000000..0fde362c203c
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/meta
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= sh
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/meta/Makefile.depend b/usr.bin/bmake/tests/shell/meta/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/meta/Makefile.test b/usr.bin/bmake/tests/shell/meta/Makefile.test
new file mode 100644
index 000000000000..fbee949acc5d
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/Makefile.test
@@ -0,0 +1,17 @@
+#
+# In compat mode (the default without -j) a line that contains no shell
+# meta characters and no shell builtins is not passed to the shell but
+# executed directly. In our example the ls line without meta characters
+# will really execute ls, while the line with meta characters will execute
+# our special shell.
+#
+
+.SHELL: path="${.OBJDIR}/sh"
+
+.PHONY: meta no-meta
+
+meta:
+ @ls *
+
+no-meta:
+ @ls -d .
diff --git a/usr.bin/bmake/tests/shell/meta/expected.status.1 b/usr.bin/bmake/tests/shell/meta/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/meta/expected.status.2 b/usr.bin/bmake/tests/shell/meta/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/meta/expected.stderr.1 b/usr.bin/bmake/tests/shell/meta/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/meta/expected.stderr.2 b/usr.bin/bmake/tests/shell/meta/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/meta/expected.stdout.1 b/usr.bin/bmake/tests/shell/meta/expected.stdout.1
new file mode 100644
index 000000000000..9c558e357c41
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.stdout.1
@@ -0,0 +1 @@
+.
diff --git a/usr.bin/bmake/tests/shell/meta/expected.stdout.2 b/usr.bin/bmake/tests/shell/meta/expected.stdout.2
new file mode 100644
index 000000000000..6ac6f19502a5
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/expected.stdout.2
@@ -0,0 +1 @@
+-ec ls *
diff --git a/usr.bin/bmake/tests/shell/meta/legacy_test.sh b/usr.bin/bmake/tests/shell/meta/legacy_test.sh
new file mode 100644
index 000000000000..b276f3d434de
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/legacy_test.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Check that a command line with meta characters is passed to the shell."
+
+# Setup
+TEST_COPY_FILES="sh 755"
+
+# Run
+TEST_N=2
+TEST_1="-B no-meta"
+TEST_2="-B meta"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/meta/sh b/usr.bin/bmake/tests/shell/meta/sh
new file mode 100644
index 000000000000..2c246c988ce8
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/meta/sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo "$@"
+if ! test -t 0 ; then
+ cat
+fi
diff --git a/usr.bin/bmake/tests/shell/path/Makefile b/usr.bin/bmake/tests/shell/path/Makefile
new file mode 100644
index 000000000000..78eae358de7f
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/path
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= sh
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/path/Makefile.depend b/usr.bin/bmake/tests/shell/path/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/path/Makefile.test b/usr.bin/bmake/tests/shell/path/Makefile.test
new file mode 100644
index 000000000000..b5080234d7ce
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/Makefile.test
@@ -0,0 +1,30 @@
+#
+# Change the path for builtin shells. There are two methods to do this.
+# This is the first of them when the basename of the path is equal to
+# one of the builtin shells so that the .SHELL target automatically
+# also selectes the shell without specifying the name.
+#
+# Be sure to include a meta-character into the command line, so that
+# really our shell is executed.
+#
+#
+
+.ifmake sh_test
+
+.SHELL: path=${.OBJDIR}/sh
+sh_test:
+ @: This is the shell.
+
+.elifmake csh_test
+
+.SHELL: path=${.OBJDIR}/csh
+csh_test:
+ @: This is the C-shell.
+
+.elifmake ksh_test
+
+.SHELL: path=${.OBJDIR}/ksh
+ksh_test:
+ @: This is the Korn-shell.
+
+.endif
diff --git a/usr.bin/bmake/tests/shell/path/expected.status.1 b/usr.bin/bmake/tests/shell/path/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/path/expected.status.2 b/usr.bin/bmake/tests/shell/path/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/path/expected.stderr.1 b/usr.bin/bmake/tests/shell/path/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/path/expected.stderr.2 b/usr.bin/bmake/tests/shell/path/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/path/expected.stdout.1 b/usr.bin/bmake/tests/shell/path/expected.stdout.1
new file mode 100644
index 000000000000..d881364744b2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.stdout.1
@@ -0,0 +1 @@
+-ec : This is the shell.
diff --git a/usr.bin/bmake/tests/shell/path/expected.stdout.2 b/usr.bin/bmake/tests/shell/path/expected.stdout.2
new file mode 100644
index 000000000000..de3fc89cc9e2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/expected.stdout.2
@@ -0,0 +1 @@
+-ec : This is the C-shell.
diff --git a/usr.bin/bmake/tests/shell/path/legacy_test.sh b/usr.bin/bmake/tests/shell/path/legacy_test.sh
new file mode 100644
index 000000000000..bd3492774fb7
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/legacy_test.sh
@@ -0,0 +1,19 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="New path for builtin shells."
+
+# Setup
+TEST_COPY_FILES="sh 755"
+TEST_LINKS="sh csh sh ksh"
+
+# Run
+TEST_N=3
+TEST_1="sh_test"
+TEST_2="csh_test"
+TEST_3="ksh_test"
+TEST_3_SKIP="no ksh on FreeBSD"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/path/sh b/usr.bin/bmake/tests/shell/path/sh
new file mode 100644
index 000000000000..4363618a2f36
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path/sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo $@
+if ! test -t 0 ; then
+ cat
+fi
diff --git a/usr.bin/bmake/tests/shell/path_select/Makefile b/usr.bin/bmake/tests/shell/path_select/Makefile
new file mode 100644
index 000000000000..15aa45f061a9
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/path_select
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= shell
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/path_select/Makefile.depend b/usr.bin/bmake/tests/shell/path_select/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/path_select/Makefile.test b/usr.bin/bmake/tests/shell/path_select/Makefile.test
new file mode 100644
index 000000000000..7a8042e60a96
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/Makefile.test
@@ -0,0 +1,30 @@
+#
+# Change the path for builtin shells. There are two methods to do this.
+# This is the second of them when both a path and a name are specified.
+# This selects a builtin shell according to the name, but executes it
+# from the specified path.
+#
+# Be sure to include a meta-character into the command line, so that
+# really our shell is executed.
+#
+#
+
+.ifmake sh_test
+
+.SHELL: name=sh path=${.CURDIR}/shell
+sh_test:
+ @: This is the shell.
+
+.elifmake csh_test
+
+.SHELL: name=csh path=${.CURDIR}/shell
+csh_test:
+ @: This is the C-shell.
+
+.elifmake ksh_test
+
+.SHELL: name=ksh path=${.CURDIR}/shell
+ksh_test:
+ @: This is the Korn-shell.
+
+.endif
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.status.1 b/usr.bin/bmake/tests/shell/path_select/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.status.2 b/usr.bin/bmake/tests/shell/path_select/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.stderr.1 b/usr.bin/bmake/tests/shell/path_select/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.stderr.2 b/usr.bin/bmake/tests/shell/path_select/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.stdout.1 b/usr.bin/bmake/tests/shell/path_select/expected.stdout.1
new file mode 100644
index 000000000000..d881364744b2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.stdout.1
@@ -0,0 +1 @@
+-ec : This is the shell.
diff --git a/usr.bin/bmake/tests/shell/path_select/expected.stdout.2 b/usr.bin/bmake/tests/shell/path_select/expected.stdout.2
new file mode 100644
index 000000000000..de3fc89cc9e2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/expected.stdout.2
@@ -0,0 +1 @@
+-ec : This is the C-shell.
diff --git a/usr.bin/bmake/tests/shell/path_select/legacy_test.sh b/usr.bin/bmake/tests/shell/path_select/legacy_test.sh
new file mode 100644
index 000000000000..dbb91dcc9e56
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/legacy_test.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="New path for builtin shells (2)."
+
+# Setup
+TEST_COPY_FILES="shell 755"
+
+# Run
+TEST_N=3
+TEST_1="sh_test"
+TEST_2="csh_test"
+TEST_3="ksh_test"
+TEST_3_SKIP="no ksh on FreeBSD"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/path_select/shell b/usr.bin/bmake/tests/shell/path_select/shell
new file mode 100644
index 000000000000..4363618a2f36
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/path_select/shell
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo $@
+if ! test -t 0 ; then
+ cat
+fi
diff --git a/usr.bin/bmake/tests/shell/replace/Makefile b/usr.bin/bmake/tests/shell/replace/Makefile
new file mode 100644
index 000000000000..e2e7ad948db2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/Makefile
@@ -0,0 +1,16 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/replace
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= shell
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/replace/Makefile.depend b/usr.bin/bmake/tests/shell/replace/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/replace/Makefile.test b/usr.bin/bmake/tests/shell/replace/Makefile.test
new file mode 100644
index 000000000000..d0076b598214
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/Makefile.test
@@ -0,0 +1,20 @@
+#
+# Test that we can replace the shell and set all the shell parameters
+# (except meta and builtin which have their own test). This is done by
+# using a shell script for the shell that echoes all command line
+# arguments and its standard input. The shell name should not be one of
+# the builtin shells.
+#
+# XXX There seems to be a problem here in -j1 mode: for the line without
+# @- make should switch on echoing again, but it doesn't.
+#
+
+.SHELL: name="shell" path="${.CURDIR}/shell" \
+ quiet="be quiet" echo="be verbose" filter="be verbose" \
+ echoFlag="x" errFlag="y" \
+ hasErrCtl=y check="check errors" ignore="ignore errors"
+
+.PHONY: test1
+test1:
+ -@funny $$
+ funnier $$
diff --git a/usr.bin/bmake/tests/shell/replace/expected.status.1 b/usr.bin/bmake/tests/shell/replace/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/replace/expected.status.2 b/usr.bin/bmake/tests/shell/replace/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/replace/expected.stderr.1 b/usr.bin/bmake/tests/shell/replace/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/replace/expected.stderr.2 b/usr.bin/bmake/tests/shell/replace/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/replace/expected.stdout.1 b/usr.bin/bmake/tests/shell/replace/expected.stdout.1
new file mode 100644
index 000000000000..eff99ea17ab2
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.stdout.1
@@ -0,0 +1,3 @@
+-c funny $
+funnier $
+-ec funnier $
diff --git a/usr.bin/bmake/tests/shell/replace/expected.stdout.2 b/usr.bin/bmake/tests/shell/replace/expected.stdout.2
new file mode 100644
index 000000000000..c79a09af2916
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/expected.stdout.2
@@ -0,0 +1,6 @@
+-yx
+be quiet
+ignore errors
+funny $
+check errors
+funnier $
diff --git a/usr.bin/bmake/tests/shell/replace/legacy_test.sh b/usr.bin/bmake/tests/shell/replace/legacy_test.sh
new file mode 100644
index 000000000000..6e672d57b607
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/legacy_test.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Check that the shell can be replaced."
+
+# Setup
+TEST_COPY_FILES="shell 755"
+
+# Run
+TEST_N=2
+TEST_1=
+TEST_2=-j2
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/shell/replace/shell b/usr.bin/bmake/tests/shell/replace/shell
new file mode 100644
index 000000000000..4363618a2f36
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/replace/shell
@@ -0,0 +1,5 @@
+#!/bin/sh
+echo $@
+if ! test -t 0 ; then
+ cat
+fi
diff --git a/usr.bin/bmake/tests/shell/select/Makefile b/usr.bin/bmake/tests/shell/select/Makefile
new file mode 100644
index 000000000000..851077c23635
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/Makefile
@@ -0,0 +1,15 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/shell/select
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/shell/select/Makefile.depend b/usr.bin/bmake/tests/shell/select/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/shell/select/Makefile.test b/usr.bin/bmake/tests/shell/select/Makefile.test
new file mode 100644
index 000000000000..ed2b105610ae
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/Makefile.test
@@ -0,0 +1,27 @@
+#
+# We just select the builtin shells and check whether it is really
+# executed. This should print just the shell paths. Because we
+# normally don't have a ksh, we make this test conditional. This means
+# one has to recreate the test results once ksh is installed.
+#
+#
+
+.ifmake sh_test
+
+.SHELL: name=sh
+sh_test: print_path
+
+.elifmake csh_test
+
+.SHELL: name=csh
+csh_test: print_path
+
+.elifmake ksh_test
+
+.SHELL: name=ksh
+ksh_test: print_path
+
+.endif
+
+print_path:
+ @ps -x -opid,command | awk '$$1=='$$$$' { print $$2; }'
diff --git a/usr.bin/bmake/tests/shell/select/expected.status.1 b/usr.bin/bmake/tests/shell/select/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/select/expected.status.2 b/usr.bin/bmake/tests/shell/select/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/shell/select/expected.stderr.1 b/usr.bin/bmake/tests/shell/select/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.stderr.1
diff --git a/usr.bin/bmake/tests/shell/select/expected.stderr.2 b/usr.bin/bmake/tests/shell/select/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.stderr.2
diff --git a/usr.bin/bmake/tests/shell/select/expected.stdout.1 b/usr.bin/bmake/tests/shell/select/expected.stdout.1
new file mode 100644
index 000000000000..c2cdaa0f27c1
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.stdout.1
@@ -0,0 +1 @@
+/bin/sh
diff --git a/usr.bin/bmake/tests/shell/select/expected.stdout.2 b/usr.bin/bmake/tests/shell/select/expected.stdout.2
new file mode 100644
index 000000000000..5a831e82da12
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/expected.stdout.2
@@ -0,0 +1 @@
+/bin/csh
diff --git a/usr.bin/bmake/tests/shell/select/legacy_test.sh b/usr.bin/bmake/tests/shell/select/legacy_test.sh
new file mode 100644
index 000000000000..fc26745d61db
--- /dev/null
+++ b/usr.bin/bmake/tests/shell/select/legacy_test.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Select the builtin sh shell."
+
+# Run
+TEST_N=3
+TEST_1="sh_test"
+TEST_2="csh_test"
+TEST_3="ksh_test"
+TEST_3_SKIP="no ksh on FreeBSD"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/suffixes/Makefile b/usr.bin/bmake/tests/suffixes/Makefile
new file mode 100644
index 000000000000..d8132bcca685
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/suffixes
+
+TESTS_SUBDIRS= basic src_wild1 src_wild2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/suffixes/Makefile.depend b/usr.bin/bmake/tests/suffixes/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/suffixes/basic/Makefile b/usr.bin/bmake/tests/suffixes/basic/Makefile
new file mode 100644
index 000000000000..cfdc32fd8d00
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/Makefile
@@ -0,0 +1,13 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/suffixes/basic
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES= Makefile.test
+${PACKAGE}FILES+= TEST1.a
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/suffixes/basic/Makefile.depend b/usr.bin/bmake/tests/suffixes/basic/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/suffixes/basic/Makefile.test b/usr.bin/bmake/tests/suffixes/basic/Makefile.test
new file mode 100644
index 000000000000..6056774252f4
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/Makefile.test
@@ -0,0 +1,12 @@
+#
+# Check that a simple suffix rule is correctly processed.
+
+test1: TEST1.b
+ diff -u TEST1.a TEST1.b
+
+.SUFFIXES:
+
+.SUFFIXES: .a .b
+
+.a.b:
+ cat ${.IMPSRC} >${.TARGET}
diff --git a/usr.bin/bmake/tests/suffixes/basic/TEST1.a b/usr.bin/bmake/tests/suffixes/basic/TEST1.a
new file mode 100644
index 000000000000..da5569b525e3
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/TEST1.a
@@ -0,0 +1 @@
+I'm test file 1.
diff --git a/usr.bin/bmake/tests/suffixes/basic/expected.status.1 b/usr.bin/bmake/tests/suffixes/basic/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/suffixes/basic/expected.stderr.1 b/usr.bin/bmake/tests/suffixes/basic/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/expected.stderr.1
diff --git a/usr.bin/bmake/tests/suffixes/basic/expected.stdout.1 b/usr.bin/bmake/tests/suffixes/basic/expected.stdout.1
new file mode 100644
index 000000000000..582927e8e98e
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/expected.stdout.1
@@ -0,0 +1,2 @@
+cat TEST1.a >TEST1.b
+diff -u TEST1.a TEST1.b
diff --git a/usr.bin/bmake/tests/suffixes/basic/legacy_test.sh b/usr.bin/bmake/tests/suffixes/basic/legacy_test.sh
new file mode 100644
index 000000000000..19d647a456fd
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/basic/legacy_test.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Basic suffix operation."
+
+# Setup
+TEST_COPY_FILES="TEST1.a 644"
+
+# Reset
+TEST_CLEAN="Test1.b"
+
+# Run
+TEST_N=1
+TEST_1="-r test1"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/Makefile b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile
new file mode 100644
index 000000000000..b941895bf798
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile
@@ -0,0 +1,14 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/suffixes/src_wild1
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= TEST1.a
+${PACKAGE}FILES+= TEST2.a
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.depend b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.test b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.test
new file mode 100644
index 000000000000..08a9c3ab3cb4
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/Makefile.test
@@ -0,0 +1,5 @@
+test1: TEST1.b
+ cat TEST1.a TEST2.a | diff -u - TEST1.b
+
+TEST1.b: *.a
+ cat ${.ALLSRC} >${.TARGET}
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/TEST1.a b/usr.bin/bmake/tests/suffixes/src_wild1/TEST1.a
new file mode 100644
index 000000000000..da5569b525e3
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/TEST1.a
@@ -0,0 +1 @@
+I'm test file 1.
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/TEST2.a b/usr.bin/bmake/tests/suffixes/src_wild1/TEST2.a
new file mode 100644
index 000000000000..34f850858dc0
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/TEST2.a
@@ -0,0 +1 @@
+I'm test file 2.
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/expected.status.1 b/usr.bin/bmake/tests/suffixes/src_wild1/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/expected.stderr.1 b/usr.bin/bmake/tests/suffixes/src_wild1/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/expected.stderr.1
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/expected.stdout.1 b/usr.bin/bmake/tests/suffixes/src_wild1/expected.stdout.1
new file mode 100644
index 000000000000..3cd2129260c1
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/expected.stdout.1
@@ -0,0 +1,2 @@
+cat TEST1.a TEST2.a >TEST1.b
+cat TEST1.a TEST2.a | diff -u - TEST1.b
diff --git a/usr.bin/bmake/tests/suffixes/src_wild1/legacy_test.sh b/usr.bin/bmake/tests/suffixes/src_wild1/legacy_test.sh
new file mode 100644
index 000000000000..555112a3df67
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild1/legacy_test.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Source wildcard expansion."
+
+# Setup
+TEST_COPY_FILES="TEST1.a 644 TEST2.a 644"
+
+# Reset
+TEST_CLEAN="TEST1.b"
+
+# Run
+TEST_N=1
+TEST_1="-r test1"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/Makefile b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile
new file mode 100644
index 000000000000..8f048e9b50d6
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile
@@ -0,0 +1,14 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/suffixes/src_wild2
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= TEST1.a
+${PACKAGE}FILES+= TEST2.a
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.depend b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.test b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.test
new file mode 100644
index 000000000000..7c88e4c58660
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/Makefile.test
@@ -0,0 +1,11 @@
+#
+# Source expansion with the source in a macro
+#
+
+SRC=*.a
+
+test1: TEST1.b
+ cat TEST1.a TEST2.a | diff -u - TEST1.b
+
+TEST1.b: ${SRC}
+ cat ${.ALLSRC} >${.TARGET}
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/TEST1.a b/usr.bin/bmake/tests/suffixes/src_wild2/TEST1.a
new file mode 100644
index 000000000000..da5569b525e3
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/TEST1.a
@@ -0,0 +1 @@
+I'm test file 1.
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/TEST2.a b/usr.bin/bmake/tests/suffixes/src_wild2/TEST2.a
new file mode 100644
index 000000000000..34f850858dc0
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/TEST2.a
@@ -0,0 +1 @@
+I'm test file 2.
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/expected.status.1 b/usr.bin/bmake/tests/suffixes/src_wild2/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/expected.stderr.1 b/usr.bin/bmake/tests/suffixes/src_wild2/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/expected.stderr.1
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/expected.stdout.1 b/usr.bin/bmake/tests/suffixes/src_wild2/expected.stdout.1
new file mode 100644
index 000000000000..3cd2129260c1
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/expected.stdout.1
@@ -0,0 +1,2 @@
+cat TEST1.a TEST2.a >TEST1.b
+cat TEST1.a TEST2.a | diff -u - TEST1.b
diff --git a/usr.bin/bmake/tests/suffixes/src_wild2/legacy_test.sh b/usr.bin/bmake/tests/suffixes/src_wild2/legacy_test.sh
new file mode 100644
index 000000000000..e1faaff022a6
--- /dev/null
+++ b/usr.bin/bmake/tests/suffixes/src_wild2/legacy_test.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Source wildcard expansion (2)."
+
+# Setup
+TEST_COPY_FILES="TEST1.a 644 TEST2.a 644"
+
+# Reset
+TEST_CLEAN="TEST1.b"
+
+# Run
+TEST_N=1
+TEST_1="-r test1"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/syntax/Makefile b/usr.bin/bmake/tests/syntax/Makefile
new file mode 100644
index 000000000000..bed2ece9b2a7
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/syntax
+
+TESTS_SUBDIRS= directive-t0 enl funny-targets semi
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/syntax/Makefile.depend b/usr.bin/bmake/tests/syntax/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/Makefile b/usr.bin/bmake/tests/syntax/directive-t0/Makefile
new file mode 100644
index 000000000000..62945b572d14
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/syntax/directive-t0
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/Makefile.depend b/usr.bin/bmake/tests/syntax/directive-t0/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/Makefile.test b/usr.bin/bmake/tests/syntax/directive-t0/Makefile.test
new file mode 100644
index 000000000000..6081793e876d
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/Makefile.test
@@ -0,0 +1,7 @@
+#
+# A typo'ed directive.
+#
+
+.uudef foo
+
+all:
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/expected.status.1 b/usr.bin/bmake/tests/syntax/directive-t0/expected.status.1
new file mode 100644
index 000000000000..d00491fd7e5b
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/expected.status.1
@@ -0,0 +1 @@
+1
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/expected.stderr.1 b/usr.bin/bmake/tests/syntax/directive-t0/expected.stderr.1
new file mode 100644
index 000000000000..de66fcc37752
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/expected.stderr.1
@@ -0,0 +1,2 @@
+"Makefile", line 6: Unknown directive
+make: fatal errors encountered -- cannot continue
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/expected.stdout.1 b/usr.bin/bmake/tests/syntax/directive-t0/expected.stdout.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/expected.stdout.1
diff --git a/usr.bin/bmake/tests/syntax/directive-t0/legacy_test.sh b/usr.bin/bmake/tests/syntax/directive-t0/legacy_test.sh
new file mode 100644
index 000000000000..9a50d0bb7073
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/directive-t0/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="A typo'ed directive."
+
+# Run
+TEST_N=1
+TEST_1=
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/syntax/enl/Makefile b/usr.bin/bmake/tests/syntax/enl/Makefile
new file mode 100644
index 000000000000..cab0648e3b87
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/Makefile
@@ -0,0 +1,24 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/syntax/enl
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.status.3
+${PACKAGE}FILES+= expected.status.4
+${PACKAGE}FILES+= expected.status.5
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stderr.3
+${PACKAGE}FILES+= expected.stderr.4
+${PACKAGE}FILES+= expected.stderr.5
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= expected.stdout.3
+${PACKAGE}FILES+= expected.stdout.4
+${PACKAGE}FILES+= expected.stdout.5
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/syntax/enl/Makefile.depend b/usr.bin/bmake/tests/syntax/enl/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/syntax/enl/Makefile.test b/usr.bin/bmake/tests/syntax/enl/Makefile.test
new file mode 100644
index 000000000000..cd1cc15ceea1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/Makefile.test
@@ -0,0 +1,58 @@
+#
+# Test handling of escaped newlines.
+#
+
+.ifmake test1
+
+# This should succeed
+\
+\
+\
+test1:
+ @echo ok
+
+.elifmake test2
+
+# This should print ok because the second assignment to foo is actually
+# a continued comment.
+FOO=ok
+#\
+\
+FOO=not ok
+test2:
+ @echo "${FOO}"
+
+.elifmake test3
+
+# Make sure an escaped newline inserts a space
+test3: a\
+b
+
+a:
+ @echo a
+
+b:
+ @echo b
+
+.elifmake test4
+
+# Make sure an escaped newline inserts exactly one space
+FOO=a\
+ b
+
+test4:
+ @echo "${FOO}"
+
+.elifmake test5
+
+# Make sure each escaped newline inserts exactly one space
+FOO=a\
+\
+\
+\
+b
+
+test5:
+ @echo "${FOO}"
+
+.endif
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.status.1 b/usr.bin/bmake/tests/syntax/enl/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.status.2 b/usr.bin/bmake/tests/syntax/enl/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.status.3 b/usr.bin/bmake/tests/syntax/enl/expected.status.3
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.status.3
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.status.4 b/usr.bin/bmake/tests/syntax/enl/expected.status.4
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.status.4
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.status.5 b/usr.bin/bmake/tests/syntax/enl/expected.status.5
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.status.5
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stderr.1 b/usr.bin/bmake/tests/syntax/enl/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stderr.1
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stderr.2 b/usr.bin/bmake/tests/syntax/enl/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stderr.2
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stderr.3 b/usr.bin/bmake/tests/syntax/enl/expected.stderr.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stderr.3
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stderr.4 b/usr.bin/bmake/tests/syntax/enl/expected.stderr.4
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stderr.4
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stderr.5 b/usr.bin/bmake/tests/syntax/enl/expected.stderr.5
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stderr.5
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stdout.1 b/usr.bin/bmake/tests/syntax/enl/expected.stdout.1
new file mode 100644
index 000000000000..9766475a4185
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stdout.1
@@ -0,0 +1 @@
+ok
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stdout.2 b/usr.bin/bmake/tests/syntax/enl/expected.stdout.2
new file mode 100644
index 000000000000..9766475a4185
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stdout.2
@@ -0,0 +1 @@
+ok
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stdout.3 b/usr.bin/bmake/tests/syntax/enl/expected.stdout.3
new file mode 100644
index 000000000000..422c2b7ab3b3
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stdout.3
@@ -0,0 +1,2 @@
+a
+b
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stdout.4 b/usr.bin/bmake/tests/syntax/enl/expected.stdout.4
new file mode 100644
index 000000000000..b2901ea97cfc
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stdout.4
@@ -0,0 +1 @@
+a b
diff --git a/usr.bin/bmake/tests/syntax/enl/expected.stdout.5 b/usr.bin/bmake/tests/syntax/enl/expected.stdout.5
new file mode 100644
index 000000000000..51200767c616
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/expected.stdout.5
@@ -0,0 +1 @@
+a b
diff --git a/usr.bin/bmake/tests/syntax/enl/legacy_test.sh b/usr.bin/bmake/tests/syntax/enl/legacy_test.sh
new file mode 100644
index 000000000000..20d2a80d9603
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/enl/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Test escaped new-lines handling."
+
+# Run
+TEST_N=5
+TEST_2_TODO="bug in parser"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/Makefile b/usr.bin/bmake/tests/syntax/funny-targets/Makefile
new file mode 100644
index 000000000000..803e745c65a8
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/Makefile
@@ -0,0 +1,15 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/syntax/funny-targets
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/Makefile.depend b/usr.bin/bmake/tests/syntax/funny-targets/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/Makefile.test b/usr.bin/bmake/tests/syntax/funny-targets/Makefile.test
new file mode 100644
index 000000000000..943c46fe0571
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/Makefile.test
@@ -0,0 +1,13 @@
+#
+# PR bin/6612 / GRN r102178
+#
+
+test1: colons::colons::target
+
+colons::colons::target:
+ @echo '${.TARGET}'
+
+test2: exclamation!target
+
+exclamation!target:
+ @echo '${.TARGET}
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.status.1 b/usr.bin/bmake/tests/syntax/funny-targets/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.status.2 b/usr.bin/bmake/tests/syntax/funny-targets/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.1 b/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.1
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.2 b/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.stderr.2
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.1 b/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.1
new file mode 100644
index 000000000000..09cb2328e9f7
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.1
@@ -0,0 +1 @@
+colons::colons::target
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.2 b/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.2
new file mode 100644
index 000000000000..b2f03648b48d
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/expected.stdout.2
@@ -0,0 +1 @@
+exclamation!target
diff --git a/usr.bin/bmake/tests/syntax/funny-targets/legacy_test.sh b/usr.bin/bmake/tests/syntax/funny-targets/legacy_test.sh
new file mode 100644
index 000000000000..c922ee67227b
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/funny-targets/legacy_test.sh
@@ -0,0 +1,11 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC='Target names with "funny" embeded characters.'
+
+# Run
+TEST_N=2
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/syntax/semi/Makefile b/usr.bin/bmake/tests/syntax/semi/Makefile
new file mode 100644
index 000000000000..0af26aed75e6
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/Makefile
@@ -0,0 +1,15 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/syntax/semi
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/syntax/semi/Makefile.depend b/usr.bin/bmake/tests/syntax/semi/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/syntax/semi/Makefile.test b/usr.bin/bmake/tests/syntax/semi/Makefile.test
new file mode 100644
index 000000000000..c863f7e111e1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/Makefile.test
@@ -0,0 +1,25 @@
+#
+# Test handling of escaped newlines.
+#
+
+.ifmake test1
+
+FOO=
+BAR=bar
+FOO != echo ${FOO} ; echo ${BAR}
+
+test1:
+ echo ${FOO}
+
+.endif
+
+.ifmake test2
+
+FOO=foo
+BAR=bar
+FOO != echo ${FOO} ; echo ${BAR}
+
+test2:
+ echo ${FOO}
+
+.endif
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.status.1 b/usr.bin/bmake/tests/syntax/semi/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.status.2 b/usr.bin/bmake/tests/syntax/semi/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.stderr.1 b/usr.bin/bmake/tests/syntax/semi/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.stderr.1
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.stderr.2 b/usr.bin/bmake/tests/syntax/semi/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.stderr.2
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.stdout.1 b/usr.bin/bmake/tests/syntax/semi/expected.stdout.1
new file mode 100644
index 000000000000..12b9617511d6
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.stdout.1
@@ -0,0 +1,2 @@
+echo bar
+bar
diff --git a/usr.bin/bmake/tests/syntax/semi/expected.stdout.2 b/usr.bin/bmake/tests/syntax/semi/expected.stdout.2
new file mode 100644
index 000000000000..be0fa5556666
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/expected.stdout.2
@@ -0,0 +1,2 @@
+echo foo bar
+foo bar
diff --git a/usr.bin/bmake/tests/syntax/semi/legacy_test.sh b/usr.bin/bmake/tests/syntax/semi/legacy_test.sh
new file mode 100644
index 000000000000..81e8f0d9c69b
--- /dev/null
+++ b/usr.bin/bmake/tests/syntax/semi/legacy_test.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Test semicolon handling."
+
+# Run
+TEST_N=2
+TEST_1_TODO="parser bug"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/sysmk/Makefile b/usr.bin/bmake/tests/sysmk/Makefile
new file mode 100644
index 000000000000..302e8059d0e6
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk
+
+TESTS_SUBDIRS= t0 t1 t2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/Makefile.depend b/usr.bin/bmake/tests/sysmk/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile
new file mode 100644
index 000000000000..69c6ecb522fa
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t0/2/1
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.depend b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.test b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.test
new file mode 100644
index 000000000000..6b4eac3f1880
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/Makefile.test
@@ -0,0 +1,5 @@
+#
+# Can we traverse up to / and find a 'mk/sys.mk'?
+#
+all:
+ @echo ${DASH_M_DOTDOTDOT}
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/expected.status.1 b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stderr.1 b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stderr.1
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stdout.1 b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stdout.1
new file mode 100644
index 000000000000..6f29307aecc3
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/expected.stdout.1
@@ -0,0 +1 @@
+Found_DotDotDot_sys_mk
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/1/legacy_test.sh b/usr.bin/bmake/tests/sysmk/t0/2/1/legacy_test.sh
new file mode 100644
index 000000000000..7b5139751dcb
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/1/legacy_test.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+. $(dirname $0)/../../../../common.sh
+
+# Description
+DESC="Can we traverse up to / and find a 'mk/sys.mk'?"
+
+# Run
+TEST_N=1
+TEST_1="-m .../mk"
+TEST_MAKE_DIRS="../../mk 755"
+TEST_COPY_FILES="../../mk/sys.mk 644"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/Makefile b/usr.bin/bmake/tests/sysmk/t0/2/Makefile
new file mode 100644
index 000000000000..9fbcc9527124
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t0/2
+
+TESTS_SUBDIRS= 1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t0/2/Makefile.depend b/usr.bin/bmake/tests/sysmk/t0/2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t0/Makefile b/usr.bin/bmake/tests/sysmk/t0/Makefile
new file mode 100644
index 000000000000..0ffd2fe9edd6
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/Makefile
@@ -0,0 +1,6 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t0
+
+TESTS_SUBDIRS= 2
+SUBDIR= mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t0/Makefile.depend b/usr.bin/bmake/tests/sysmk/t0/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t0/mk/Makefile b/usr.bin/bmake/tests/sysmk/t0/mk/Makefile
new file mode 100644
index 000000000000..b02918923a3a
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/mk/Makefile
@@ -0,0 +1,9 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t0/mk
+
+${PACKAGE}FILES+= sys.mk.test
+
+${PACKAGE}FILESNAME_sys.mk.test= sys.mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t0/mk/Makefile.depend b/usr.bin/bmake/tests/sysmk/t0/mk/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/mk/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t0/mk/sys.mk.test b/usr.bin/bmake/tests/sysmk/t0/mk/sys.mk.test
new file mode 100644
index 000000000000..b08709e89ca5
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t0/mk/sys.mk.test
@@ -0,0 +1,2 @@
+
+DASH_M_DOTDOTDOT=Found_DotDotDot_sys_mk
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile b/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile
new file mode 100644
index 000000000000..5e448e91e48c
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t1/2/1
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= cleanup
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile.depend b/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/cleanup b/usr.bin/bmake/tests/sysmk/t1/2/1/cleanup
new file mode 100644
index 000000000000..0ca413803115
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/cleanup
@@ -0,0 +1,2 @@
+
+rm -rf ${WORK_DIR}/../../../t0/2/1
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/expected.status.1 b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stderr.1 b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stderr.1
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stdout.1 b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stdout.1
new file mode 100644
index 000000000000..6f29307aecc3
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/expected.stdout.1
@@ -0,0 +1 @@
+Found_DotDotDot_sys_mk
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/1/legacy_test.sh b/usr.bin/bmake/tests/sysmk/t1/2/1/legacy_test.sh
new file mode 100644
index 000000000000..c6483c3f6f1c
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/1/legacy_test.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+. $(dirname $0)/../../../../common.sh
+
+# Description
+DESC="Can we traverse up to / and find a 'mk/sys.mk' with -C -m?"
+
+# Run
+TEST_N=1
+TEST_1="-C ../../../t0/2/1 -m .../mk"
+TEST_MAKE_DIRS="../../mk 755 ../../../t0/mk 755 ../../../t0/2/1 755"
+TEST_COPY_FILES="../../mk/sys.mk 644 ../../../t0/mk/sys.mk 644 ../../../t0/2/1/Makefile.test 644"
+TEST_CLEAN_FILES="../../../t0/2/1"
+TEST_CLEANUP=clean-special
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/Makefile b/usr.bin/bmake/tests/sysmk/t1/2/Makefile
new file mode 100644
index 000000000000..652066ddea0e
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t1/2
+
+TESTS_SUBDIRS= 1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t1/2/Makefile.depend b/usr.bin/bmake/tests/sysmk/t1/2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t1/Makefile b/usr.bin/bmake/tests/sysmk/t1/Makefile
new file mode 100644
index 000000000000..07a2962e6f49
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/Makefile
@@ -0,0 +1,6 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t1
+
+TESTS_SUBDIRS= 2
+SUBDIR= mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t1/Makefile.depend b/usr.bin/bmake/tests/sysmk/t1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t1/mk/Makefile b/usr.bin/bmake/tests/sysmk/t1/mk/Makefile
new file mode 100644
index 000000000000..3d9597d8580e
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/mk/Makefile
@@ -0,0 +1,9 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t1/mk
+
+${PACKAGE}FILES+= sys.mk.test
+
+${PACKAGE}FILESNAME_sys.mk.test= sys.mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t1/mk/Makefile.depend b/usr.bin/bmake/tests/sysmk/t1/mk/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/mk/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t1/mk/sys.mk.test b/usr.bin/bmake/tests/sysmk/t1/mk/sys.mk.test
new file mode 100644
index 000000000000..e49f3829ecab
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t1/mk/sys.mk.test
@@ -0,0 +1,2 @@
+
+DASH_M_DOTDOTDOT=Found_WRONG_DotDotDot_sys_mk__with_C_before_m
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile b/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile
new file mode 100644
index 000000000000..a3b7a56993b5
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t2/2/1
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= cleanup
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile.depend b/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/cleanup b/usr.bin/bmake/tests/sysmk/t2/2/1/cleanup
new file mode 100644
index 000000000000..0ca413803115
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/cleanup
@@ -0,0 +1,2 @@
+
+rm -rf ${WORK_DIR}/../../../t0/2/1
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/expected.status.1 b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stderr.1 b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stderr.1
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stdout.1 b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stdout.1
new file mode 100644
index 000000000000..70f1be3c507c
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/expected.stdout.1
@@ -0,0 +1 @@
+Found_DotDotDot_sys_mk__with_m_before_C
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/1/legacy_test.sh b/usr.bin/bmake/tests/sysmk/t2/2/1/legacy_test.sh
new file mode 100644
index 000000000000..2039eb09280a
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/1/legacy_test.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+. $(dirname $0)/../../../../common.sh
+
+# Description
+DESC="Can we traverse up to / and find a 'mk/sys.mk' with -m -C?"
+
+# Run
+TEST_N=1
+TEST_1="-m .../mk -C ../../../t0/2/1"
+TEST_MAKE_DIRS="../../mk 755 ../../../t0/mk 755 ../../../t0/2/1 755"
+TEST_COPY_FILES="../../mk/sys.mk 644 ../../../t0/mk/sys.mk 644 ../../../t0/2/1/Makefile.test 644"
+TEST_CLEAN_FILES="../../../t0/2/1"
+TEST_CLEANUP=clean-special
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/Makefile b/usr.bin/bmake/tests/sysmk/t2/2/Makefile
new file mode 100644
index 000000000000..04a4f5b41bc2
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t2/2
+
+TESTS_SUBDIRS= 1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t2/2/Makefile.depend b/usr.bin/bmake/tests/sysmk/t2/2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t2/Makefile b/usr.bin/bmake/tests/sysmk/t2/Makefile
new file mode 100644
index 000000000000..9d06ee857c21
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/Makefile
@@ -0,0 +1,6 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t2
+
+TESTS_SUBDIRS= 2
+SUBDIR= mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t2/Makefile.depend b/usr.bin/bmake/tests/sysmk/t2/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t2/mk/Makefile b/usr.bin/bmake/tests/sysmk/t2/mk/Makefile
new file mode 100644
index 000000000000..2f08ba2cea58
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/mk/Makefile
@@ -0,0 +1,9 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/sysmk/t2/mk
+
+${PACKAGE}FILES+= sys.mk.test
+
+${PACKAGE}FILESNAME_sys.mk.test= sys.mk
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/sysmk/t2/mk/Makefile.depend b/usr.bin/bmake/tests/sysmk/t2/mk/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/mk/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/sysmk/t2/mk/sys.mk.test b/usr.bin/bmake/tests/sysmk/t2/mk/sys.mk.test
new file mode 100644
index 000000000000..ceb5f909d390
--- /dev/null
+++ b/usr.bin/bmake/tests/sysmk/t2/mk/sys.mk.test
@@ -0,0 +1,2 @@
+
+DASH_M_DOTDOTDOT=Found_DotDotDot_sys_mk__with_m_before_C
diff --git a/usr.bin/bmake/tests/test-new.mk b/usr.bin/bmake/tests/test-new.mk
new file mode 100644
index 000000000000..761f0a1acc9f
--- /dev/null
+++ b/usr.bin/bmake/tests/test-new.mk
@@ -0,0 +1,8 @@
+
+NEW_DIR!= make -C ${.CURDIR}/../../../../usr.bin/make -V .OBJDIR
+
+all:
+ rm -rf /tmp/${USER}.make.test
+ env MAKE_PROG=${NEW_DIR}/make ${.SHELL} ./all.sh
+
+.include <bsd.obj.mk>
diff --git a/usr.bin/bmake/tests/variables/Makefile b/usr.bin/bmake/tests/variables/Makefile
new file mode 100644
index 000000000000..f138b4b0c436
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/Makefile
@@ -0,0 +1,5 @@
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/variables
+
+TESTS_SUBDIRS= modifier_M modifier_t opt_V t0
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/variables/Makefile.depend b/usr.bin/bmake/tests/variables/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/variables/modifier_M/Makefile b/usr.bin/bmake/tests/variables/modifier_M/Makefile
new file mode 100644
index 000000000000..484de9de0bdc
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/variables/modifier_M
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/variables/modifier_M/Makefile.depend b/usr.bin/bmake/tests/variables/modifier_M/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/variables/modifier_M/Makefile.test b/usr.bin/bmake/tests/variables/modifier_M/Makefile.test
new file mode 100644
index 000000000000..a4fa026431f1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/Makefile.test
@@ -0,0 +1,17 @@
+#
+# Test the M modifier.
+#
+FILES = \
+ main.c globals.h \
+ util.c util.h \
+ map.c map.h \
+ parser.y lexer.l \
+ cmdman.1 format.5
+test1:
+ @echo "all files: ${FILES}"
+ @echo "cfiles: ${FILES:M*.c}"
+ @echo "hfiles: ${FILES:M*.h}"
+ @echo "grammar and lexer: ${FILES:M*.[ly]}"
+ @echo "man page: ${FILES:M*.[1-9]}"
+ @echo "utility files: ${FILES:Mutil.?}"
+ @echo "m files: ${FILES:Mm*}"
diff --git a/usr.bin/bmake/tests/variables/modifier_M/expected.status.1 b/usr.bin/bmake/tests/variables/modifier_M/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/modifier_M/expected.stderr.1 b/usr.bin/bmake/tests/variables/modifier_M/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/expected.stderr.1
diff --git a/usr.bin/bmake/tests/variables/modifier_M/expected.stdout.1 b/usr.bin/bmake/tests/variables/modifier_M/expected.stdout.1
new file mode 100644
index 000000000000..b29e6df10233
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/expected.stdout.1
@@ -0,0 +1,7 @@
+all files: main.c globals.h util.c util.h map.c map.h parser.y lexer.l cmdman.1 format.5
+cfiles: main.c util.c map.c
+hfiles: globals.h util.h map.h
+grammar and lexer: parser.y lexer.l
+man page: cmdman.1 format.5
+utility files: util.c util.h
+m files: main.c map.c map.h
diff --git a/usr.bin/bmake/tests/variables/modifier_M/legacy_test.sh b/usr.bin/bmake/tests/variables/modifier_M/legacy_test.sh
new file mode 100644
index 000000000000..58dccdcf4743
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_M/legacy_test.sh
@@ -0,0 +1,8 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Variable expansion with M modifier"
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/variables/modifier_t/Makefile b/usr.bin/bmake/tests/variables/modifier_t/Makefile
new file mode 100644
index 000000000000..2553e4517c4b
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/Makefile
@@ -0,0 +1,18 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/variables/modifier_t
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.status.3
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stderr.3
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+${PACKAGE}FILES+= expected.stdout.3
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/variables/modifier_t/Makefile.depend b/usr.bin/bmake/tests/variables/modifier_t/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/variables/modifier_t/Makefile.test b/usr.bin/bmake/tests/variables/modifier_t/Makefile.test
new file mode 100644
index 000000000000..a99eb194f972
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/Makefile.test
@@ -0,0 +1,14 @@
+#
+# Test the t modifier.
+#
+# below is missing '
+ASCII= !"\#$$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+
+test1:
+ @echo '${ASCII}'
+
+test2:
+ @echo '${ASCII:tl}'
+
+test3:
+ @echo '${ASCII:tu}'
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.status.1 b/usr.bin/bmake/tests/variables/modifier_t/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.status.2 b/usr.bin/bmake/tests/variables/modifier_t/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.status.3 b/usr.bin/bmake/tests/variables/modifier_t/expected.status.3
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.status.3
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.1 b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.1
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.2 b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.2
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.3 b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.3
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stderr.3
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.1 b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.1
new file mode 100644
index 000000000000..dff38fdd07ff
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.1
@@ -0,0 +1 @@
+!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.2 b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.2
new file mode 100644
index 000000000000..71a0f6077ef2
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.2
@@ -0,0 +1 @@
+!"#$%&()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
diff --git a/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.3 b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.3
new file mode 100644
index 000000000000..6434c7ba7434
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/expected.stdout.3
@@ -0,0 +1 @@
+!"#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~
diff --git a/usr.bin/bmake/tests/variables/modifier_t/legacy_test.sh b/usr.bin/bmake/tests/variables/modifier_t/legacy_test.sh
new file mode 100644
index 000000000000..42dfbe07e6e9
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/modifier_t/legacy_test.sh
@@ -0,0 +1,11 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Variable expansion with t modifiers"
+
+# Run
+TEST_N=3
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/variables/opt_V/Makefile b/usr.bin/bmake/tests/variables/opt_V/Makefile
new file mode 100644
index 000000000000..534b3e4246f6
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/Makefile
@@ -0,0 +1,15 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/variables/opt_V
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.status.2
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stderr.2
+${PACKAGE}FILES+= expected.stdout.1
+${PACKAGE}FILES+= expected.stdout.2
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/variables/opt_V/Makefile.depend b/usr.bin/bmake/tests/variables/opt_V/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/variables/opt_V/Makefile.test b/usr.bin/bmake/tests/variables/opt_V/Makefile.test
new file mode 100644
index 000000000000..b30ab0c9822c
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/Makefile.test
@@ -0,0 +1,14 @@
+#
+# Test the -V option
+#
+
+FOO= foo
+FOOBAR= ${FOO}bar
+
+test1:
+ @echo "-V FOOBAR"
+ @${MAKE} -V FOOBAR
+
+test2:
+ @echo '-V "$${FOOBAR}"'
+ @${MAKE} -V '$${FOOBAR}'
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.status.1 b/usr.bin/bmake/tests/variables/opt_V/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.status.2 b/usr.bin/bmake/tests/variables/opt_V/expected.status.2
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.status.2
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.stderr.1 b/usr.bin/bmake/tests/variables/opt_V/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.stderr.1
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.stderr.2 b/usr.bin/bmake/tests/variables/opt_V/expected.stderr.2
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.stderr.2
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.stdout.1 b/usr.bin/bmake/tests/variables/opt_V/expected.stdout.1
new file mode 100644
index 000000000000..050db40eed2b
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.stdout.1
@@ -0,0 +1,2 @@
+-V FOOBAR
+foobar
diff --git a/usr.bin/bmake/tests/variables/opt_V/expected.stdout.2 b/usr.bin/bmake/tests/variables/opt_V/expected.stdout.2
new file mode 100644
index 000000000000..4da2aeffad3e
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/expected.stdout.2
@@ -0,0 +1,2 @@
+-V "${FOOBAR}"
+foobar
diff --git a/usr.bin/bmake/tests/variables/opt_V/legacy_test.sh b/usr.bin/bmake/tests/variables/opt_V/legacy_test.sh
new file mode 100644
index 000000000000..2522f6d7e9b1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/opt_V/legacy_test.sh
@@ -0,0 +1,11 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Variable expansion using command line '-V'"
+
+# Run
+TEST_N=2
+
+eval_cmd $*
diff --git a/usr.bin/bmake/tests/variables/t0/Makefile b/usr.bin/bmake/tests/variables/t0/Makefile
new file mode 100644
index 000000000000..7cf7bd7dac9a
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/Makefile
@@ -0,0 +1,12 @@
+PACKAGE= tests
+
+TESTSDIR= ${TESTSBASE}/usr.bin/bmake/variables/t0
+
+TAP_TESTS_SH= legacy_test
+
+${PACKAGE}FILES+= Makefile.test
+${PACKAGE}FILES+= expected.status.1
+${PACKAGE}FILES+= expected.stderr.1
+${PACKAGE}FILES+= expected.stdout.1
+
+.include <bsd.test.mk>
diff --git a/usr.bin/bmake/tests/variables/t0/Makefile.depend b/usr.bin/bmake/tests/variables/t0/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/bmake/tests/variables/t0/Makefile.test b/usr.bin/bmake/tests/variables/t0/Makefile.test
new file mode 100644
index 000000000000..222b7befa287
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/Makefile.test
@@ -0,0 +1,22 @@
+#
+# A unsorted set of macro expansions. This should be sorted out.
+#
+A = 0
+AV = 1
+test1:
+ @echo $A
+ @echo ${AV}
+ @echo ${A}
+ @# The following are soo broken why no syntax error?
+ @echo $(
+ @echo $)
+ @echo ${
+ @echo ${A
+ @echo ${A)
+ @echo ${A){
+ @echo ${AV
+ @echo ${AV)
+ @echo ${AV){
+ @echo ${AV{
+ @echo ${A{
+ @echo $}
diff --git a/usr.bin/bmake/tests/variables/t0/expected.status.1 b/usr.bin/bmake/tests/variables/t0/expected.status.1
new file mode 100644
index 000000000000..573541ac9702
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/expected.status.1
@@ -0,0 +1 @@
+0
diff --git a/usr.bin/bmake/tests/variables/t0/expected.stderr.1 b/usr.bin/bmake/tests/variables/t0/expected.stderr.1
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/expected.stderr.1
diff --git a/usr.bin/bmake/tests/variables/t0/expected.stdout.1 b/usr.bin/bmake/tests/variables/t0/expected.stdout.1
new file mode 100644
index 000000000000..e2c70dedf68f
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/expected.stdout.1
@@ -0,0 +1,15 @@
+0
+1
+0
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/usr.bin/bmake/tests/variables/t0/legacy_test.sh b/usr.bin/bmake/tests/variables/t0/legacy_test.sh
new file mode 100644
index 000000000000..99405f555116
--- /dev/null
+++ b/usr.bin/bmake/tests/variables/t0/legacy_test.sh
@@ -0,0 +1,8 @@
+#! /bin/sh
+
+. $(dirname $0)/../../common.sh
+
+# Description
+DESC="Variable expansion."
+
+eval_cmd $*