diff --git a/ChangeLog b/ChangeLog
index 3f82c8d0ae89..cb2532a2d832 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2012-08-31  Simon J. Gerraty  <sjg@bad.crufty.net>
+
+	* Makefile.in (MAKE_VERSION): bump version to 20120831
+	  Merge with NetBSD make, pick up
+	  o cast sizeof() to int for comparison
+	  o minor make.1 tweak
+
+2012-08-30  Simon J. Gerraty  <sjg@bad.crufty.net>
+
+	* Makefile.in (MAKE_VERSION): bump version to 20120830
+	  Merge with NetBSD make, pick up
+	  o .MAKE.EXPAND_VARIABLES knob can control default behavior of -V
+	  o debug flag -dV causes -V to show raw value regardless.
+	
+2012-07-05  Simon J. Gerraty  <sjg@bad.crufty.net>
+
+	* bsd.after-import.mk (after-import): ensure unit-tests/Makefile
+	  gets SRCTOP set.
+
 2012-07-04  Simon J. Gerraty  <sjg@bad.crufty.net>
 
 	* Makefile.in (MAKE_VERSION): bump version to 20120704
diff --git a/Makefile.in b/Makefile.in
index 5a1f00487299..42da6460515e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
 #	$NetBSD: Makefile,v 1.56 2012/05/30 21:54:23 sjg Exp $
 #	@(#)Makefile	5.2 (Berkeley) 12/28/90
 
-#	$Id: Makefile.in,v 1.168 2012/07/05 04:10:23 sjg Exp $
+#	$Id: Makefile.in,v 1.170 2012/08/31 06:46:22 sjg Exp $
 
 PROG=	bmake
 SRCS=	arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c main.c \
@@ -21,7 +21,7 @@ srcdir= @srcdir@
 CC?= @CC@
 
 # Base version on src date
-MAKE_VERSION= 20120704
+MAKE_VERSION= 20120831
 MACHINE=@machine@
 MACHINE_ARCH=@machine_arch@
 DEFAULT_SYS_PATH = @default_sys_path@
diff --git a/bmake.1 b/bmake.1
index 0bb377ae4967..bd670891f85d 100644
--- a/bmake.1
+++ b/bmake.1
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.204 2012/04/24 20:12:16 sjg Exp $
+.\"	$NetBSD: make.1,v 1.206 2012/08/30 22:35:37 wiz Exp $
 .\"
 .\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
 .\"
-.Dd April 24, 2012
+.Dd August 30, 2012
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -203,6 +203,10 @@ Print debugging information about makefile parsing.
 Print debugging information about suffix-transformation rules.
 .It Ar t
 Print debugging information about target list maintenance.
+.It Ar V
+Force the
+.Fl V
+option to print raw values of variables.
 .It Ar v
 Print debugging information about variable assignment.
 .It Ar x
@@ -675,6 +679,10 @@ and cannot be confused with the special target with the same name.
 Names the makefile (default
 .Ql Pa .depend )
 from which generated dependencies are read.
+.It Va .MAKE.EXPAND_VARIABLES
+A boolean that controls the default behavior of the
+.Fl V
+option.
 .It Va .MAKE.EXPORTED
 The list of variables exported by
 .Nm .
diff --git a/bmake.cat1 b/bmake.cat1
index 7624c43e6599..0c2e7f628d8c 100644
--- a/bmake.cat1
+++ b/bmake.cat1
@@ -118,6 +118,8 @@ DDEESSCCRRIIPPTTIIOONN
              _t       Print debugging information about target list mainte-
                      nance.
 
+             _V       Force the --VV option to print raw values of variables.
+
              _v       Print debugging information about variable assignment.
 
              _x       Run shell commands with --xx so the actual commands are
@@ -430,6 +432,1320 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
                      Names the makefile (default `_._d_e_p_e_n_d') from which gener-
                      ated dependencies are read.
 
+     _._M_A_K_E_._E_X_P_A_N_D___V_A_R_I_A_B_L_E_S
+                     A boolean that controls the default behavior of the --VV
+                     option.
+
+     _._M_A_K_E_._E_X_P_O_R_T_E_D  The list of variables exported by bbmmaakkee.
+
+     _._M_A_K_E_._J_O_B_S      The argument to the --jj option.
+
+     _._M_A_K_E_._J_O_B_._P_R_E_F_I_X
+                     If bbmmaakkee is run with _j then output for each target is
+                     prefixed with a token `--- target ---' the first part of
+                     which can be controlled via _._M_A_K_E_._J_O_B_._P_R_E_F_I_X.
+                     For example:
+                     .MAKE.JOB.PREFIX=${.newline}---${.MAKE:T}[${.MAKE.PID}]
+                     would produce tokens like `---make[1234] target ---' mak-
+                     ing it easier to track the degree of parallelism being
+                     achieved.
+
+     MAKEFLAGS       The environment variable `MAKEFLAGS' may contain anything
+                     that may be specified on bbmmaakkee's command line.  Anything
+                     specified on bbmmaakkee's command line is appended to the
+                     `MAKEFLAGS' variable which is then entered into the envi-
+                     ronment for all programs which bbmmaakkee executes.
+
+     _._M_A_K_E_._L_E_V_E_L     The recursion depth of bbmmaakkee.  The initial instance of
+                     bbmmaakkee will be 0, and an incremented value is put into the
+                     environment to be seen by the next generation.  This
+                     allows tests like: .if ${.MAKE.LEVEL} == 0 to protect
+                     things which should only be evaluated in the initial
+                     instance of bbmmaakkee.
+
+     _._M_A_K_E_._M_A_K_E_F_I_L_E___P_R_E_F_E_R_E_N_C_E
+                     The ordered list of makefile names (default `_m_a_k_e_f_i_l_e',
+                     `_M_a_k_e_f_i_l_e') that bbmmaakkee will look for.
+
+     _._M_A_K_E_._M_A_K_E_F_I_L_E_S
+                     The list of makefiles read by bbmmaakkee, which is useful for
+                     tracking dependencies.  Each makefile is recorded only
+                     once, regardless of the number of times read.
+
+     _._M_A_K_E_._M_O_D_E      Processed after reading all makefiles.  Can affect the
+                     mode that bbmmaakkee runs in.  It can contain a number of key-
+                     words:
+
+                     _c_o_m_p_a_t      Like --BB, puts bbmmaakkee into "compat" mode.
+
+                     _m_e_t_a        Puts bbmmaakkee into "meta" mode, where meta files
+                                 are created for each target to capture the
+                                 command run, the output generated and if
+                                 filemon(4) is available, the system calls
+                                 which are of interest to bbmmaakkee.  The captured
+                                 output can be very useful when diagnosing
+                                 errors.
+
+                     _c_u_r_d_i_r_O_k_= _b_f Normally bbmmaakkee will not create .meta files
+                                 in `_._C_U_R_D_I_R'.  This can be overridden by set-
+                                 ting _b_f to a value which represents True.
+
+                     _e_n_v         For debugging, it can be useful to inlcude
+                                 the environment in the .meta file.
+
+                     _v_e_r_b_o_s_e     If in "meta" mode, print a clue about the
+                                 target being built.  This is useful if the
+                                 build is otherwise running silently.  The
+                                 message printed the value of:
+                                 _._M_A_K_E_._M_E_T_A_._P_R_E_F_I_X.
+
+                     _i_g_n_o_r_e_-_c_m_d  Some makefiles have commands which are simply
+                                 not stable.  This keyword causes them to be
+                                 ignored for determining whether a target is
+                                 out of date in "meta" mode.  See also
+                                 ..NNOOMMEETTAA__CCMMPP.
+
+                     _s_i_l_e_n_t_= _b_f  If _b_f is True, when a .meta file is created,
+                                 mark the target ..SSIILLEENNTT.
+
+     _._M_A_K_E_._M_E_T_A_._B_A_I_L_I_W_I_C_K
+                     In "meta" mode, provides a list of prefixes which match
+                     the directories controlled by bbmmaakkee.  If a file that was
+                     generated outside of _._O_B_J_D_I_R but within said bailiwick is
+                     missing, the current target is considered out-of-date.
+
+     _._M_A_K_E_._M_E_T_A_._C_R_E_A_T_E_D
+                     In "meta" mode, this variable contains a list of all the
+                     meta files updated.  If not empty, it can be used to
+                     trigger processing of _._M_A_K_E_._M_E_T_A_._F_I_L_E_S.
+
+     _._M_A_K_E_._M_E_T_A_._F_I_L_E_S
+                     In "meta" mode, this variable contains a list of all the
+                     meta files used (updated or not).  This list can be used
+                     to process the meta files to extract dependency informa-
+                     tion.
+
+     _._M_A_K_E_._M_E_T_A_._P_R_E_F_I_X
+                     Defines the message printed for each meta file updated in
+                     "meta verbose" mode.  The default value is:
+                           Building ${.TARGET:H:tA}/${.TARGET:T}
+
+     _._M_A_K_E_O_V_E_R_R_I_D_E_S  This variable is used to record the names of variables
+                     assigned to on the command line, so that they may be
+                     exported as part of `MAKEFLAGS'.  This behaviour can be
+                     disabled by assigning an empty value to `_._M_A_K_E_O_V_E_R_R_I_D_E_S'
+                     within a makefile.  Extra variables can be exported from
+                     a makefile by appending their names to `_._M_A_K_E_O_V_E_R_R_I_D_E_S'.
+                     `MAKEFLAGS' is re-exported whenever `_._M_A_K_E_O_V_E_R_R_I_D_E_S' is
+                     modified.
+
+     _._M_A_K_E_._P_I_D       The process-id of bbmmaakkee.
+
+     _._M_A_K_E_._P_P_I_D      The parent process-id of bbmmaakkee.
+
+     _M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R
+                     When bbmmaakkee stops due to an error, it prints its name and
+                     the value of `_._C_U_R_D_I_R' as well as the value of any vari-
+                     ables named in `_M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R'.
+
+     _._n_e_w_l_i_n_e        This variable is simply assigned a newline character as
+                     its value.  This allows expansions using the ::@@ modifier
+                     to put a newline between iterations of the loop rather
+                     than a space.  For example, the printing of
+                     `_M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R' could be done as
+                     ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}.
+
+     _._O_B_J_D_I_R         A path to the directory where the targets are built.  Its
+                     value is determined by trying to chdir(2) to the follow-
+                     ing directories in order and using the first match:
+
+                     1.   ${MAKEOBJDIRPREFIX}${.CURDIR}
+
+                          (Only if `MAKEOBJDIRPREFIX' is set in the environ-
+                          ment or on the command line.)
+
+                     2.   ${MAKEOBJDIR}
+
+                          (Only if `MAKEOBJDIR' is set in the environment or
+                          on the command line.)
+
+                     3.   ${.CURDIR}_/_o_b_j_.${MACHINE}
+
+                     4.   ${.CURDIR}_/_o_b_j
+
+                     5.   _/_u_s_r_/_o_b_j_/${.CURDIR}
+
+                     6.   ${.CURDIR}
+
+                     Variable expansion is performed on the value before it's
+                     used, so expressions such as
+                           ${.CURDIR:S,^/usr/src,/var/obj,}
+                     may be used.  This is especially useful with
+                     `MAKEOBJDIR'.
+
+                     `_._O_B_J_D_I_R' may be modified in the makefile as a global
+                     variable.  In all cases, bbmmaakkee will chdir(2) to `_._O_B_J_D_I_R'
+                     and set `PWD' to that directory before executing any tar-
+                     gets.
+
+     _._P_A_R_S_E_D_I_R       A path to the directory of the current `_M_a_k_e_f_i_l_e' being
+                     parsed.
+
+     _._P_A_R_S_E_F_I_L_E      The basename of the current `_M_a_k_e_f_i_l_e' being parsed.
+                     This variable and `_._P_A_R_S_E_D_I_R' are both set only while the
+                     `_M_a_k_e_f_i_l_e_s' are being parsed.  If you want to retain
+                     their current values, assign them to a variable using
+                     assignment with expansion: (`::==').
+
+     _._P_A_T_H           A variable that represents the list of directories that
+                     bbmmaakkee will search for files.  The search list should be
+                     updated using the target `_._P_A_T_H' rather than the vari-
+                     able.
+
+     PWD             Alternate path to the current directory.  bbmmaakkee normally
+                     sets `_._C_U_R_D_I_R' to the canonical path given by getcwd(3).
+                     However, if the environment variable `PWD' is set and
+                     gives a path to the current directory, then bbmmaakkee sets
+                     `_._C_U_R_D_I_R' to the value of `PWD' instead.  This behaviour
+                     is disabled if `MAKEOBJDIRPREFIX' is set or `MAKEOBJDIR'
+                     contains a variable transform.  `PWD' is set to the value
+                     of `_._O_B_J_D_I_R' for all programs which bbmmaakkee executes.
+
+     .TARGETS        The list of targets explicitly specified on the command
+                     line, if any.
+
+     VPATH           Colon-separated (``:'') lists of directories that bbmmaakkee
+                     will search for files.  The variable is supported for
+                     compatibility with old make programs only, use `_._P_A_T_H'
+                     instead.
+
+   VVaarriiaabbllee mmooddiiffiieerrss
+     Variable expansion may be modified to select or modify each word of the
+     variable (where a ``word'' is white-space delimited sequence of charac-
+     ters).  The general format of a variable expansion is as follows:
+
+           ${variable[:modifier[:...]]}
+
+     Each modifier begins with a colon, which may be escaped with a backslash
+     (`\').
+
+     A set of modifiers can be specified via a variable, as follows:
+
+           modifier_variable=modifier[:...]
+           ${variable:${modifier_variable}[:...]}
+
+     In this case the first modifier in the modifier_variable does not start
+     with a colon, since that must appear in the referencing variable.  If any
+     of the modifiers in the modifier_variable contain a dollar sign (`$'),
+     these must be doubled to avoid early expansion.
+
+     The supported modifiers are:
+
+     ::EE   Replaces each word in the variable with its suffix.
+
+     ::HH   Replaces each word in the variable with everything but the last com-
+          ponent.
+
+     ::MM_p_a_t_t_e_r_n
+          Select only those words that match _p_a_t_t_e_r_n.  The standard shell
+          wildcard characters (`*', `?', and `[]') may be used.  The wildcard
+          characters may be escaped with a backslash (`\').
+
+     ::NN_p_a_t_t_e_r_n
+          This is identical to `::MM', but selects all words which do not match
+          _p_a_t_t_e_r_n.
+
+     ::OO   Order every word in variable alphabetically.  To sort words in
+          reverse order use the `::OO::[[--11....11]]' combination of modifiers.
+
+     ::OOxx  Randomize words in variable.  The results will be different each
+          time you are referring to the modified variable; use the assignment
+          with expansion (`::==') to prevent such behaviour.  For example,
+
+                LIST=                   uno due tre quattro
+                RANDOM_LIST=            ${LIST:Ox}
+                STATIC_RANDOM_LIST:=    ${LIST:Ox}
+
+                all:
+                        @echo "${RANDOM_LIST}"
+                        @echo "${RANDOM_LIST}"
+                        @echo "${STATIC_RANDOM_LIST}"
+                        @echo "${STATIC_RANDOM_LIST}"
+          may produce output similar to:
+
+                quattro due tre uno
+                tre due quattro uno
+                due uno quattro tre
+                due uno quattro tre
+
+     ::QQ   Quotes every shell meta-character in the variable, so that it can be
+          passed safely through recursive invocations of bbmmaakkee.
+
+     ::RR   Replaces each word in the variable with everything but its suffix.
+
+     ::ggmmttiimmee
+          The value is a format string for strftime(3), using the current
+          gmtime(3).
+
+     ::hhaasshh
+          Compute a 32bit hash of the value and encode it as hex digits.
+
+     ::llooccaallttiimmee
+          The value is a format string for strftime(3), using the current
+          localtime(3).
+
+     ::ttAA  Attempt to convert variable to an absolute path using realpath(3),
+          if that fails, the value is unchanged.
+
+     ::ttll  Converts variable to lower-case letters.
+
+     ::ttss_c
+          Words in the variable are normally separated by a space on expan-
+          sion.  This modifier sets the separator to the character _c.  If _c is
+          omitted, then no separator is used.  The common escapes (including
+          octal numeric codes), work as expected.
+
+     ::ttuu  Converts variable to upper-case letters.
+
+     ::ttWW  Causes the value to be treated as a single word (possibly containing
+          embedded white space).  See also `::[[**]]'.
+
+     ::ttww  Causes the value to be treated as a sequence of words delimited by
+          white space.  See also `::[[@@]]'.
+
+     ::SS/_o_l_d___s_t_r_i_n_g/_n_e_w___s_t_r_i_n_g/[11ggWW]
+          Modify the first occurrence of _o_l_d___s_t_r_i_n_g in the variable's value,
+          replacing it with _n_e_w___s_t_r_i_n_g.  If a `g' is appended to the last
+          slash of the pattern, all occurrences in each word are replaced.  If
+          a `1' is appended to the last slash of the pattern, only the first
+          word is affected.  If a `W' is appended to the last slash of the
+          pattern, then the value is treated as a single word (possibly con-
+          taining embedded white space).  If _o_l_d___s_t_r_i_n_g begins with a caret
+          (`^'), _o_l_d___s_t_r_i_n_g is anchored at the beginning of each word.  If
+          _o_l_d___s_t_r_i_n_g ends with a dollar sign (`$'), it is anchored at the end
+          of each word.  Inside _n_e_w___s_t_r_i_n_g, an ampersand (`&') is replaced by
+          _o_l_d___s_t_r_i_n_g (without any `^' or `$').  Any character may be used as a
+          delimiter for the parts of the modifier string.  The anchoring,
+          ampersand and delimiter characters may be escaped with a backslash
+          (`\').
+
+          Variable expansion occurs in the normal fashion inside both
+          _o_l_d___s_t_r_i_n_g and _n_e_w___s_t_r_i_n_g with the single exception that a backslash
+          is used to prevent the expansion of a dollar sign (`$'), not a pre-
+          ceding dollar sign as is usual.
+
+     ::CC/_p_a_t_t_e_r_n/_r_e_p_l_a_c_e_m_e_n_t/[11ggWW]
+          The ::CC modifier is just like the ::SS modifier except that the old and
+          new strings, instead of being simple strings, are a regular expres-
+          sion (see regex(3)) string _p_a_t_t_e_r_n and an ed(1)-style string
+          _r_e_p_l_a_c_e_m_e_n_t.  Normally, the first occurrence of the pattern _p_a_t_t_e_r_n
+          in each word of the value is substituted with _r_e_p_l_a_c_e_m_e_n_t.  The `1'
+          modifier causes the substitution to apply to at most one word; the
+          `g' modifier causes the substitution to apply to as many instances
+          of the search pattern _p_a_t_t_e_r_n as occur in the word or words it is
+          found in; the `W' modifier causes the value to be treated as a sin-
+          gle word (possibly containing embedded white space).  Note that `1'
+          and `g' are orthogonal; the former specifies whether multiple words
+          are potentially affected, the latter whether multiple substitutions
+          can potentially occur within each affected word.
+
+     ::TT   Replaces each word in the variable with its last component.
+
+     ::uu   Remove adjacent duplicate words (like uniq(1)).
+
+     ::??_t_r_u_e___s_t_r_i_n_g::_f_a_l_s_e___s_t_r_i_n_g
+          If the variable name (not its value), when parsed as a .if condi-
+          tional expression, evaluates to true, return as its value the
+          _t_r_u_e___s_t_r_i_n_g, otherwise return the _f_a_l_s_e___s_t_r_i_n_g.  Since the variable
+          name is used as the expression, :? must be the first modifier after
+          the variable name itself - which will, of course, usually contain
+          variable expansions.  A common error is trying to use expressions
+          like
+                ${NUMBERS:M42:?match:no}
+          which actually tests defined(NUMBERS), to determine is any words
+          match "42" you need to use something like:
+                ${"${NUMBERS:M42}" != "":?match:no}.
+
+     _:_o_l_d___s_t_r_i_n_g_=_n_e_w___s_t_r_i_n_g
+          This is the AT&T System V UNIX style variable substitution.  It must
+          be the last modifier specified.  If _o_l_d___s_t_r_i_n_g or _n_e_w___s_t_r_i_n_g do not
+          contain the pattern matching character _% then it is assumed that
+          they are anchored at the end of each word, so only suffixes or
+          entire words may be replaced.  Otherwise _% is the substring of
+          _o_l_d___s_t_r_i_n_g to be replaced in _n_e_w___s_t_r_i_n_g.
+
+          Variable expansion occurs in the normal fashion inside both
+          _o_l_d___s_t_r_i_n_g and _n_e_w___s_t_r_i_n_g with the single exception that a backslash
+          is used to prevent the expansion of a dollar sign (`$'), not a pre-
+          ceding dollar sign as is usual.
+
+     ::@@_t_e_m_p@@_s_t_r_i_n_g@@
+          This is the loop expansion mechanism from the OSF Development Envi-
+          ronment (ODE) make.  Unlike ..ffoorr loops expansion occurs at the time
+          of reference.  Assign _t_e_m_p to each word in the variable and evaluate
+          _s_t_r_i_n_g.  The ODE convention is that _t_e_m_p should start and end with a
+          period.  For example.
+                ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
+
+          However a single character varaiable is often more readable:
+                ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
+
+     ::UU_n_e_w_v_a_l
+          If the variable is undefined _n_e_w_v_a_l is the value.  If the variable
+          is defined, the existing value is returned.  This is another ODE
+          make feature.  It is handy for setting per-target CFLAGS for
+          instance:
+                ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
+          If a value is only required if the variable is undefined, use:
+                ${VAR:D:Unewval}
+
+     ::DD_n_e_w_v_a_l
+          If the variable is defined _n_e_w_v_a_l is the value.
+
+     ::LL   The name of the variable is the value.
+
+     ::PP   The path of the node which has the same name as the variable is the
+          value.  If no such node exists or its path is null, then the name of
+          the variable is used.  In order for this modifier to work, the name
+          (node) must at least have appeared on the rhs of a dependency.
+
+     ::!!_c_m_d!!
+          The output of running _c_m_d is the value.
+
+     ::sshh  If the variable is non-empty it is run as a command and the output
+          becomes the new value.
+
+     ::::==_s_t_r
+          The variable is assigned the value _s_t_r after substitution.  This
+          modifier and its variations are useful in obscure situations such as
+          wanting to set a variable when shell commands are being parsed.
+          These assignment modifiers always expand to nothing, so if appearing
+          in a rule line by themselves should be preceded with something to
+          keep bbmmaakkee happy.
+
+          The `::::' helps avoid false matches with the AT&T System V UNIX style
+          ::== modifier and since substitution always occurs the ::::== form is
+          vaguely appropriate.
+
+     ::::??==_s_t_r
+          As for ::::== but only if the variable does not already have a value.
+
+     ::::++==_s_t_r
+          Append _s_t_r to the variable.
+
+     ::::!!==_c_m_d
+          Assign the output of _c_m_d to the variable.
+
+     ::[[_r_a_n_g_e]]
+          Selects one or more words from the value, or performs other opera-
+          tions related to the way in which the value is divided into words.
+
+          Ordinarily, a value is treated as a sequence of words delimited by
+          white space.  Some modifiers suppress this behaviour, causing a
+          value to be treated as a single word (possibly containing embedded
+          white space).  An empty value, or a value that consists entirely of
+          white-space, is treated as a single word.  For the purposes of the
+          `::[[]]' modifier, the words are indexed both forwards using positive
+          integers (where index 1 represents the first word), and backwards
+          using negative integers (where index -1 represents the last word).
+
+          The _r_a_n_g_e is subjected to variable expansion, and the expanded
+          result is then interpreted as follows:
+
+          _i_n_d_e_x  Selects a single word from the value.
+
+          _s_t_a_r_t...._e_n_d
+                 Selects all words from _s_t_a_r_t to _e_n_d, inclusive.  For example,
+                 `::[[22....--11]]' selects all words from the second word to the last
+                 word.  If _s_t_a_r_t is greater than _e_n_d, then the words are out-
+                 put in reverse order.  For example, `::[[--11....11]]' selects all
+                 the words from last to first.
+
+          **      Causes subsequent modifiers to treat the value as a single
+                 word (possibly containing embedded white space).  Analogous
+                 to the effect of "$*" in Bourne shell.
+
+          0      Means the same as `::[[**]]'.
+
+          @@      Causes subsequent modifiers to treat the value as a sequence
+                 of words delimited by white space.  Analogous to the effect
+                 of "$@" in Bourne shell.
+
+          ##      Returns the number of words in the value.
+
+IINNCCLLUUDDEE SSTTAATTEEMMEENNTTSS,, CCOONNDDIITTIIOONNAALLSS AANNDD FFOORR LLOOOOPPSS
+     Makefile inclusion, conditional structures and for loops  reminiscent of
+     the C programming language are provided in bbmmaakkee.  All such structures
+     are identified by a line beginning with a single dot (`.') character.
+     Files are included with either ..iinncclluuddee <_f_i_l_e> or ..iinncclluuddee "_f_i_l_e".  Vari-
+     ables between the angle brackets or double quotes are expanded to form
+     the file name.  If angle brackets are used, the included makefile is
+     expected to be in the system makefile directory.  If double quotes are
+     used, the including makefile's directory and any directories specified
+     using the --II option are searched before the system makefile directory.
+     For compatibility with other versions of bbmmaakkee `include file ...' is also
+     accepted.  If the include statement is written as ..--iinncclluuddee or as
+     ..ssiinncclluuddee then errors locating and/or opening include files are ignored.
+
+     Conditional expressions are also preceded by a single dot as the first
+     character of a line.  The possible conditionals are as follows:
+
+     ..eerrrroorr _m_e_s_s_a_g_e
+             The message is printed along with the name of the makefile and
+             line number, then bbmmaakkee will exit.
+
+     ..eexxppoorrtt _v_a_r_i_a_b_l_e _._._.
+             Export the specified global variable.  If no variable list is
+             provided, all globals are exported except for internal variables
+             (those that start with `.').  This is not affected by the --XX
+             flag, so should be used with caution.  For compatibility with
+             other bbmmaakkee programs `export variable=value' is also accepted.
+
+             Appending a variable name to _._M_A_K_E_._E_X_P_O_R_T_E_D is equivalent to
+             exporting a variable.
+
+     ..eexxppoorrtt--eennvv _v_a_r_i_a_b_l_e _._._.
+             The same as `.export', except that the variable is not appended
+             to _._M_A_K_E_._E_X_P_O_R_T_E_D.  This allows exporting a value to the environ-
+             ment which is different from that used by bbmmaakkee internally.
+
+     ..iinnffoo _m_e_s_s_a_g_e
+             The message is printed along with the name of the makefile and
+             line number.
+
+     ..uunnddeeff _v_a_r_i_a_b_l_e
+             Un-define the specified global variable.  Only global variables
+             may be un-defined.
+
+     ..uunneexxppoorrtt _v_a_r_i_a_b_l_e _._._.
+             The opposite of `.export'.  The specified global _v_a_r_i_a_b_l_e will be
+             removed from _._M_A_K_E_._E_X_P_O_R_T_E_D.  If no variable list is provided,
+             all globals are unexported, and _._M_A_K_E_._E_X_P_O_R_T_E_D deleted.
+
+     ..uunneexxppoorrtt--eennvv
+             Unexport all globals previously exported and clear the environ-
+             ment inherited from the parent.  This operation will cause a mem-
+             ory leak of the original environment, so should be used spar-
+             ingly.  Testing for _._M_A_K_E_._L_E_V_E_L being 0, would make sense.  Also
+             note that any variables which originated in the parent environ-
+             ment should be explicitly preserved if desired.  For example:
+
+                   .if ${.MAKE.LEVEL} == 0
+                   PATH := ${PATH}
+                   .unexport-env
+                   .export PATH
+                   .endif
+
+             Would result in an environment containing only `PATH', which is
+             the minimal useful environment.  Actually `.MAKE.LEVEL' will also
+             be pushed into the new environment.
+
+     ..wwaarrnniinngg _m_e_s_s_a_g_e
+             The message prefixed by `_w_a_r_n_i_n_g_:' is printed along with the name
+             of the makefile and line number.
+
+     ..iiff [!]_e_x_p_r_e_s_s_i_o_n [_o_p_e_r_a_t_o_r _e_x_p_r_e_s_s_i_o_n _._._.]
+             Test the value of an expression.
+
+     ..iiffddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.]
+             Test the value of a variable.
+
+     ..iiffnnddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.]
+             Test the value of a variable.
+
+     ..iiffmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.]
+             Test the target being built.
+
+     ..iiffnnmmaakkee [!] _t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.]
+             Test the target being built.
+
+     ..eellssee   Reverse the sense of the last conditional.
+
+     ..eelliiff [!] _e_x_p_r_e_s_s_i_o_n [_o_p_e_r_a_t_o_r _e_x_p_r_e_s_s_i_o_n _._._.]
+             A combination of `..eellssee' followed by `..iiff'.
+
+     ..eelliiffddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.]
+             A combination of `..eellssee' followed by `..iiffddeeff'.
+
+     ..eelliiffnnddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.]
+             A combination of `..eellssee' followed by `..iiffnnddeeff'.
+
+     ..eelliiffmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.]
+             A combination of `..eellssee' followed by `..iiffmmaakkee'.
+
+     ..eelliiffnnmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.]
+             A combination of `..eellssee' followed by `..iiffnnmmaakkee'.
+
+     ..eennddiiff  End the body of the conditional.
+
+     The _o_p_e_r_a_t_o_r may be any one of the following:
+
+     ||||     Logical OR.
+
+     &&&&     Logical AND; of higher precedence than ``||''.
+
+     As in C, bbmmaakkee will only evaluate a conditional as far as is necessary to
+     determine its value.  Parentheses may be used to change the order of
+     evaluation.  The boolean operator `!!' may be used to logically negate an
+     entire conditional.  It is of higher precedence than `&&&&'.
+
+     The value of _e_x_p_r_e_s_s_i_o_n may be any of the following:
+
+     ddeeffiinneedd  Takes a variable name as an argument and evaluates to true if
+              the variable has been defined.
+
+     mmaakkee     Takes a target name as an argument and evaluates to true if the
+              target was specified as part of bbmmaakkee's command line or was
+              declared the default target (either implicitly or explicitly,
+              see _._M_A_I_N) before the line containing the conditional.
+
+     eemmppttyy    Takes a variable, with possible modifiers, and evaluates to true
+              if the expansion of the variable would result in an empty
+              string.
+
+     eexxiissttss   Takes a file name as an argument and evaluates to true if the
+              file exists.  The file is searched for on the system search path
+              (see _._P_A_T_H).
+
+     ttaarrggeett   Takes a target name as an argument and evaluates to true if the
+              target has been defined.
+
+     ccoommmmaannddss
+              Takes a target name as an argument and evaluates to true if the
+              target has been defined and has commands associated with it.
+
+     _E_x_p_r_e_s_s_i_o_n may also be an arithmetic or string comparison.  Variable
+     expansion is performed on both sides of the comparison, after which the
+     integral values are compared.  A value is interpreted as hexadecimal if
+     it is preceded by 0x, otherwise it is decimal; octal numbers are not sup-
+     ported.  The standard C relational operators are all supported.  If after
+     variable expansion, either the left or right hand side of a `====' or `!!=='
+     operator is not an integral value, then string comparison is performed
+     between the expanded variables.  If no relational operator is given, it
+     is assumed that the expanded variable is being compared against 0 or an
+     empty string in the case of a string comparison.
+
+     When bbmmaakkee is evaluating one of these conditional expressions, and it
+     encounters a (white-space separated) word it doesn't recognize, either
+     the ``make'' or ``defined'' expression is applied to it, depending on the
+     form of the conditional.  If the form is `..iiffddeeff', `..iiffnnddeeff', or `..iiff'
+     the ``defined'' expression is applied.  Similarly, if the form is
+     `..iiffmmaakkee' or `..iiffnnmmaakkee, tthhee' ``make'' expression is applied.
+
+     If the conditional evaluates to true the parsing of the makefile contin-
+     ues as before.  If it evaluates to false, the following lines are
+     skipped.  In both cases this continues until a `..eellssee' or `..eennddiiff' is
+     found.
+
+     For loops are typically used to apply a set of rules to a list of files.
+     The syntax of a for loop is:
+
+     ..ffoorr _v_a_r_i_a_b_l_e [_v_a_r_i_a_b_l_e _._._.] iinn _e_x_p_r_e_s_s_i_o_n
+     <make-rules>
+     ..eennddffoorr
+
+     After the for eexxpprreessssiioonn is evaluated, it is split into words.  On each
+     iteration of the loop, one word is taken and assigned to each vvaarriiaabbllee,
+     in order, and these vvaarriiaabblleess are substituted into the mmaakkee--rruulleess inside
+     the body of the for loop.  The number of words must come out even; that
+     is, if there are three iteration variables, the number of words provided
+     must be a multiple of three.
+
+CCOOMMMMEENNTTSS
+     Comments begin with a hash (`#') character, anywhere but in a shell com-
+     mand line, and continue to the end of an unescaped new line.
+
+SSPPEECCIIAALL SSOOUURRCCEESS ((AATTTTRRIIBBUUTTEESS))
+     ..EEXXEECC     Target is never out of date, but always execute commands any-
+               way.
+
+     ..IIGGNNOORREE   Ignore any errors from the commands associated with this tar-
+               get, exactly as if they all were preceded by a dash (`-').
+
+     ..MMAADDEE     Mark all sources of this target as being up-to-date.
+
+     ..MMAAKKEE     Execute the commands associated with this target even if the --nn
+               or --tt options were specified.  Normally used to mark recursive
+               bbmmaakkee's.
+
+     ..MMEETTAA     Create a meta file for the target, even if it is flagged as
+               ..PPHHOONNYY, ..MMAAKKEE, or ..SSPPEECCIIAALL.  Usage in conjunction with ..MMAAKKEE is
+               the most likely case.  In "meta" mode, the target is out-of-
+               date if the meta file is missing.
+
+     ..NNOOMMEETTAA   Do not create a meta file for the target.  Meta files are also
+               not created for ..PPHHOONNYY, ..MMAAKKEE, or ..SSPPEECCIIAALL targets.
+
+     ..NNOOMMEETTAA__CCMMPP
+               Ignore differences in commands when deciding if target is out
+               of date.  This is useful if the command contains a value which
+               always changes.  If the number of commands change, though, the
+               target will still be out of date.
+
+     ..NNOOPPAATTHH   Do not search for the target in the directories specified by
+               ..PPAATTHH.
+
+     ..NNOOTTMMAAIINN  Normally bbmmaakkee selects the first target it encounters as the
+               default target to be built if no target was specified.  This
+               source prevents this target from being selected.
+
+     ..OOPPTTIIOONNAALL
+               If a target is marked with this attribute and bbmmaakkee can't fig-
+               ure out how to create it, it will ignore this fact and assume
+               the file isn't needed or already exists.
+
+     ..PPHHOONNYY    The target does not correspond to an actual file; it is always
+               considered to be out of date, and will not be created with the
+               --tt option.  Suffix-transformation rules are not applied to
+               ..PPHHOONNYY targets.
+
+     ..PPRREECCIIOOUUSS
+               When bbmmaakkee is interrupted, it normally removes any partially
+               made targets.  This source prevents the target from being
+               removed.
+
+     ..RREECCUURRSSIIVVEE
+               Synonym for ..MMAAKKEE.
+
+     ..SSIILLEENNTT   Do not echo any of the commands associated with this target,
+               exactly as if they all were preceded by an at sign (`@').
+
+     ..UUSSEE      Turn the target into bbmmaakkee's version of a macro.  When the tar-
+               get is used as a source for another target, the other target
+               acquires the commands, sources, and attributes (except for
+               ..UUSSEE) of the source.  If the target already has commands, the
+               ..UUSSEE target's commands are appended to them.
+
+     ..UUSSEEBBEEFFOORREE
+               Exactly like ..UUSSEE, but prepend the ..UUSSEEBBEEFFOORREE target commands
+               to the target.
+
+     ..WWAAIITT     If ..WWAAIITT appears in a dependency line, the sources that precede
+               it are made before the sources that succeed it in the line.
+               Since the dependents of files are not made until the file
+               itself could be made, this also stops the dependents being
+               built unless they are needed for another branch of the depen-
+               dency tree.  So given:
+
+               x: a .WAIT b
+                       echo x
+               a:
+                       echo a
+               b: b1
+                       echo b
+               b1:
+                       echo b1
+
+               the output is always `a', `b1', `b', `x'.
+               The ordering imposed by ..WWAAIITT is only relevant for parallel
+               makes.
+
+SSPPEECCIIAALL TTAARRGGEETTSS
+     Special targets may not be included with other targets, i.e. they must be
+     the only target specified.
+
+     ..BBEEGGIINN   Any command lines attached to this target are executed before
+              anything else is done.
+
+     ..DDEEFFAAUULLTT
+              This is sort of a ..UUSSEE rule for any target (that was used only
+              as a source) that bbmmaakkee can't figure out any other way to cre-
+              ate.  Only the shell script is used.  The ..IIMMPPSSRRCC variable of a
+              target that inherits ..DDEEFFAAUULLTT's commands is set to the target's
+              own name.
+
+     ..EENNDD     Any command lines attached to this target are executed after
+              everything else is done.
+
+     ..EERRRROORR   Any command lines attached to this target are executed when
+              another target fails.  The ..EERRRROORR__TTAARRGGEETT variable is set to the
+              target that failed.  See also MMAAKKEE__PPRRIINNTT__VVAARR__OONN__EERRRROORR.
+
+     ..IIGGNNOORREE  Mark each of the sources with the ..IIGGNNOORREE attribute.  If no
+              sources are specified, this is the equivalent of specifying the
+              --ii option.
+
+     ..IINNTTEERRRRUUPPTT
+              If bbmmaakkee is interrupted, the commands for this target will be
+              executed.
+
+     ..MMAAIINN    If no target is specified when bbmmaakkee is invoked, this target
+              will be built.
+
+     ..MMAAKKEEFFLLAAGGSS
+              This target provides a way to specify flags for bbmmaakkee when the
+              makefile is used.  The flags are as if typed to the shell,
+              though the --ff option will have no effect.
+
+     ..NNOOPPAATTHH  Apply the ..NNOOPPAATTHH attribute to any specified sources.
+
+     ..NNOOTTPPAARRAALLLLEELL
+              Disable parallel mode.
+
+     ..NNOO__PPAARRAALLLLEELL
+              Synonym for ..NNOOTTPPAARRAALLLLEELL, for compatibility with other pmake
+              variants.
+
+     ..OORRDDEERR   The named targets are made in sequence.  This ordering does not
+              add targets to the list of targets to be made.  Since the depen-
+              dents of a target do not get built until the target itself could
+              be built, unless `a' is built by another part of the dependency
+              graph, the following is a dependency loop:
+
+              .ORDER: b a
+              b: a
+
+              The ordering imposed by ..OORRDDEERR is only relevant for parallel
+              makes.
+
+     ..PPAATTHH    The sources are directories which are to be searched for files
+              not found in the current directory.  If no sources are speci-
+              fied, any previously specified directories are deleted.  If the
+              source is the special ..DDOOTTLLAASSTT target, then the current working
+              directory is searched last.
+
+     ..PPHHOONNYY   Apply the ..PPHHOONNYY attribute to any specified sources.
+
+     ..PPRREECCIIOOUUSS
+              Apply the ..PPRREECCIIOOUUSS attribute to any specified sources.  If no
+              sources are specified, the ..PPRREECCIIOOUUSS attribute is applied to
+              every target in the file.
+
+     ..SSHHEELLLL   Sets the shell that bbmmaakkee will use to execute commands.  The
+              sources are a set of _f_i_e_l_d_=_v_a_l_u_e pairs.
+
+              _n_a_m_e        This is the minimal specification, used to select
+                          one of the builtin shell specs; _s_h, _k_s_h, and _c_s_h.
+
+              _p_a_t_h        Specifies the path to the shell.
+
+              _h_a_s_E_r_r_C_t_l   Indicates whether the shell supports exit on error.
+
+              _c_h_e_c_k       The command to turn on error checking.
+
+              _i_g_n_o_r_e      The command to disable error checking.
+
+              _e_c_h_o        The command to turn on echoing of commands executed.
+
+              _q_u_i_e_t       The command to turn off echoing of commands exe-
+                          cuted.
+
+              _f_i_l_t_e_r      The output to filter after issuing the _q_u_i_e_t com-
+                          mand.  It is typically identical to _q_u_i_e_t.
+
+              _e_r_r_F_l_a_g     The flag to pass the shell to enable error checking.
+
+              _e_c_h_o_F_l_a_g    The flag to pass the shell to enable command echo-
+                          ing.
+
+              _n_e_w_l_i_n_e     The string literal to pass the shell that results in
+                          a single newline character when used outside of any
+                          quoting characters.
+              Example:
+
+              .SHELL: name=ksh path=/bin/ksh hasErrCtl=true \
+                      check="set -e" ignore="set +e" \
+                      echo="set -v" quiet="set +v" filter="set +v" \
+                      echoFlag=v errFlag=e newline="'\n'"
+
+     ..SSIILLEENNTT  Apply the ..SSIILLEENNTT attribute to any specified sources.  If no
+              sources are specified, the ..SSIILLEENNTT attribute is applied to every
+              command in the file.
+
+     ..SSUUFFFFIIXXEESS
+              Each source specifies a suffix to bbmmaakkee.  If no sources are
+              specified, any previously specified suffixes are deleted.  It
+              allows the creation of suffix-transformation rules.
+
+              Example:
+
+              .SUFFIXES: .o
+              .c.o:
+                      cc -o ${.TARGET} -c ${.IMPSRC}
+
+EENNVVIIRROONNMMEENNTT
+     bbmmaakkee uses the following environment variables, if they exist: MACHINE,
+     MACHINE_ARCH, MAKE, MAKEFLAGS, MAKEOBJDIR, MAKEOBJDIRPREFIX, MAKESYSPATH,
+     PWD, and TMPDIR.
+
+     MAKEOBJDIRPREFIX and MAKEOBJDIR may only be set in the environment or on
+     the command line to bbmmaakkee and not as makefile variables; see the descrip-
+     tion of `_._O_B_J_D_I_R' for more details.
+
+FFIILLEESS
+     .depend        list of dependencies
+     Makefile       list of dependencies
+     makefile       list of dependencies
+     sys.mk         system makefile
+     /usr/share/mk  system makefile directory
+
+CCOOMMPPAATTIIBBIILLIITTYY
+     The basic make syntax is compatible between different versions of make,
+     however the special variables, variable modifiers and conditionals are
+     not.
+
+     The way that parallel makes are scheduled changed in NetBSD 4.0 so that
+     .ORDER and .WAIT apply recursively to the dependent nodes.  The algo-
+     rithms used may change again in the future.
+
+     The way that .for loop variables are substituted changed after NetBSD 5.0
+     so that they still appear to be variable expansions.  In particular this
+     stops them being treated as syntax, and removes some obscure problems
+     using them in .if statements.
+
+     Unlike other bbmmaakkee programs, this implementation by default executes all
+     commands for a given target using a single shell invocation.  This is
+     done for both efficiency and to simplify error handling in remote command
+     invocations.  Typically this is transparent to the user, unless the tar-
+     get commands change the current working directory using ``cd'' or
+     ``chdir''.  To be compatible with Makefiles that do this, one can use --BB
+     to disable this behavior.
+
+SSEEEE AALLSSOO
+     mkdep(1)
+
+HHIISSTTOORRYY
+     bbmmaakkee is derived from NetBSD make(1).  It uses autoconf to facilitate
+MAKE(1)                 NetBSD General Commands Manual                 MAKE(1)
+
+     portability to other platforms.
+
+NNAAMMEE
+     bbmmaakkee -- maintain program dependencies
+
+SSYYNNOOPPSSIISS
+     bbmmaakkee [--BBeeiikkNNnnqqrrssttWWXX] [--CC _d_i_r_e_c_t_o_r_y] [--DD _v_a_r_i_a_b_l_e] [--dd _f_l_a_g_s]
+           [--ff _m_a_k_e_f_i_l_e] [--II _d_i_r_e_c_t_o_r_y] [--JJ _p_r_i_v_a_t_e] [--jj _m_a_x___j_o_b_s]
+           [--mm _d_i_r_e_c_t_o_r_y] [--TT _f_i_l_e] [--VV _v_a_r_i_a_b_l_e] [_v_a_r_i_a_b_l_e_=_v_a_l_u_e]
+           [_t_a_r_g_e_t _._._.]
+
+DDEESSCCRRIIPPTTIIOONN
+     bbmmaakkee is a program designed to simplify the maintenance of other pro-
+     grams.  Its input is a list of specifications as to the files upon which
+     programs and other files depend.  If no --ff _m_a_k_e_f_i_l_e makefile option is
+     given, bbmmaakkee will try to open `_m_a_k_e_f_i_l_e' then `_M_a_k_e_f_i_l_e' in order to find
+     the specifications.  If the file `_._d_e_p_e_n_d' exists, it is read (see
+     mkdep(1)).
+
+     This manual page is intended as a reference document only.  For a more
+     thorough description of bbmmaakkee and makefiles, please refer to _P_M_a_k_e _- _A
+     _T_u_t_o_r_i_a_l.
+
+     bbmmaakkee will prepend the contents of the _M_A_K_E_F_L_A_G_S environment variable to
+     the command line arguments before parsing them.
+
+     The options are as follows:
+
+     --BB      Try to be backwards compatible by executing a single shell per
+             command and by executing the commands to make the sources of a
+             dependency line in sequence.
+
+     --CC _d_i_r_e_c_t_o_r_y
+             Change to _d_i_r_e_c_t_o_r_y before reading the makefiles or doing any-
+             thing else.  If multiple --CC options are specified, each is inter-
+             preted relative to the previous one: --CC _/ --CC _e_t_c is equivalent to
+             --CC _/_e_t_c.
+
+     --DD _v_a_r_i_a_b_l_e
+             Define _v_a_r_i_a_b_l_e to be 1, in the global context.
+
+     --dd _[_-_]_f_l_a_g_s
+             Turn on debugging, and specify which portions of bbmmaakkee are to
+             print debugging information.  Unless the flags are preceded by
+             `-' they are added to the _M_A_K_E_F_L_A_G_S environment variable and will
+             be processed by any child make processes.  By default, debugging
+             information is printed to standard error, but this can be changed
+             using the _F debugging flag.  The debugging output is always
+             unbuffered; in addition, if debugging is enabled but debugging
+             output is not directed to standard output, then the standard out-
+             put is line buffered.  _F_l_a_g_s is one or more of the following:
+
+             _A       Print all possible debugging information; equivalent to
+                     specifying all of the debugging flags.
+
+             _a       Print debugging information about archive searching and
+                     caching.
+
+             _C       Print debugging information about current working direc-
+                     tory.
+
+             _c       Print debugging information about conditional evaluation.
+
+             _d       Print debugging information about directory searching and
+                     caching.
+
+             _e       Print debugging information about failed commands and
+                     targets.
+
+             _F[++]_f_i_l_e_n_a_m_e
+                     Specify where debugging output is written.  This must be
+                     the last flag, because it consumes the remainder of the
+                     argument.  If the character immediately after the `F'
+                     flag is `+', then the file will be opened in append mode;
+                     otherwise the file will be overwritten.  If the file name
+                     is `stdout' or `stderr' then debugging output will be
+                     written to the standard output or standard error output
+                     file descriptors respectively (and the `+' option has no
+                     effect).  Otherwise, the output will be written to the
+                     named file.  If the file name ends `.%d' then the `%d' is
+                     replaced by the pid.
+
+             _f       Print debugging information about loop evaluation.
+
+             _g_1      Print the input graph before making anything.
+
+             _g_2      Print the input graph after making everything, or before
+                     exiting on error.
+
+             _g_3      Print the input graph before exiting on error.
+
+             _j       Print debugging information about running multiple
+                     shells.
+
+             _l       Print commands in Makefiles regardless of whether or not
+                     they are prefixed by `@' or other "quiet" flags.  Also
+                     known as "loud" behavior.
+
+             _M       Print debugging information about "meta" mode decisions
+                     about targets.
+
+             _m       Print debugging information about making targets, includ-
+                     ing modification dates.
+
+             _n       Don't delete the temporary command scripts created when
+                     running commands.  These temporary scripts are created in
+                     the directory referred to by the TMPDIR environment vari-
+                     able, or in _/_t_m_p if TMPDIR is unset or set to the empty
+                     string.  The temporary scripts are created by mkstemp(3),
+                     and have names of the form _m_a_k_e_X_X_X_X_X_X.  _N_O_T_E: This can
+                     create many files in TMPDIR or _/_t_m_p, so use with care.
+
+             _p       Print debugging information about makefile parsing.
+
+             _s       Print debugging information about suffix-transformation
+                     rules.
+
+             _t       Print debugging information about target list mainte-
+                     nance.
+
+             _V       Force the --VV option to print raw value of variables.
+
+             _v       Print debugging information about variable assignment.
+
+             _x       Run shell commands with --xx so the actual commands are
+                     printed as they are executed.
+
+     --ee      Specify that environment variables override macro assignments
+             within makefiles.
+
+     --ff _m_a_k_e_f_i_l_e
+             Specify a makefile to read instead of the default `_m_a_k_e_f_i_l_e'.  If
+             _m_a_k_e_f_i_l_e is `--', standard input is read.  Multiple makefiles may
+             be specified, and are read in the order specified.
+
+     --II _d_i_r_e_c_t_o_r_y
+             Specify a directory in which to search for makefiles and included
+             makefiles.  The system makefile directory (or directories, see
+             the --mm option) is automatically included as part of this list.
+
+     --ii      Ignore non-zero exit of shell commands in the makefile.  Equiva-
+             lent to specifying `--' before each command line in the makefile.
+
+     --JJ _p_r_i_v_a_t_e
+             This option should _n_o_t be specified by the user.
+
+             When the _j option is in use in a recursive build, this option is
+             passed by a make to child makes to allow all the make processes
+             in the build to cooperate to avoid overloading the system.
+
+     --jj _m_a_x___j_o_b_s
+             Specify the maximum number of jobs that bbmmaakkee may have running at
+             any one time.  The value is saved in _._M_A_K_E_._J_O_B_S.  Turns compati-
+             bility mode off, unless the _B flag is also specified.  When com-
+             patibility mode is off, all commands associated with a target are
+             executed in a single shell invocation as opposed to the tradi-
+             tional one shell invocation per line.  This can break traditional
+             scripts which change directories on each command invocation and
+             then expect to start with a fresh environment on the next line.
+             It is more efficient to correct the scripts rather than turn
+             backwards compatibility on.
+
+     --kk      Continue processing after errors are encountered, but only on
+             those targets that do not depend on the target whose creation
+             caused the error.
+
+     --mm _d_i_r_e_c_t_o_r_y
+             Specify a directory in which to search for sys.mk and makefiles
+             included via the <_f_i_l_e>-style include statement.  The --mm option
+             can be used multiple times to form a search path.  This path will
+             override the default system include path: /usr/share/mk.  Fur-
+             thermore the system include path will be appended to the search
+             path used for "_f_i_l_e"-style include statements (see the --II
+             option).
+
+             If a file or directory name in the --mm argument (or the
+             MAKESYSPATH environment variable) starts with the string ".../"
+             then bbmmaakkee will search for the specified file or directory named
+             in the remaining part of the argument string.  The search starts
+             with the current directory of the Makefile and then works upward
+             towards the root of the filesystem.  If the search is successful,
+             then the resulting directory replaces the ".../" specification in
+             the --mm argument.  If used, this feature allows bbmmaakkee to easily
+             search in the current source tree for customized sys.mk files
+             (e.g., by using ".../mk/sys.mk" as an argument).
+
+     --nn      Display the commands that would have been executed, but do not
+             actually execute them unless the target depends on the .MAKE spe-
+             cial source (see below).
+
+     --NN      Display the commands which would have been executed, but do not
+             actually execute any of them; useful for debugging top-level
+             makefiles without descending into subdirectories.
+
+     --qq      Do not execute any commands, but exit 0 if the specified targets
+             are up-to-date and 1, otherwise.
+
+     --rr      Do not use the built-in rules specified in the system makefile.
+
+     --ss      Do not echo any commands as they are executed.  Equivalent to
+             specifying `@@' before each command line in the makefile.
+
+     --TT _t_r_a_c_e_f_i_l_e
+             When used with the --jj flag, append a trace record to _t_r_a_c_e_f_i_l_e
+             for each job started and completed.
+
+     --tt      Rather than re-building a target as specified in the makefile,
+             create it or update its modification time to make it appear up-
+             to-date.
+
+     --VV _v_a_r_i_a_b_l_e
+             Print bbmmaakkee's idea of the value of _v_a_r_i_a_b_l_e, in the global con-
+             text.  Do not build any targets.  Multiple instances of this
+             option may be specified; the variables will be printed one per
+             line, with a blank line for each null or undefined variable.  If
+             _v_a_r_i_a_b_l_e contains a `$' then the value will be expanded before
+             printing.
+
+     --WW      Treat any warnings during makefile parsing as errors.
+
+     --XX      Don't export variables passed on the command line to the environ-
+             ment individually.  Variables passed on the command line are
+             still exported via the _M_A_K_E_F_L_A_G_S environment variable.  This
+             option may be useful on systems which have a small limit on the
+             size of command arguments.
+
+     _v_a_r_i_a_b_l_e_=_v_a_l_u_e
+             Set the value of the variable _v_a_r_i_a_b_l_e to _v_a_l_u_e.  Normally, all
+             values passed on the command line are also exported to sub-makes
+             in the environment.  The --XX flag disables this behavior.  Vari-
+             able assignments should follow options for POSIX compatibility
+             but no ordering is enforced.
+
+     There are seven different types of lines in a makefile: file dependency
+     specifications, shell commands, variable assignments, include statements,
+     conditional directives, for loops, and comments.
+
+     In general, lines may be continued from one line to the next by ending
+     them with a backslash (`\').  The trailing newline character and initial
+     whitespace on the following line are compressed into a single space.
+
+FFIILLEE DDEEPPEENNDDEENNCCYY SSPPEECCIIFFIICCAATTIIOONNSS
+     Dependency lines consist of one or more targets, an operator, and zero or
+     more sources.  This creates a relationship where the targets ``depend''
+     on the sources and are usually created from them.  The exact relationship
+     between the target and the source is determined by the operator that sep-
+     arates them.  The three operators are as follows:
+
+     ::     A target is considered out-of-date if its modification time is less
+           than those of any of its sources.  Sources for a target accumulate
+           over dependency lines when this operator is used.  The target is
+           removed if bbmmaakkee is interrupted.
+
+     !!     Targets are always re-created, but not until all sources have been
+           examined and re-created as necessary.  Sources for a target accumu-
+           late over dependency lines when this operator is used.  The target
+           is removed if bbmmaakkee is interrupted.
+
+     ::::    If no sources are specified, the target is always re-created.  Oth-
+           erwise, a target is considered out-of-date if any of its sources
+           has been modified more recently than the target.  Sources for a
+           target do not accumulate over dependency lines when this operator
+           is used.  The target will not be removed if bbmmaakkee is interrupted.
+
+     Targets and sources may contain the shell wildcard values `?', `*', `[]',
+     and `{}'.  The values `?', `*', and `[]' may only be used as part of the
+     final component of the target or source, and must be used to describe
+     existing files.  The value `{}' need not necessarily be used to describe
+     existing files.  Expansion is in directory order, not alphabetically as
+     done in the shell.
+
+SSHHEELLLL CCOOMMMMAANNDDSS
+     Each target may have associated with it a series of shell commands, nor-
+     mally used to create the target.  Each of the commands in this script
+     _m_u_s_t be preceded by a tab.  While any target may appear on a dependency
+     line, only one of these dependencies may be followed by a creation
+     script, unless the `::::' operator is used.
+
+     If the first characters of the command line are any combination of `@@',
+     `++', or `--', the command is treated specially.  A `@@' causes the command
+     not to be echoed before it is executed.  A `++' causes the command to be
+     executed even when --nn is given.  This is similar to the effect of the
+     .MAKE special source, except that the effect can be limited to a single
+     line of a script.  A `--' causes any non-zero exit status of the command
+     line to be ignored.
+
+VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
+     Variables in make are much like variables in the shell, and, by tradi-
+     tion, consist of all upper-case letters.
+
+   VVaarriiaabbllee aassssiiggnnmmeenntt mmooddiiffiieerrss
+     The five operators that can be used to assign values to variables are as
+     follows:
+
+     ==       Assign the value to the variable.  Any previous value is overrid-
+             den.
+
+     ++==      Append the value to the current value of the variable.
+
+     ??==      Assign the value to the variable if it is not already defined.
+
+     ::==      Assign with expansion, i.e. expand the value before assigning it
+             to the variable.  Normally, expansion is not done until the vari-
+             able is referenced.  _N_O_T_E: References to undefined variables are
+             _n_o_t expanded.  This can cause problems when variable modifiers
+             are used.
+
+     !!==      Expand the value and pass it to the shell for execution and
+             assign the result to the variable.  Any newlines in the result
+             are replaced with spaces.
+
+     Any white-space before the assigned _v_a_l_u_e is removed; if the value is
+     being appended, a single space is inserted between the previous contents
+     of the variable and the appended value.
+
+     Variables are expanded by surrounding the variable name with either curly
+     braces (`{}') or parentheses (`()') and preceding it with a dollar sign
+     (`$').  If the variable name contains only a single letter, the surround-
+     ing braces or parentheses are not required.  This shorter form is not
+     recommended.
+
+     If the variable name contains a dollar, then the name itself is expanded
+     first.  This allows almost arbitrary variable names, however names con-
+     taining dollar, braces, parenthesis, or whitespace are really best
+     avoided!
+
+     If the result of expanding a variable contains a dollar sign (`$') the
+     string is expanded again.
+
+     Variable substitution occurs at three distinct times, depending on where
+     the variable is being used.
+
+     1.   Variables in dependency lines are expanded as the line is read.
+
+     2.   Variables in shell commands are expanded when the shell command is
+          executed.
+
+     3.   ``.for'' loop index variables are expanded on each loop iteration.
+          Note that other variables are not expanded inside loops so the fol-
+          lowing example code:
+
+
+                .for i in 1 2 3
+                a+=     ${i}
+                j=      ${i}
+                b+=     ${j}
+                .endfor
+
+                all:
+                        @echo ${a}
+                        @echo ${b}
+
+          will print:
+
+                1 2 3
+                3 3 3
+
+          Because while ${a} contains ``1 2 3'' after the loop is executed,
+          ${b} contains ``${j} ${j} ${j}'' which expands to ``3 3 3'' since
+          after the loop completes ${j} contains ``3''.
+
+   VVaarriiaabbllee ccllaasssseess
+     The four different classes of variables (in order of increasing prece-
+     dence) are:
+
+     Environment variables
+             Variables defined as part of bbmmaakkee's environment.
+
+     Global variables
+             Variables defined in the makefile or in included makefiles.
+
+     Command line variables
+             Variables defined as part of the command line.
+
+     Local variables
+             Variables that are defined specific to a certain target.  The
+             seven local variables are as follows:
+
+             _._A_L_L_S_R_C   The list of all sources for this target; also known as
+                       `_>'.
+
+             _._A_R_C_H_I_V_E  The name of the archive file.
+
+             _._I_M_P_S_R_C   In suffix-transformation rules, the name/path of the
+                       source from which the target is to be transformed (the
+                       ``implied'' source); also known as `_<'.  It is not
+                       defined in explicit rules.
+
+             _._M_E_M_B_E_R   The name of the archive member.
+
+             _._O_O_D_A_T_E   The list of sources for this target that were deemed
+                       out-of-date; also known as `_?'.
+
+             _._P_R_E_F_I_X   The file prefix of the target, containing only the file
+                       portion, no suffix or preceding directory components;
+                       also known as `_*'.
+
+             _._T_A_R_G_E_T   The name of the target; also known as `_@'.
+
+             The shorter forms `_@', `_?', `_<', `_>', and `_*' are permitted for
+             backward compatibility with historical makefiles and are not rec-
+             ommended.  The six variables `_@_F', `_@_D', `_<_F', `_<_D', `_*_F', and
+             `_*_D' are permitted for compatibility with AT&T System V UNIX
+             makefiles and are not recommended.
+
+             Four of the local variables may be used in sources on dependency
+             lines because they expand to the proper value for each target on
+             the line.  These variables are `_._T_A_R_G_E_T', `_._P_R_E_F_I_X', `_._A_R_C_H_I_V_E',
+             and `_._M_E_M_B_E_R'.
+
+   AAddddiittiioonnaall bbuuiilltt--iinn vvaarriiaabblleess
+     In addition, bbmmaakkee sets or knows about the following variables:
+
+     _$               A single dollar sign `$', i.e.  `$$' expands to a single
+                     dollar sign.
+
+     _._A_L_L_T_A_R_G_E_T_S     The list of all targets encountered in the Makefile.  If
+                     evaluated during Makefile parsing, lists only those tar-
+                     gets encountered thus far.
+
+     _._C_U_R_D_I_R         A path to the directory where bbmmaakkee was executed.  Refer
+                     to the description of `PWD' for more details.
+
+     MAKE            The name that bbmmaakkee was executed with (_a_r_g_v_[_0_]).  For
+                     compatibility bbmmaakkee also sets _._M_A_K_E with the same value.
+                     The preferred variable to use is the environment variable
+                     MAKE because it is more compatible with other versions of
+                     bbmmaakkee and cannot be confused with the special target with
+                     the same name.
+
+     _._M_A_K_E_._D_E_P_E_N_D_F_I_L_E
+                     Names the makefile (default `_._d_e_p_e_n_d') from which gener-
+                     ated dependencies are read.
+
+     _._M_A_K_E_._E_X_P_A_N_D___V_A_R_I_A_B_L_E_S
+                     A boolean that controls the default behavior of the --VV
+                     option.
+
      _._M_A_K_E_._E_X_P_O_R_T_E_D  The list of variables exported by bbmmaakkee.
 
      _._M_A_K_E_._J_O_B_S      The argument to the --jj option.
@@ -1302,4 +2618,4 @@ HHIISSTTOORRYY
      bbmmaakkee is derived from NetBSD make(1).  It uses autoconf to facilitate
      portability to other platforms.
 
-NetBSD 5.1                      April 24, 2012                      NetBSD 5.1
+NetBSD 5.1                      August 30, 2012                     NetBSD 5.1
diff --git a/bsd.after-import.mk b/bsd.after-import.mk
index e87026fbf146..b2b21872b9ac 100644
--- a/bsd.after-import.mk
+++ b/bsd.after-import.mk
@@ -1,4 +1,4 @@
-# $Id: bsd.after-import.mk,v 1.6 2012/06/27 18:23:32 sjg Exp $
+# $Id: bsd.after-import.mk,v 1.7 2012/07/06 03:03:44 sjg Exp $
 
 # This makefile is for use when integrating bmake into a BSD build
 # system.  Use this makefile after importing bmake.
@@ -13,7 +13,7 @@ all: _makefile
 all: after-import
 
 # we rely on bmake
-.if !defined(.MAKE.LEVEL)
+.if !defined(.PARSEDIR)
 .error this makefile requires bmake
 .endif
 
@@ -75,7 +75,11 @@ after-import: bootstrap ${MAKEFILE}
 .for f in ${configured_files:M*Makefile}
 	@echo Capturing $f
 	@mkdir -p ${${.CURDIR}/$f:L:H}
-	@${MAKEFILE_SED} ${HOST_OS}/$f > ${.CURDIR}/$f
+	@(echo '# This is a generated file, do NOT edit!'; \
+	echo '# See ${_this:S,${SRCTOP}/,,}'; \
+	echo '#'; echo '# $$${OS}$$'; echo; \
+	echo 'SRCTOP?= $${.CURDIR:${${.CURDIR}/$f:L:H:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; echo; \
+	${MAKEFILE_SED} ${HOST_OS}/$f ) > ${.CURDIR}/$f
 .endfor
 
 # this needs the most work
diff --git a/main.c b/main.c
index 085c534f6a6d..0b177bb390b6 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $	*/
+/*	$NetBSD: main.c,v 1.203 2012/08/31 07:00:36 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,7 +69,7 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.203 2012/08/31 07:00:36 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
@@ -81,7 +81,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\
 #if 0
 static char sccsid[] = "@(#)main.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.200 2012/06/12 19:21:51 joerg Exp $");
+__RCSID("$NetBSD: main.c,v 1.203 2012/08/31 07:00:36 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -159,6 +159,7 @@ int			maxJobs;	/* -j argument */
 static int		maxJobTokens;	/* -j argument */
 Boolean			compatMake;	/* -B argument */
 int			debug;		/* -d argument */
+Boolean			debugVflag;	/* -dV */
 Boolean			noExecute;	/* -n flag */
 Boolean			noRecursiveExecute;	/* -N flag */
 Boolean			keepgoing;	/* -k flag */
@@ -271,6 +272,9 @@ parse_debug_options(const char *argvalue)
 		case 't':
 			debug |= DEBUG_TARG;
 			break;
+		case 'V':
+			debugVflag = TRUE;
+			break;
 		case 'v':
 			debug |= DEBUG_VAR;
 			break;
@@ -910,6 +914,7 @@ main(int argc, char **argv)
 	create = Lst_Init(FALSE);
 	makefiles = Lst_Init(FALSE);
 	printVars = FALSE;
+	debugVflag = FALSE;
 	variables = Lst_Init(FALSE);
 	beSilent = FALSE;		/* Print commands as executed */
 	ignoreErrors = FALSE;		/* Pay attention to non-zero returns */
@@ -1253,7 +1258,12 @@ main(int argc, char **argv)
 	/* print the values of any variables requested by the user */
 	if (printVars) {
 		LstNode ln;
+		Boolean expandVars;
 
+		if (debugVflag)
+			expandVars = FALSE;
+		else
+			expandVars = getBoolean(".MAKE.EXPAND_VARIABLES", FALSE);
 		for (ln = Lst_First(variables); ln != NULL;
 		    ln = Lst_Succ(ln)) {
 			char *var = (char *)Lst_Datum(ln);
@@ -1261,6 +1271,13 @@ main(int argc, char **argv)
 			
 			if (strchr(var, '$')) {
 				value = p1 = Var_Subst(NULL, var, VAR_GLOBAL, 0);
+			} else if (expandVars) {
+				char tmp[128];
+								
+				if (snprintf(tmp, sizeof(tmp), "${%s}", var) >= (int)(sizeof(tmp)))
+					Fatal("%s: variable name too big: %s",
+					      progname, var);
+				value = p1 = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
 			} else {
 				value = Var_Value(var, VAR_GLOBAL, &p1);
 			}
@@ -2076,3 +2093,49 @@ mkTempFile(const char *pattern, char **fnamep)
     }
     return fd;
 }
+
+
+/*
+ * Return a Boolean based on setting of a knob.
+ *
+ * If the knob is not set, the supplied default is the return value.
+ * If set, anything that looks or smells like "No", "False", "Off", "0" etc,
+ * is FALSE, otherwise TRUE.
+ */
+Boolean
+getBoolean(const char *name, Boolean bf)
+{
+    char tmp[64];
+    char *cp;
+
+    if (snprintf(tmp, sizeof(tmp), "${%s:tl}", name) < (int)(sizeof(tmp))) {
+	cp = Var_Subst(NULL, tmp, VAR_GLOBAL, 0);
+
+	if (cp) {
+	    switch(*cp) {
+	    case '\0':			/* not set - the default wins */
+		break;
+	    case '0':
+	    case 'f':
+	    case 'n':
+		bf = FALSE;
+		break;
+	    case 'o':
+		switch (cp[1]) {
+		case 'f':
+		    bf = FALSE;
+		    break;
+		default:
+		    bf = TRUE;
+		    break;
+		}
+		break;
+	    default:
+		bf = TRUE;
+		break;
+	    }
+	    free(cp);
+	}
+    }
+    return (bf);
+}
diff --git a/make.1 b/make.1
index 86f747b9177c..8a4faf3f223c 100644
--- a/make.1
+++ b/make.1
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.204 2012/04/24 20:12:16 sjg Exp $
+.\"	$NetBSD: make.1,v 1.206 2012/08/30 22:35:37 wiz Exp $
 .\"
 .\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
 .\"
-.Dd April 24, 2012
+.Dd August 30, 2012
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -203,6 +203,10 @@ Print debugging information about makefile parsing.
 Print debugging information about suffix-transformation rules.
 .It Ar t
 Print debugging information about target list maintenance.
+.It Ar V
+Force the
+.Fl V
+option to print raw values of variables.
 .It Ar v
 Print debugging information about variable assignment.
 .It Ar x
@@ -675,6 +679,10 @@ and cannot be confused with the special target with the same name.
 Names the makefile (default
 .Ql Pa .depend )
 from which generated dependencies are read.
+.It Va .MAKE.EXPAND_VARIABLES
+A boolean that controls the default behavior of the
+.Fl V
+option.
 .It Va .MAKE.EXPORTED
 The list of variables exported by
 .Nm .
diff --git a/nonints.h b/nonints.h
index eeb197e66491..c19ba895de9b 100644
--- a/nonints.h
+++ b/nonints.h
@@ -1,4 +1,4 @@
-/*	$NetBSD: nonints.h,v 1.64 2012/06/12 19:21:51 joerg Exp $	*/
+/*	$NetBSD: nonints.h,v 1.65 2012/08/30 21:17:05 sjg Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -120,6 +120,7 @@ void Finish(int) MAKE_ATTR_DEAD;
 int eunlink(const char *);
 void execError(const char *, const char *);
 char *getTmpdir(void);
+Boolean getBoolean(const char *, Boolean);
 
 /* parse.c */
 void Parse_Error(int, const char *, ...) MAKE_ATTR_PRINTFLIKE(2, 3);