summaryrefslogtreecommitdiff
path: root/devel/bmake
diff options
context:
space:
mode:
Diffstat (limited to 'devel/bmake')
-rw-r--r--devel/bmake/files/bmake.119
-rw-r--r--devel/bmake/files/bmake.cat116
-rw-r--r--devel/bmake/files/make.11946
3 files changed, 30 insertions, 1951 deletions
diff --git a/devel/bmake/files/bmake.1 b/devel/bmake/files/bmake.1
index 76f511ce859..33840f33230 100644
--- a/devel/bmake/files/bmake.1
+++ b/devel/bmake/files/bmake.1
@@ -1,4 +1,4 @@
-.\" $NetBSD: bmake.1,v 1.7 2010/09/07 14:28:00 joerg Exp $
+.\" $NetBSD: bmake.1,v 1.8 2010/09/07 14:41:39 joerg Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -30,7 +30,7 @@
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
.\"
.Dd June 30, 2010
-.Dt MAKE 1
+.Dt BMAKE 1
.Os
.Sh NAME
.Nm bmake
@@ -1929,7 +1929,22 @@ obscure problems using them in .if statements.
.Sh SEE ALSO
.Xr mkdep 1
.Sh HISTORY
+A
+.Nm
+command appeared in
+.At v7 .
.Nm
is derived from NetBSD's
.Xr make 1 .
It uses autoconf to facilitate portability to other platforms.
+.Sh BUGS
+The
+.Nm
+syntax is difficult to parse without actually acting of the data.
+For instance finding the end of a variable use should involve scanning each
+the modifiers using the correct terminator for each field.
+In many places
+.Nm
+just counts {} and () in order to find the end of a variable expansion.
+.Pp
+There is no way of escaping a space character in a filename.
diff --git a/devel/bmake/files/bmake.cat1 b/devel/bmake/files/bmake.cat1
index a6df53d1063..986206322ab 100644
--- a/devel/bmake/files/bmake.cat1
+++ b/devel/bmake/files/bmake.cat1
@@ -1,4 +1,4 @@
-MAKE(1) NetBSD General Commands Manual MAKE(1)
+BMAKE(1) NetBSD General Commands Manual BMAKE(1)
NNAAMMEE
bbmmaakkee -- maintain program dependencies
@@ -1206,7 +1206,17 @@ SSEEEE AALLSSOO
mkdep(1)
HHIISSTTOORRYY
- bbmmaakkee is derived from NetBSD's make(1). It uses autoconf to facilitate
- portability to other platforms.
+ A bbmmaakkee command appeared in Version 7 AT&T UNIX. bbmmaakkee is derived from
+ NetBSD's make(1). It uses autoconf to facilitate portability to other
+ platforms.
+
+BBUUGGSS
+ The bbmmaakkee syntax is difficult to parse without actually acting of the
+ data. For instance finding the end of a variable use should involve
+ scanning each the modifiers using the correct terminator for each field.
+ In many places bbmmaakkee just counts {} and () in order to find the end of a
+ variable expansion.
+
+ There is no way of escaping a space character in a filename.
NetBSD 5.0 June 30, 2010 NetBSD 5.0
diff --git a/devel/bmake/files/make.1 b/devel/bmake/files/make.1
deleted file mode 100644
index e2e41f48afe..00000000000
--- a/devel/bmake/files/make.1
+++ /dev/null
@@ -1,1946 +0,0 @@
-.\" $NetBSD: make.1,v 1.7 2010/09/07 14:28:00 joerg Exp $
-.\"
-.\" Copyright (c) 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
-.\"
-.Dd June 30, 2010
-.Dt MAKE 1
-.Os
-.Sh NAME
-.Nm make
-.Nd maintain program dependencies
-.Sh SYNOPSIS
-.Nm
-.Op Fl BeikNnqrstWX
-.Bk -words
-.Op Fl C Ar directory
-.Ek
-.Bk -words
-.Op Fl D Ar variable
-.Ek
-.Bk -words
-.Op Fl d Ar flags
-.Ek
-.Bk -words
-.Op Fl f Ar makefile
-.Ek
-.Bk -words
-.Op Fl I Ar directory
-.Ek
-.Bk -words
-.Op Fl J Ar private
-.Ek
-.Bk -words
-.Op Fl j Ar max_jobs
-.Ek
-.Bk -words
-.Op Fl m Ar directory
-.Ek
-.Bk -words
-.Op Fl T Ar file
-.Ek
-.Bk -words
-.Op Fl V Ar variable
-.Ek
-.Op Ar variable=value
-.Bk -words
-.Op Ar target ...
-.Ek
-.Sh DESCRIPTION
-.Nm
-is a program designed to simplify the maintenance of other programs.
-Its input is a list of specifications as to the files upon which programs
-and other files depend.
-If no
-.Fl f Ar makefile
-makefile option is given,
-.Nm
-will try to open
-.Ql Pa makefile
-then
-.Ql Pa Makefile
-in order to find the specifications.
-If the file
-.Ql Pa .depend
-exists, it is read (see
-.Xr mkdep 1 ) .
-.Pp
-This manual page is intended as a reference document only.
-For a more thorough description of
-.Nm
-and makefiles, please refer to
-.%T "Make \- A Tutorial" .
-.Pp
-.Nm
-will prepend the contents of the
-.Va MAKEFLAGS
-environment variable to the command line arguments before parsing them.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl B
-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.
-.It Fl C Ar directory
-Change to
-.Ar directory
-before reading the makefiles or doing anything else.
-If multiple
-.Fl C
-options are specified, each is interpreted relative to the previous one:
-.Fl C Pa / Fl C Pa etc
-is equivalent to
-.Fl C Pa /etc .
-.It Fl D Ar variable
-Define
-.Ar variable
-to be 1, in the global context.
-.It Fl d Ar [-]flags
-Turn on debugging, and specify which portions of
-.Nm
-are to print debugging information.
-Unless the flags are preceded by
-.Ql -
-they are added to the
-.Va MAKEFLAGS
-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
-.Ar 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 output is line buffered.
-.Ar Flags
-is one or more of the following:
-.Bl -tag -width Ds
-.It Ar A
-Print all possible debugging information;
-equivalent to specifying all of the debugging flags.
-.It Ar a
-Print debugging information about archive searching and caching.
-.It Ar C
-Print debugging information about current working directory.
-.It Ar c
-Print debugging information about conditional evaluation.
-.It Ar d
-Print debugging information about directory searching and caching.
-.It Ar e
-Print debugging information about failed commands and targets.
-.It Ar F Ns Oo Sy \&+ Oc Ns Ar filename
-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
-.Ql F
-flag is
-.Ql \&+ ,
-then the file will be opened in append mode;
-otherwise the file will be overwritten.
-If the file name is
-.Ql stdout
-or
-.Ql stderr
-then debugging output will be written to the
-standard output or standard error output file descriptors respectively
-(and the
-.Ql \&+
-option has no effect).
-Otherwise, the output will be written to the named file.
-If the file name ends
-.Ql .%d
-then the
-.Ql %d
-is replaced by the pid.
-.It Ar f
-Print debugging information about loop evaluation.
-.It Ar "g1"
-Print the input graph before making anything.
-.It Ar "g2"
-Print the input graph after making everything, or before exiting
-on error.
-.It Ar "g3"
-Print the input graph before exiting on error.
-.It Ar j
-Print debugging information about running multiple shells.
-.It Ar l
-Print commands in Makefiles regardless of whether or not they are prefixed by
-.Ql @
-or other "quiet" flags.
-Also known as "loud" behavior.
-.It Ar m
-Print debugging information about making targets, including modification
-dates.
-.It Ar n
-Don't delete the temporary command scripts created when running commands.
-These temporary scripts are created in the directory
-referred to by the
-.Ev TMPDIR
-environment variable, or in
-.Pa /tmp
-if
-.Ev TMPDIR
-is unset or set to the empty string.
-The temporary scripts are created by
-.Xr mkstemp 3 ,
-and have names of the form
-.Pa makeXXXXXX .
-.Em NOTE :
-This can create many files in
-.Ev TMPDIR
-or
-.Pa /tmp ,
-so use with care.
-.It Ar p
-Print debugging information about makefile parsing.
-.It Ar s
-Print debugging information about suffix-transformation rules.
-.It Ar t
-Print debugging information about target list maintenance.
-.It Ar v
-Print debugging information about variable assignment.
-.It Ar x
-Run shell commands with
-.Fl x
-so the actual commands are printed as they are executed.
-.El
-.It Fl e
-Specify that environment variables override macro assignments within
-makefiles.
-.It Fl f Ar makefile
-Specify a makefile to read instead of the default
-.Ql Pa makefile .
-If
-.Ar makefile
-is
-.Ql Fl ,
-standard input is read.
-Multiple makefiles may be specified, and are read in the order specified.
-.It Fl I Ar directory
-Specify a directory in which to search for makefiles and included makefiles.
-The system makefile directory (or directories, see the
-.Fl m
-option) is automatically included as part of this list.
-.It Fl i
-Ignore non-zero exit of shell commands in the makefile.
-Equivalent to specifying
-.Ql Fl
-before each command line in the makefile.
-.It Fl J Ar private
-This option should
-.Em not
-be specified by the user.
-.Pp
-When the
-.Ar 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.
-.It Fl j Ar max_jobs
-Specify the maximum number of jobs that
-.Nm
-may have running at any one time.
-Turns compatibility mode off, unless the
-.Ar B
-flag is also specified.
-When compatibility mode is off, all commands associated with a
-target are executed in a single shell invocation as opposed to the
-traditional 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.
-.It Fl k
-Continue processing after errors are encountered, but only on those targets
-that do not depend on the target whose creation caused the error.
-.It Fl m Ar directory
-Specify a directory in which to search for sys.mk and makefiles included
-via the
-.Ao Ar file Ac Ns -style
-include statement.
-The
-.Fl m
-option can be used multiple times to form a search path.
-This path will override the default system include path: /usr/share/mk.
-Furthermore the system include path will be appended to the search path used
-for
-.Qo Ar file Qc Ns -style
-include statements (see the
-.Fl I
-option).
-.Pp
-If a file or directory name in the
-.Fl m
-argument (or the
-.Ev MAKESYSPATH
-environment variable) starts with the string
-.Qq \&.../
-then
-.Nm
-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
-.Qq \&.../
-specification in the
-.Fl m
-argument.
-If used, this feature allows
-.Nm
-to easily search in the current source tree for customized sys.mk files
-(e.g., by using
-.Qq \&.../mk/sys.mk
-as an argument).
-.It Fl n
-Display the commands that would have been executed, but do not
-actually execute them unless the target depends on the .MAKE special
-source (see below).
-.It Fl N
-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.
-.It Fl q
-Do not execute any commands, but exit 0 if the specified targets are
-up-to-date and 1, otherwise.
-.It Fl r
-Do not use the built-in rules specified in the system makefile.
-.It Fl s
-Do not echo any commands as they are executed.
-Equivalent to specifying
-.Ql Ic @
-before each command line in the makefile.
-.It Fl T Ar tracefile
-When used with the
-.Fl j
-flag,
-append a trace record to
-.Ar tracefile
-for each job started and completed.
-.It Fl t
-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.
-.It Fl V Ar variable
-Print
-.Nm Ns 's
-idea of the value of
-.Ar variable ,
-in the global context.
-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
-.Ar variable
-contains a
-.Ql \&$
-then the value will be expanded before printing.
-.It Fl W
-Treat any warnings during makefile parsing as errors.
-.It Fl X
-Don't export variables passed on the command line to the environment
-individually.
-Variables passed on the command line are still exported
-via the
-.Va MAKEFLAGS
-environment variable.
-This option may be useful on systems which have a small limit on the
-size of command arguments.
-.It Ar variable=value
-Set the value of the variable
-.Ar variable
-to
-.Ar value .
-Normally, all values passed on the command line are also exported to
-sub-makes in the environment.
-The
-.Fl X
-flag disables this behavior.
-Variable assignments should follow options for POSIX compatibility
-but no ordering is enforced.
-.El
-.Pp
-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.
-.Pp
-In general, lines may be continued from one line to the next by ending
-them with a backslash
-.Pq Ql \e .
-The trailing newline character and initial whitespace on the following
-line are compressed into a single space.
-.Sh FILE DEPENDENCY SPECIFICATIONS
-Dependency lines consist of one or more targets, an operator, and zero
-or more sources.
-This creates a relationship where the targets
-.Dq 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 separates them.
-The three operators are as follows:
-.Bl -tag -width flag
-.It Ic \&:
-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
-.Nm
-is interrupted.
-.It Ic \&!
-Targets are always re-created, but not until all sources have been
-examined and re-created as necessary.
-Sources for a target accumulate over dependency lines when this operator
-is used.
-The target is removed if
-.Nm
-is interrupted.
-.It Ic \&::
-If no sources are specified, the target is always re-created.
-Otherwise, 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
-.Nm
-is interrupted.
-.El
-.Pp
-Targets and sources may contain the shell wildcard values
-.Ql \&? ,
-.Ql * ,
-.Ql [] ,
-and
-.Ql {} .
-The values
-.Ql \&? ,
-.Ql * ,
-and
-.Ql []
-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
-.Ql {}
-need not necessarily be used to describe existing files.
-Expansion is in directory order, not alphabetically as done in the shell.
-.Sh SHELL COMMANDS
-Each target may have associated with it a series of shell commands, normally
-used to create the target.
-Each of the commands in this script
-.Em must
-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
-.Ql Ic \&::
-operator is used.
-.Pp
-If the first characters of the command line are any combination of
-.Ql Ic @ ,
-.Ql Ic + ,
-or
-.Ql Ic \- ,
-the command is treated specially.
-A
-.Ql Ic @
-causes the command not to be echoed before it is executed.
-A
-.Ql Ic +
-causes the command to be executed even when
-.Fl n
-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
-.Ql Ic \-
-causes any non-zero exit status of the command line to be ignored.
-.Sh VARIABLE ASSIGNMENTS
-Variables in make are much like variables in the shell, and, by tradition,
-consist of all upper-case letters.
-.Ss Variable assignment modifiers
-The five operators that can be used to assign values to variables are as
-follows:
-.Bl -tag -width Ds
-.It Ic \&=
-Assign the value to the variable.
-Any previous value is overridden.
-.It Ic \&+=
-Append the value to the current value of the variable.
-.It Ic \&?=
-Assign the value to the variable if it is not already defined.
-.It Ic \&:=
-Assign with expansion, i.e. expand the value before assigning it
-to the variable.
-Normally, expansion is not done until the variable is referenced.
-.Em NOTE :
-References to undefined variables are
-.Em not
-expanded.
-This can cause problems when variable modifiers are used.
-.It Ic \&!=
-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.
-.El
-.Pp
-Any white-space before the assigned
-.Ar value
-is removed; if the value is being appended, a single space is inserted
-between the previous contents of the variable and the appended value.
-.Pp
-Variables are expanded by surrounding the variable name with either
-curly braces
-.Pq Ql {}
-or parentheses
-.Pq Ql ()
-and preceding it with
-a dollar sign
-.Pq Ql \&$ .
-If the variable name contains only a single letter, the surrounding
-braces or parentheses are not required.
-This shorter form is not recommended.
-.Pp
-If the variable name contains a dollar, then the name itself is expanded first.
-This allows almost arbitrary variable names, however names containing dollar,
-braces, parenthesis, or whitespace are really best avoided!
-.Pp
-If the result of expanding a variable contains a dollar sign
-.Pq Ql \&$
-the string is expanded again.
-.Pp
-Variable substitution occurs at three distinct times, depending on where
-the variable is being used.
-.Bl -enum
-.It
-Variables in dependency lines are expanded as the line is read.
-.It
-Variables in shell commands are expanded when the shell command is
-executed.
-.It
-.Dq .for
-loop index variables are expanded on each loop iteration.
-Note that other variables are not expanded inside loops so
-the following example code:
-.Bd -literal -offset indent
-
-.Dv .for i in 1 2 3
-a+= ${i}
-j= ${i}
-b+= ${j}
-.Dv .endfor
-
-all:
- @echo ${a}
- @echo ${b}
-
-.Ed
-will print:
-.Bd -literal -offset indent
-1 2 3
-3 3 3
-
-.Ed
-Because while ${a} contains
-.Dq 1 2 3
-after the loop is executed, ${b}
-contains
-.Dq ${j} ${j} ${j}
-which expands to
-.Dq 3 3 3
-since after the loop completes ${j} contains
-.Dq 3 .
-.El
-.Ss Variable classes
-The four different classes of variables (in order of increasing precedence)
-are:
-.Bl -tag -width Ds
-.It Environment variables
-Variables defined as part of
-.Nm Ns 's
-environment.
-.It Global variables
-Variables defined in the makefile or in included makefiles.
-.It Command line variables
-Variables defined as part of the command line.
-.It Local variables
-Variables that are defined specific to a certain target.
-The seven local variables are as follows:
-.Bl -tag -width ".ARCHIVE"
-.It Va .ALLSRC
-The list of all sources for this target; also known as
-.Ql Va \&\*[Gt] .
-.It Va .ARCHIVE
-The name of the archive file.
-.It Va .IMPSRC
-In suffix-transformation rules, the name/path of the source from which the
-target is to be transformed (the
-.Dq implied
-source); also known as
-.Ql Va \&\*[Lt] .
-It is not defined in explicit rules.
-.It Va .MEMBER
-The name of the archive member.
-.It Va .OODATE
-The list of sources for this target that were deemed out-of-date; also
-known as
-.Ql Va \&? .
-.It Va .PREFIX
-The file prefix of the target, containing only the file portion, no suffix
-or preceding directory components; also known as
-.Ql Va * .
-.It Va .TARGET
-The name of the target; also known as
-.Ql Va @ .
-.El
-.Pp
-The shorter forms
-.Ql Va @ ,
-.Ql Va \&? ,
-.Ql Va \&\*[Lt] ,
-.Ql Va \&\*[Gt] ,
-and
-.Ql Va *
-are permitted for backward
-compatibility with historical makefiles and are not recommended.
-The six variables
-.Ql Va "@F" ,
-.Ql Va "@D" ,
-.Ql Va "\*[Lt]F" ,
-.Ql Va "\*[Lt]D" ,
-.Ql Va "*F" ,
-and
-.Ql Va "*D"
-are permitted for compatibility with
-.At V
-makefiles and are not recommended.
-.Pp
-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
-.Ql Va .TARGET ,
-.Ql Va .PREFIX ,
-.Ql Va .ARCHIVE ,
-and
-.Ql Va .MEMBER .
-.El
-.Ss Additional built-in variables
-In addition,
-.Nm
-sets or knows about the following variables:
-.Bl -tag -width .MAKEOVERRIDES
-.It Va \&$
-A single dollar sign
-.Ql \&$ ,
-i.e.
-.Ql \&$$
-expands to a single dollar
-sign.
-.It Va .ALLTARGETS
-The list of all targets encountered in the Makefile.
-If evaluated during
-Makefile parsing, lists only those targets encountered thus far.
-.It Va .CURDIR
-A path to the directory where
-.Nm
-was executed.
-Refer to the description of
-.Ql Ev PWD
-for more details.
-.It Ev MAKE
-The name that
-.Nm
-was executed with
-.Pq Va argv[0] .
-For compatibility
-.Nm
-also sets
-.Va .MAKE
-with the same value.
-The preferred variable to use is the environment variable
-.Ev MAKE
-because it is more compatible with other versions of
-.Nm
-and cannot be confused with the special target with the same name.
-.It Va .MAKE.DEPENDFILE
-Names the makefile (default
-.Ql Pa .depend )
-from which generated dependencies are read.
-.It Va .MAKE.EXPORTED
-The list of variables exported by
-.Nm .
-.It Va .MAKE.JOBS
-The argument to the
-.Fl j
-option.
-.It Va .MAKE.JOB.PREFIX
-If
-.Nm
-is run with
-.Ar j
-then output for each target is prefixed with a token
-.Ql --- target ---
-the first part of which can be controlled via
-.Va .MAKE.JOB.PREFIX .
-.br
-For example:
-.Li .MAKE.JOB.PREFIX=${.newline}---${.MAKE:T}[${.MAKE.PID}]
-would produce tokens like
-.Ql ---make[1234] target ---
-making it easier to track the degree of parallelism being achieved.
-.It Ev MAKEFLAGS
-The environment variable
-.Ql Ev MAKEFLAGS
-may contain anything that
-may be specified on
-.Nm Ns 's
-command line.
-Anything specified on
-.Nm Ns 's
-command line is appended to the
-.Ql Ev MAKEFLAGS
-variable which is then
-entered into the environment for all programs which
-.Nm
-executes.
-.It Va .MAKE.LEVEL
-The recursion depth of
-.Nm .
-The initial instance of
-.Nm
-will be 0, and an incremented value is put into the environment
-to be seen by the next generation.
-This allows tests like:
-.Li .if ${.MAKE.LEVEL} == 0
-to protect things which should only be evaluated in the initial instance of
-.Nm .
-.It Va .MAKE.MAKEFILE_PREFERENCE
-The ordered list of makefile names
-(default
-.Ql Pa makefile ,
-.Ql Pa Makefile )
-that
-.Nm
-will look for.
-.It Va .MAKE.MAKEFILES
-The list of makefiles read by
-.Nm ,
-which is useful for tracking dependencies.
-Each makefile is recorded only once, regardless of the number of times read.
-.It Va .MAKE.MODE
-Processed after reading all makefiles.
-Can affect the mode that
-.Nm
-runs in.
-Currently just
-.Ql Pa compat
-mode.
-.It Va .MAKEOVERRIDES
-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
-.Ql Ev MAKEFLAGS .
-This behaviour can be disabled by assigning an empty value to
-.Ql Va .MAKEOVERRIDES
-within a makefile.
-Extra variables can be exported from a makefile
-by appending their names to
-.Ql Va .MAKEOVERRIDES .
-.Ql Ev MAKEFLAGS
-is re-exported whenever
-.Ql Va .MAKEOVERRIDES
-is modified.
-.It Va .MAKE.PID
-The process-id of
-.Nm .
-.It Va .MAKE.PPID
-The parent process-id of
-.Nm .
-.It Va MAKE_PRINT_VAR_ON_ERROR
-When
-.Nm
-stops due to an error, it prints its name and the value of
-.Ql Va .CURDIR
-as well as the value of any variables named in
-.Ql Va MAKE_PRINT_VAR_ON_ERROR .
-.It Va .newline
-This variable is simply assigned a newline character as its value.
-This allows expansions using the
-.Cm \&:@
-modifier to put a newline between
-iterations of the loop rather than a space.
-For example, the printing of
-.Ql Va MAKE_PRINT_VAR_ON_ERROR
-could be done as ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}.
-.It Va .OBJDIR
-A path to the directory where the targets are built.
-Its value is determined by trying to
-.Xr chdir 2
-to the following directories in order and using the first match:
-.Bl -enum
-.It
-.Ev ${MAKEOBJDIRPREFIX}${.CURDIR}
-.Pp
-(Only if
-.Ql Ev MAKEOBJDIRPREFIX
-is set in the environment or on the command line.)
-.It
-.Ev ${MAKEOBJDIR}
-.Pp
-(Only if
-.Ql Ev MAKEOBJDIR
-is set in the environment or on the command line.)
-.It
-.Ev ${.CURDIR} Ns Pa /obj. Ns Ev ${MACHINE}
-.It
-.Ev ${.CURDIR} Ns Pa /obj
-.It
-.Pa /usr/obj/ Ns Ev ${.CURDIR}
-.It
-.Ev ${.CURDIR}
-.El
-.Pp
-Variable expansion is performed on the value before it's used,
-so expressions such as
-.Dl ${.CURDIR:S,^/usr/src,/var/obj,}
-may be used.
-This is especially useful with
-.Ql Ev MAKEOBJDIR .
-.Pp
-.Ql Va .OBJDIR
-may be modified in the makefile as a global variable.
-In all cases,
-.Nm
-will
-.Xr chdir 2
-to
-.Ql Va .OBJDIR
-and set
-.Ql Ev PWD
-to that directory before executing any targets.
-.
-.It Va .PARSEDIR
-A path to the directory of the current
-.Ql Pa Makefile
-being parsed.
-.It Va .PARSEFILE
-The basename of the current
-.Ql Pa Makefile
-being parsed.
-This variable and
-.Ql Va .PARSEDIR
-are both set only while the
-.Ql Pa Makefiles
-are being parsed.
-.It Va .PATH
-A variable that represents the list of directories that
-.Nm
-will search for files.
-The search list should be updated using the target
-.Ql Va .PATH
-rather than the variable.
-.It Ev PWD
-Alternate path to the current directory.
-.Nm
-normally sets
-.Ql Va .CURDIR
-to the canonical path given by
-.Xr getcwd 3 .
-However, if the environment variable
-.Ql Ev PWD
-is set and gives a path to the current directory, then
-.Nm
-sets
-.Ql Va .CURDIR
-to the value of
-.Ql Ev PWD
-instead.
-This behaviour is disabled if
-.Ql Ev MAKEOBJDIRPREFIX
-is set or
-.Ql Ev MAKEOBJDIR
-contains a variable transform.
-.Ql Ev PWD
-is set to the value of
-.Ql Va .OBJDIR
-for all programs which
-.Nm
-executes.
-.It Ev .TARGETS
-The list of targets explicitly specified on the command line, if any.
-.It Ev VPATH
-Colon-separated
-.Pq Dq \&:
-lists of directories that
-.Nm
-will search for files.
-The variable is supported for compatibility with old make programs only,
-use
-.Ql Va .PATH
-instead.
-.El
-.Ss Variable modifiers
-Variable expansion may be modified to select or modify each word of the
-variable (where a
-.Dq word
-is white-space delimited sequence of characters).
-The general format of a variable expansion is as follows:
-.Pp
-.Dl ${variable[:modifier[:...]]}
-.Pp
-Each modifier begins with a colon,
-which may be escaped with a backslash
-.Pq Ql \e .
-.Pp
-A set of modifiers can be specified via a variable, as follows:
-.Pp
-.Dl modifier_variable=modifier[:...]
-.Dl ${variable:${modifier_variable}[:...]}
-.Pp
-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
-.Pq Ql $ ,
-these must be doubled to avoid early expansion.
-.Pp
-The supported modifiers are:
-.Bl -tag -width EEE
-.It Cm \&:E
-Replaces each word in the variable with its suffix.
-.It Cm \&:H
-Replaces each word in the variable with everything but the last component.
-.It Cm \&:M Ns Ar pattern
-Select only those words that match
-.Ar pattern .
-The standard shell wildcard characters
-.Pf ( Ql * ,
-.Ql \&? ,
-and
-.Ql Oo Oc )
-may
-be used.
-The wildcard characters may be escaped with a backslash
-.Pq Ql \e .
-.It Cm \&:N Ns Ar pattern
-This is identical to
-.Ql Cm \&:M ,
-but selects all words which do not match
-.Ar pattern .
-.It Cm \&:O
-Order every word in variable alphabetically.
-To sort words in
-reverse order use the
-.Ql Cm \&:O:[-1..1]
-combination of modifiers.
-.It Cm \&:Ox
-Randomize words in variable.
-The results will be different each time you are referring to the
-modified variable; use the assignment with expansion
-.Pq Ql Cm \&:=
-to prevent such behaviour.
-For example,
-.Bd -literal -offset indent
-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}"
-.Ed
-may produce output similar to:
-.Bd -literal -offset indent
-quattro due tre uno
-tre due quattro uno
-due uno quattro tre
-due uno quattro tre
-.Ed
-.It Cm \&:Q
-Quotes every shell meta-character in the variable, so that it can be passed
-safely through recursive invocations of
-.Nm .
-.It Cm \&:R
-Replaces each word in the variable with everything but its suffix.
-.It Cm \&:tA
-Attempt to convert variable to an absolute path using
-.Xr realpath 3 ,
-if that fails, the value is unchanged.
-.It Cm \&:tl
-Converts variable to lower-case letters.
-.It Cm \&:ts Ns Ar c
-Words in the variable are normally separated by a space on expansion.
-This modifier sets the separator to the character
-.Ar c .
-If
-.Ar c
-is omitted, then no separator is used.
-The common escapes (including octal numeric codes), work as expected.
-.It Cm \&:tu
-Converts variable to upper-case letters.
-.It Cm \&:tW
-Causes the value to be treated as a single word
-(possibly containing embedded white space).
-See also
-.Ql Cm \&:[*] .
-.It Cm \&:tw
-Causes the value to be treated as a sequence of
-words delimited by white space.
-See also
-.Ql Cm \&:[@] .
-.Sm off
-.It Cm \&:S No \&/ Ar old_string No \&/ Ar new_string No \&/ Op Cm 1gW
-.Sm on
-Modify the first occurrence of
-.Ar old_string
-in the variable's value, replacing it with
-.Ar new_string .
-If a
-.Ql g
-is appended to the last slash of the pattern, all occurrences
-in each word are replaced.
-If a
-.Ql 1
-is appended to the last slash of the pattern, only the first word
-is affected.
-If a
-.Ql W
-is appended to the last slash of the pattern,
-then the value is treated as a single word
-(possibly containing embedded white space).
-If
-.Ar old_string
-begins with a caret
-.Pq Ql ^ ,
-.Ar old_string
-is anchored at the beginning of each word.
-If
-.Ar old_string
-ends with a dollar sign
-.Pq Ql \&$ ,
-it is anchored at the end of each word.
-Inside
-.Ar new_string ,
-an ampersand
-.Pq Ql \*[Am]
-is replaced by
-.Ar old_string
-(without any
-.Ql ^
-or
-.Ql \&$ ) .
-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
-.Pq Ql \e .
-.Pp
-Variable expansion occurs in the normal fashion inside both
-.Ar old_string
-and
-.Ar new_string
-with the single exception that a backslash is used to prevent the expansion
-of a dollar sign
-.Pq Ql \&$ ,
-not a preceding dollar sign as is usual.
-.Sm off
-.It Cm \&:C No \&/ Ar pattern No \&/ Ar replacement No \&/ Op Cm 1gW
-.Sm on
-The
-.Cm \&:C
-modifier is just like the
-.Cm \&:S
-modifier except that the old and new strings, instead of being
-simple strings, are a regular expression (see
-.Xr regex 3 )
-string
-.Ar pattern
-and an
-.Xr ed 1 Ns \-style
-string
-.Ar replacement .
-Normally, the first occurrence of the pattern
-.Ar pattern
-in each word of the value is substituted with
-.Ar replacement .
-The
-.Ql 1
-modifier causes the substitution to apply to at most one word; the
-.Ql g
-modifier causes the substitution to apply to as many instances of the
-search pattern
-.Ar pattern
-as occur in the word or words it is found in; the
-.Ql W
-modifier causes the value to be treated as a single word
-(possibly containing embedded white space).
-Note that
-.Ql 1
-and
-.Ql g
-are orthogonal; the former specifies whether multiple words are
-potentially affected, the latter whether multiple substitutions can
-potentially occur within each affected word.
-.It Cm \&:T
-Replaces each word in the variable with its last component.
-.It Cm \&:u
-Remove adjacent duplicate words (like
-.Xr uniq 1 ) .
-.Sm off
-.It Cm \&:\&? Ar true_string Cm \&: Ar false_string
-.Sm on
-If the variable name (not its value), when parsed as a .if conditional
-expression, evaluates to true, return as its value the
-.Ar true_string ,
-otherwise return the
-.Ar false_string .
-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
-.Dl ${NUMBERS:M42:?match:no}
-which actually tests defined(NUMBERS),
-to determine is any words match "42" you need to use something like:
-.Dl ${${NUMBERS:M42} != "":?match:no} .
-.It Ar :old_string=new_string
-This is the
-.At V
-style variable substitution.
-It must be the last modifier specified.
-If
-.Ar old_string
-or
-.Ar new_string
-do not contain the pattern matching character
-.Ar %
-then it is assumed that they are
-anchored at the end of each word, so only suffixes or entire
-words may be replaced.
-Otherwise
-.Ar %
-is the substring of
-.Ar old_string
-to be replaced in
-.Ar new_string .
-.Pp
-Variable expansion occurs in the normal fashion inside both
-.Ar old_string
-and
-.Ar new_string
-with the single exception that a backslash is used to prevent the
-expansion of a dollar sign
-.Pq Ql \&$ ,
-not a preceding dollar sign as is usual.
-.Sm off
-.It Cm \&:@ Ar temp Cm @ Ar string Cm @
-.Sm on
-This is the loop expansion mechanism from the OSF Development
-Environment (ODE) make.
-Unlike
-.Cm \&.for
-loops expansion occurs at the time of
-reference.
-Assign
-.Ar temp
-to each word in the variable and evaluate
-.Ar string .
-The ODE convention is that
-.Ar temp
-should start and end with a period.
-For example.
-.Dl ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
-.It Cm \&:U Ns Ar newval
-If the variable is undefined
-.Ar newval
-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:
-.Dl ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
-If a value is only required if the variable is undefined, use:
-.Dl ${VAR:D:Unewval}
-.It Cm \&:D Ns Ar newval
-If the variable is defined
-.Ar newval
-is the value.
-.It Cm \&:L
-The name of the variable is the value.
-.It Cm \&:P
-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.
-.Sm off
-.It Cm \&:\&! Ar cmd Cm \&!
-.Sm on
-The output of running
-.Ar cmd
-is the value.
-.It Cm \&:sh
-If the variable is non-empty it is run as a command and the output
-becomes the new value.
-.It Cm \&::= Ns Ar str
-The variable is assigned the value
-.Ar str
-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
-.Nm
-happy.
-.Pp
-The
-.Ql Cm \&::
-helps avoid false matches with the
-.At V
-style
-.Cm \&:=
-modifier and since substitution always occurs the
-.Cm \&::=
-form is vaguely appropriate.
-.It Cm \&::?= Ns Ar str
-As for
-.Cm \&::=
-but only if the variable does not already have a value.
-.It Cm \&::+= Ns Ar str
-Append
-.Ar str
-to the variable.
-.It Cm \&::!= Ns Ar cmd
-Assign the output of
-.Ar cmd
-to the variable.
-.It Cm \&:\&[ Ns Ar range Ns Cm \&]
-Selects one or more words from the value,
-or performs other operations related to the way in which the
-value is divided into words.
-.Pp
-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
-.Ql Cm \&:[]
-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).
-.Pp
-The
-.Ar range
-is subjected to variable expansion, and the expanded result is
-then interpreted as follows:
-.Bl -tag -width index
-.\" :[n]
-.It Ar index
-Selects a single word from the value.
-.\" :[start..end]
-.It Ar start Ns Cm \&.. Ns Ar end
-Selects all words from
-.Ar start
-to
-.Ar end ,
-inclusive.
-For example,
-.Ql Cm \&:[2..-1]
-selects all words from the second word to the last word.
-If
-.Ar start
-is greater than
-.Ar end ,
-then the words are output in reverse order.
-For example,
-.Ql Cm \&:[-1..1]
-selects all the words from last to first.
-.\" :[*]
-.It Cm \&*
-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]
-.It 0
-Means the same as
-.Ql Cm \&:[*] .
-.\" :[*]
-.It Cm \&@
-Causes subsequent modifiers to treat the value as a sequence of words
-delimited by white space.
-Analogous to the effect of
-\&"$@\&"
-in Bourne shell.
-.\" :[#]
-.It Cm \&#
-Returns the number of words in the value.
-.El \" :[range]
-.El
-.Sh INCLUDE STATEMENTS, CONDITIONALS AND FOR LOOPS
-Makefile inclusion, conditional structures and for loops reminiscent
-of the C programming language are provided in
-.Nm .
-All such structures are identified by a line beginning with a single
-dot
-.Pq Ql \&.
-character.
-Files are included with either
-.Cm \&.include Aq Ar file
-or
-.Cm \&.include Pf \*q Ar file Ns \*q .
-Variables 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
-.Fl I
-option are searched before the system
-makefile directory.
-For compatibility with other versions of
-.Nm
-.Ql include file ...
-is also accepted.
-If the include statement is written as
-.Cm .-include
-or as
-.Cm .sinclude
-then errors locating and/or opening include files are ignored.
-.Pp
-Conditional expressions are also preceded by a single dot as the first
-character of a line.
-The possible conditionals are as follows:
-.Bl -tag -width Ds
-.It Ic .error Ar message
-The message is printed along with the name of the makefile and line number,
-then
-.Nm
-will exit.
-.It Ic .export Ar variable ...
-Export the specified global variable.
-If no variable list is provided, all globals are exported
-except for internal variables (those that start with
-.Ql \&. ) .
-This is not affected by the
-.Fl X
-flag, so should be used with caution.
-.Pp
-Appending a variable name to
-.Va .MAKE.EXPORTED
-is equivalent to exporting a variable.
-.It Ic .export-env Ar variable ...
-The same as
-.Ql .export ,
-except that the variable is not appended to
-.Va .MAKE.EXPORTED .
-This allows exporting a value to the environment which is different from that
-used by
-.Nm
-internally.
-.It Ic .info Ar message
-The message is printed along with the name of the makefile and line number.
-.It Ic .undef Ar variable
-Un-define the specified global variable.
-Only global variables may be un-defined.
-.It Ic .unexport Ar variable ...
-The opposite of
-.Ql .export .
-The specified global
-.Va variable
-will be removed from
-.Va .MAKE.EXPORTED .
-If no variable list is provided, all globals are unexported,
-and
-.Va .MAKE.EXPORTED
-deleted.
-.It Ic .unexport-env
-Unexport all globals previously exported and
-clear the environment inherited from the parent.
-This operation will cause a memory leak of the original environment,
-so should be used sparingly.
-Testing for
-.Va .MAKE.LEVEL
-being 0, would make sense.
-Also note that any variables which originated in the parent environment
-should be explicitly preserved if desired.
-For example:
-.Bd -literal -offset indent
-.Li .if ${.MAKE.LEVEL} == 0
-PATH := ${PATH}
-.Li .unexport-env
-.Li .export PATH
-.Li .endif
-.Pp
-.Ed
-Would result in an environment containing only
-.Ql Ev PATH ,
-which is the minimal useful environment.
-Actually
-.Ql Ev .MAKE.LEVEL
-will also be pushed into the new environment.
-.It Ic .warning Ar message
-The message prefixed by
-.Ql Pa warning:
-is printed along with the name of the makefile and line number.
-.It Ic \&.if Oo \&! Oc Ns Ar expression Op Ar operator expression ...
-Test the value of an expression.
-.It Ic .ifdef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
-Test the value of a variable.
-.It Ic .ifndef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
-Test the value of a variable.
-.It Ic .ifmake Oo \&! Oc Ns Ar target Op Ar operator target ...
-Test the target being built.
-.It Ic .ifnmake Oo \&! Ns Oc Ar target Op Ar operator target ...
-Test the target being built.
-.It Ic .else
-Reverse the sense of the last conditional.
-.It Ic .elif Oo \&! Ns Oc Ar expression Op Ar operator expression ...
-A combination of
-.Ql Ic .else
-followed by
-.Ql Ic .if .
-.It Ic .elifdef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
-A combination of
-.Ql Ic .else
-followed by
-.Ql Ic .ifdef .
-.It Ic .elifndef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
-A combination of
-.Ql Ic .else
-followed by
-.Ql Ic .ifndef .
-.It Ic .elifmake Oo \&! Oc Ns Ar target Op Ar operator target ...
-A combination of
-.Ql Ic .else
-followed by
-.Ql Ic .ifmake .
-.It Ic .elifnmake Oo \&! Oc Ns Ar target Op Ar operator target ...
-A combination of
-.Ql Ic .else
-followed by
-.Ql Ic .ifnmake .
-.It Ic .endif
-End the body of the conditional.
-.El
-.Pp
-The
-.Ar operator
-may be any one of the following:
-.Bl -tag -width "Cm XX"
-.It Cm \&|\&|
-Logical OR.
-.It Cm \&\*[Am]\*[Am]
-Logical
-.Tn AND ;
-of higher precedence than
-.Dq \&|\&| .
-.El
-.Pp
-As in C,
-.Nm
-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
-.Ql Ic \&!
-may be used to logically negate an entire
-conditional.
-It is of higher precedence than
-.Ql Ic \&\*[Am]\*[Am] .
-.Pp
-The value of
-.Ar expression
-may be any of the following:
-.Bl -tag -width defined
-.It Ic defined
-Takes a variable name as an argument and evaluates to true if the variable
-has been defined.
-.It Ic make
-Takes a target name as an argument and evaluates to true if the target
-was specified as part of
-.Nm Ns 's
-command line or was declared the default target (either implicitly or
-explicitly, see
-.Va .MAIN )
-before the line containing the conditional.
-.It Ic empty
-Takes a variable, with possible modifiers, and evaluates to true if
-the expansion of the variable would result in an empty string.
-.It Ic exists
-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
-.Va .PATH ) .
-.It Ic target
-Takes a target name as an argument and evaluates to true if the target
-has been defined.
-.It Ic commands
-Takes a target name as an argument and evaluates to true if the target
-has been defined and has commands associated with it.
-.El
-.Pp
-.Ar Expression
-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 supported.
-The standard C relational operators are all supported.
-If after
-variable expansion, either the left or right hand side of a
-.Ql Ic ==
-or
-.Ql Ic "!="
-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.
-.Pp
-When
-.Nm
-is evaluating one of these conditional expressions, and it encounters
-a (white-space separated) word it doesn't recognize, either the
-.Dq make
-or
-.Dq defined
-expression is applied to it, depending on the form of the conditional.
-If the form is
-.Ql Ic .ifdef ,
-.Ql Ic .ifndef ,
-or
-.Ql Ic .if
-the
-.Dq defined
-expression is applied.
-Similarly, if the form is
-.Ql Ic .ifmake
-or
-.Ql Ic .ifnmake , the
-.Dq make
-expression is applied.
-.Pp
-If the conditional evaluates to true the parsing of the makefile continues
-as before.
-If it evaluates to false, the following lines are skipped.
-In both cases this continues until a
-.Ql Ic .else
-or
-.Ql Ic .endif
-is found.
-.Pp
-For loops are typically used to apply a set of rules to a list of files.
-The syntax of a for loop is:
-.Pp
-.Bl -tag -compact -width Ds
-.It Ic \&.for Ar variable Oo Ar variable ... Oc Ic in Ar expression
-.It Aq make-rules
-.It Ic \&.endfor
-.El
-.Pp
-After the for
-.Ic expression
-is evaluated, it is split into words.
-On each iteration of the loop, one word is taken and assigned to each
-.Ic variable ,
-in order, and these
-.Ic variables
-are substituted into the
-.Ic make-rules
-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.
-.Sh COMMENTS
-Comments begin with a hash
-.Pq Ql \&#
-character, anywhere but in a shell
-command line, and continue to the end of an unescaped new line.
-.Sh SPECIAL SOURCES (ATTRIBUTES)
-.Bl -tag -width .IGNOREx
-.It Ic .EXEC
-Target is never out of date, but always execute commands anyway.
-.It Ic .IGNORE
-Ignore any errors from the commands associated with this target, exactly
-as if they all were preceded by a dash
-.Pq Ql \- .
-.\" .It Ic .INVISIBLE
-.\" XXX
-.\" .It Ic .JOIN
-.\" XXX
-.It Ic .MADE
-Mark all sources of this target as being up-to-date.
-.It Ic .MAKE
-Execute the commands associated with this target even if the
-.Fl n
-or
-.Fl t
-options were specified.
-Normally used to mark recursive
-.Nm Ns 's .
-.It Ic .NOPATH
-Do not search for the target in the directories specified by
-.Ic .PATH .
-.It Ic .NOTMAIN
-Normally
-.Nm
-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.
-.It Ic .OPTIONAL
-If a target is marked with this attribute and
-.Nm
-can't figure out how to create it, it will ignore this fact and assume
-the file isn't needed or already exists.
-.It Ic .PHONY
-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
-.Fl t
-option.
-Suffix-transformation rules are not applied to
-.Ic .PHONY
-targets.
-.It Ic .PRECIOUS
-When
-.Nm
-is interrupted, it normally removes any partially made targets.
-This source prevents the target from being removed.
-.It Ic .RECURSIVE
-Synonym for
-.Ic .MAKE .
-.It Ic .SILENT
-Do not echo any of the commands associated with this target, exactly
-as if they all were preceded by an at sign
-.Pq Ql @ .
-.It Ic .USE
-Turn the target into
-.Nm Ns 's
-version of a macro.
-When the target is used as a source for another target, the other target
-acquires the commands, sources, and attributes (except for
-.Ic .USE )
-of the
-source.
-If the target already has commands, the
-.Ic .USE
-target's commands are appended
-to them.
-.It Ic .USEBEFORE
-Exactly like
-.Ic .USE ,
-but prepend the
-.Ic .USEBEFORE
-target commands to the target.
-.It Ic .WAIT
-If
-.Ic .WAIT
-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 dependency tree.
-So given:
-.Bd -literal
-x: a .WAIT b
- echo x
-a:
- echo a
-b: b1
- echo b
-b1:
- echo b1
-
-.Ed
-the output is always
-.Ql a ,
-.Ql b1 ,
-.Ql b ,
-.Ql x .
-.br
-The ordering imposed by
-.Ic .WAIT
-is only relevant for parallel makes.
-.El
-.Sh SPECIAL TARGETS
-Special targets may not be included with other targets, i.e. they must be
-the only target specified.
-.Bl -tag -width .BEGINx
-.It Ic .BEGIN
-Any command lines attached to this target are executed before anything
-else is done.
-.It Ic .DEFAULT
-This is sort of a
-.Ic .USE
-rule for any target (that was used only as a
-source) that
-.Nm
-can't figure out any other way to create.
-Only the shell script is used.
-The
-.Ic .IMPSRC
-variable of a target that inherits
-.Ic .DEFAULT Ns 's
-commands is set
-to the target's own name.
-.It Ic .END
-Any command lines attached to this target are executed after everything
-else is done.
-.It Ic .ERROR
-Any command lines attached to this target are executed when another target fails.
-The
-.Ic .ERROR_TARGET
-variable is set to the target that failed.
-See also
-.Ic MAKE_PRINT_VAR_ON_ERROR .
-.It Ic .IGNORE
-Mark each of the sources with the
-.Ic .IGNORE
-attribute.
-If no sources are specified, this is the equivalent of specifying the
-.Fl i
-option.
-.It Ic .INTERRUPT
-If
-.Nm
-is interrupted, the commands for this target will be executed.
-.It Ic .MAIN
-If no target is specified when
-.Nm
-is invoked, this target will be built.
-.It Ic .MAKEFLAGS
-This target provides a way to specify flags for
-.Nm
-when the makefile is used.
-The flags are as if typed to the shell, though the
-.Fl f
-option will have
-no effect.
-.\" XXX: NOT YET!!!!
-.\" .It Ic .NOTPARALLEL
-.\" The named targets are executed in non parallel mode.
-.\" If no targets are
-.\" specified, then all targets are executed in non parallel mode.
-.It Ic .NOPATH
-Apply the
-.Ic .NOPATH
-attribute to any specified sources.
-.It Ic .NOTPARALLEL
-Disable parallel mode.
-.It Ic .NO_PARALLEL
-Synonym for
-.Ic .NOTPARALLEL ,
-for compatibility with other pmake variants.
-.It Ic .ORDER
-The named targets are made in sequence.
-This ordering does not add targets to the list of targets to be made.
-Since the dependents of a target do not get built until the target itself
-could be built, unless
-.Ql a
-is built by another part of the dependency graph,
-the following is a dependency loop:
-.Bd -literal
-\&.ORDER: a b
-b: a
-.Ed
-.Pp
-The ordering imposed by
-.Ic .ORDER
-is only relevant for parallel makes.
-.\" XXX: NOT YET!!!!
-.\" .It Ic .PARALLEL
-.\" The named targets are executed in parallel mode.
-.\" If no targets are
-.\" specified, then all targets are executed in parallel mode.
-.It Ic .PATH
-The sources are directories which are to be searched for files not
-found in the current directory.
-If no sources are specified, any previously specified directories are
-deleted.
-If the source is the special
-.Ic .DOTLAST
-target, then the current working
-directory is searched last.
-.It Ic .PHONY
-Apply the
-.Ic .PHONY
-attribute to any specified sources.
-.It Ic .PRECIOUS
-Apply the
-.Ic .PRECIOUS
-attribute to any specified sources.
-If no sources are specified, the
-.Ic .PRECIOUS
-attribute is applied to every
-target in the file.
-.It Ic .SHELL
-Sets the shell that
-.Nm
-will use to execute commands.
-The sources are a set of
-.Ar field=value
-pairs.
-.Bl -tag -width hasErrCtls
-.It Ar name
-This is the minimal specification, used to select one of the builtin
-shell specs;
-.Ar sh ,
-.Ar ksh ,
-and
-.Ar csh .
-.It Ar path
-Specifies the path to the shell.
-.It Ar hasErrCtl
-Indicates whether the shell supports exit on error.
-.It Ar check
-The command to turn on error checking.
-.It Ar ignore
-The command to disable error checking.
-.It Ar echo
-The command to turn on echoing of commands executed.
-.It Ar quiet
-The command to turn off echoing of commands executed.
-.It Ar filter
-The output to filter after issuing the
-.Ar quiet
-command.
-It is typically identical to
-.Ar quiet .
-.It Ar errFlag
-The flag to pass the shell to enable error checking.
-.It Ar echoFlag
-The flag to pass the shell to enable command echoing.
-.It Ar newline
-The string literal to pass the shell that results in a single newline
-character when used outside of any quoting characters.
-.El
-Example:
-.Bd -literal
-\&.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \e
- check="set -e" ignore="set +e" \e
- echo="set -v" quiet="set +v" filter="set +v" \e
- echoFlag=v errFlag=e newline="'\en'"
-.Ed
-.It Ic .SILENT
-Apply the
-.Ic .SILENT
-attribute to any specified sources.
-If no sources are specified, the
-.Ic .SILENT
-attribute is applied to every
-command in the file.
-.It Ic .SUFFIXES
-Each source specifies a suffix to
-.Nm .
-If no sources are specified, any previously specified suffixes are deleted.
-It allows the creation of suffix-transformation rules.
-.Pp
-Example:
-.Bd -literal
-\&.SUFFIXES: .o
-\&.c.o:
- cc -o ${.TARGET} -c ${.IMPSRC}
-.Ed
-.El
-.Sh ENVIRONMENT
-.Nm
-uses the following environment variables, if they exist:
-.Ev MACHINE ,
-.Ev MACHINE_ARCH ,
-.Ev MAKE ,
-.Ev MAKEFLAGS ,
-.Ev MAKEOBJDIR ,
-.Ev MAKEOBJDIRPREFIX ,
-.Ev MAKESYSPATH ,
-.Ev PWD ,
-and
-.Ev TMPDIR .
-.Pp
-.Ev MAKEOBJDIRPREFIX
-and
-.Ev MAKEOBJDIR
-may only be set in the environment or on the command line to
-.Nm
-and not as makefile variables;
-see the description of
-.Ql Va .OBJDIR
-for more details.
-.Sh FILES
-.Bl -tag -width /usr/share/mk -compact
-.It .depend
-list of dependencies
-.It Makefile
-list of dependencies
-.It makefile
-list of dependencies
-.It sys.mk
-system makefile
-.It /usr/share/mk
-system makefile directory
-.El
-.Sh COMPATIBILITY
-The basic make syntax is compatible between different versions of make,
-however the special variables, variable modifiers and conditionals are not.
-.Pp
-The way that parallel makes are scheduled changed in
-.Nx 4.0
-so that .ORDER and .WAIT apply recursively to the dependant nodes.
-The algorithms used may change again in the future.
-.Pp
-The way that .for loop variables are substituted changed after
-.Nx 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.
-.Sh SEE ALSO
-.Xr mkdep 1
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v7 .
-.Sh BUGS
-The
-.Nm
-syntax is difficult to parse without actually acting of the data.
-For instance finding the end of a variable use should involve scanning each
-the modifiers using the correct terminator for each field.
-In many places
-.Nm
-just counts {} and () in order to find the end of a variable expansion.
-.Pp
-There is no way of escaping a space character in a filename.