1942 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			1942 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\"	$NetBSD: make.1,v 1.176 2010/06/10 18:35:22 wiz 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 9, 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 file, 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 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.
 | 
						|
.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.
 |