1274 lines
33 KiB
Groff
1274 lines
33 KiB
Groff
.\" $NetBSD: make.1,v 1.68 2002/11/02 04:13:41 perry 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. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by the University of
|
|
.\" California, Berkeley and its contributors.
|
|
.\" 4. 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 March 20, 2002
|
|
.Dt MAKE 1
|
|
.Os
|
|
.Sh NAME
|
|
.Nm make
|
|
.Nd maintain program dependencies
|
|
.Sh SYNOPSIS
|
|
.Nm ""
|
|
.Op Fl BeikNnqrstW
|
|
.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 max_jobs
|
|
.Ek
|
|
.Bk -words
|
|
.Op Fl J Ar private
|
|
.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 the file
|
|
.Ql Pa makefile
|
|
exists, it is read for this list of specifications.
|
|
If it does not exist, the file
|
|
.Ql Pa Makefile
|
|
is read.
|
|
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
|
|
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 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.
|
|
.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 conditional evaluation.
|
|
.It Ar d
|
|
Print debugging information about directory searching and caching.
|
|
.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 j
|
|
Print debugging information about running multiple shells.
|
|
.It Ar m
|
|
Print debugging information about making targets, including modification
|
|
dates.
|
|
.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
|
|
and
|
|
If
|
|
.Ar makefile
|
|
is
|
|
.Ql Fl ,
|
|
standard input is read.
|
|
Multiple makefile's 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.
|
|
.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 \*[Lt]...\*[Gt] style.
|
|
Multiple directories can be added 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 "..."-style inclusions (see the
|
|
.Fl I
|
|
option).
|
|
.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.
|
|
.It Fl W
|
|
Treat any warnings during makefile parsing as errors.
|
|
.It Ar variable=value
|
|
Set the value of the variable
|
|
.Ar variable
|
|
to
|
|
.Ar value .
|
|
.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 ``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 or first two characters of the command line are
|
|
.Ql Ic @
|
|
and/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 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.
|
|
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.
|
|
.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
|
|
Variable substitution occurs at two distinct times, depending on where
|
|
the variable is being used.
|
|
Variables in dependency lines are expanded as the line is read.
|
|
Variables in shell commands are expanded when the shell command is
|
|
executed.
|
|
.Pp
|
|
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
|
|
The name/path of the source from which the target is to be transformed
|
|
(the ``implied'' source); also known as
|
|
.Ql Va \&\*[Lt] .
|
|
.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
|
|
.Pp
|
|
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.
|
|
.Pq Va argv[0]
|
|
.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.
|
|
.It Va .MAKE
|
|
The name that
|
|
.Nm
|
|
was executed with.
|
|
.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 .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_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 :@ 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.
|
|
.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 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.
|
|
.Ql Ev PWD
|
|
is set to the value of
|
|
.Ql Va .OBJDIR
|
|
for all programs which
|
|
.Nm
|
|
executes.
|
|
.El
|
|
.Pp
|
|
Variable expansion may be modified to select or modify each word of the
|
|
variable (where a ``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 and one of the following
|
|
special characters.
|
|
The colon may be escaped with a backslash
|
|
.Pq Ql \e .
|
|
.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 the rest of the modifier.
|
|
The standard shell wildcard characters
|
|
.Pf ( Ql * ,
|
|
.Ql ? ,
|
|
and
|
|
.Ql Op )
|
|
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
|
|
the rest of the modifier.
|
|
.It Cm O
|
|
Order every word in variable alphabetically.
|
|
.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 tl
|
|
Converts variable to lower-case letters.
|
|
.It Cm tu
|
|
Converts variable to upper-case letters.
|
|
.Sm off
|
|
.It Cm S No \&/ Ar old_string Xo
|
|
.No \&/ Ar new_string
|
|
.No \&/ Op Cm 1g
|
|
.Xc
|
|
.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
|
|
.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 Xo
|
|
.No \&/ Ar replacement
|
|
.No \&/ Op Cm 1g
|
|
.Xc
|
|
.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 )
|
|
and an
|
|
.Xr ed 1 Ns \-style
|
|
replacement string.
|
|
Normally, the first occurrence of the pattern in
|
|
each word of the value is changed.
|
|
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 as occur in the word or words it is found in.
|
|
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 ) .
|
|
.It Cm ? Ar true_string Cm : Ar false_string
|
|
If the variable evaluates to true, return as its value the
|
|
.Ar true_string ,
|
|
otherwise return the
|
|
.Ar false_string .
|
|
.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 .
|
|
.It Cm @ Ar temp Cm @ Xo
|
|
.No Ar string Cm @
|
|
.Xc
|
|
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 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 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.
|
|
.It Cm ! Ar cmd Cm !
|
|
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 \&:= 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 apply modifiers to
|
|
.Cm \&.for
|
|
loop iteration variables which won't work due to the way
|
|
.Cm \&.for
|
|
loops are implemented.
|
|
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.
|
|
As in:
|
|
.Bd -literal
|
|
use_foo: \&.USE
|
|
\&.for i in ${\&.TARGET} ${\&.TARGET:R}\&.gz
|
|
@: ${t::=$i}
|
|
@echo t:R:T=${t:R:T}
|
|
\&.endfor
|
|
|
|
.Ed
|
|
The double
|
|
.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 \&:?= Ar str
|
|
As for
|
|
.Cm \&:=
|
|
but only if the variable does not already have a value.
|
|
.It Cm \&:+= Ar str
|
|
Append
|
|
.Ar str
|
|
to the variable.
|
|
.It Cm \&:!= Ar cmd
|
|
Assign the output of
|
|
.Ar cmd
|
|
to the variable.
|
|
.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 .undef Ar variable
|
|
Un-define the specified global variable.
|
|
Only global variables may be un-defined.
|
|
.It Xo
|
|
.Ic \&.if
|
|
.Oo \&! Oc Ns Ar expression
|
|
.Op Ar operator expression ...
|
|
.Xc
|
|
Test the value of an expression.
|
|
.It Xo
|
|
.Ic .ifdef
|
|
.Oo \&! Oc Ns Ar variable
|
|
.Op Ar operator variable ...
|
|
.Xc
|
|
Test the value of a variable.
|
|
.It Xo
|
|
.Ic .ifndef
|
|
.Oo \&! Oc Ns Ar variable
|
|
.Op Ar operator variable ...
|
|
.Xc
|
|
Test the value of a variable.
|
|
.It Xo
|
|
.Ic .ifmake
|
|
.Oo \&! Oc Ns Ar target
|
|
.Op Ar operator target ...
|
|
.Xc
|
|
Test the target being built.
|
|
.It Xo
|
|
.Ic .ifnmake
|
|
.Oo \&! Oc Ar target
|
|
.Op Ar operator target ...
|
|
.Xc
|
|
Test the target being built.
|
|
.It Ic .else
|
|
Reverse the sense of the last conditional.
|
|
.It Xo
|
|
.Ic .elif
|
|
.Oo \&! Oc Ar expression
|
|
.Op Ar operator expression ...
|
|
.Xc
|
|
A combination of
|
|
.Ql Ic .else
|
|
followed by
|
|
.Ql Ic .if .
|
|
.It Xo
|
|
.Ic .elifdef
|
|
.Oo \&! Oc Ns Ar variable
|
|
.Op Ar operator variable ...
|
|
.Xc
|
|
A combination of
|
|
.Ql Ic .else
|
|
followed by
|
|
.Ql Ic .ifdef .
|
|
.It Xo
|
|
.Ic .elifndef
|
|
.Oo \&! Oc Ns Ar variable
|
|
.Op Ar operator variable ...
|
|
.Xc
|
|
A combination of
|
|
.Ql Ic .else
|
|
followed by
|
|
.Ql Ic .ifndef .
|
|
.It Xo
|
|
.Ic .elifmake
|
|
.Oo \&! Oc Ns Ar target
|
|
.Op Ar operator target ...
|
|
.Xc
|
|
A combination of
|
|
.Ql Ic .else
|
|
followed by
|
|
.Ql Ic .ifmake .
|
|
.It Xo
|
|
.Ic .elifnmake
|
|
.Oo \&! Oc Ns Ar target
|
|
.Op Ar operator target ...
|
|
.Xc
|
|
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.
|
|
.Pp
|
|
When
|
|
.Nm
|
|
is evaluating one of these conditional expression, and it encounters
|
|
a word it doesn't recognize, either the ``make'' or ``defined''
|
|
expression is applied to it, depending on the form of the conditional.
|
|
If the form is
|
|
.Ql Ic .ifdef
|
|
or
|
|
.Ql Ic .ifndef ,
|
|
the ``defined'' expression
|
|
is applied.
|
|
Similarly, if the form is
|
|
.Ql Ic .ifmake
|
|
or
|
|
.Ql Ic .ifnmake , the ``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 Xo
|
|
.Ic \&.for
|
|
.Ar variable
|
|
.Op Ar variable ...
|
|
.Ic in
|
|
.Ar expression
|
|
.Xc
|
|
.It Xo
|
|
\*[Lt]make-rules\*[Gt]
|
|
.Ic \&.endfor
|
|
.Xc
|
|
.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 the line.
|
|
.Sh SPECIAL SOURCES
|
|
.Bl -tag -width .IGNOREx
|
|
.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 .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 .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 .PRECIOUS
|
|
When
|
|
.Nm
|
|
is interrupted, it removes any partially made targets.
|
|
This source prevents the target from being removed.
|
|
.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 special
|
|
.Ic .WAIT
|
|
source is appears in a dependency line, the sources that precede it are
|
|
made before the sources that succeed it in the line.
|
|
Loops are not being
|
|
detected and targets that form loops will be silently ignored.
|
|
.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 .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.
|
|
Targets with this attribute are not
|
|
searched for in the directories specified by
|
|
.Ic .PATH .
|
|
.It Ic .NOTPARALLEL
|
|
Disable parallel mode.
|
|
.It Ic .NO_PARALLEL
|
|
Same as above, for compatibility with other pmake variants.
|
|
.It Ic .ORDER
|
|
The named targets are made in sequence.
|
|
.\" 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.
|
|
Targets with this attribute do not
|
|
correspond to actual files; they are always considered to be out of date,
|
|
and will not be created with the
|
|
.Fl t
|
|
option.
|
|
.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 .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 previous specified suffixes are deleted.
|
|
.El
|
|
.Sh ENVIRONMENT
|
|
.Nm
|
|
utilizes the following environment variables, if they exist:
|
|
.Ev MACHINE ,
|
|
.Ev MACHINE_ARCH ,
|
|
.Ev MAKE ,
|
|
.Ev MAKEFLAGS ,
|
|
.Ev MAKEOBJDIR ,
|
|
.Ev MAKEOBJDIRPREFIX ,
|
|
and
|
|
.Ev PWD .
|
|
.Pp
|
|
If
|
|
.Ev MAKEOBJDIRPREFIX
|
|
is set, then
|
|
.Nm
|
|
will
|
|
.Xr chdir 2
|
|
to ${MAKEOBJDIRPREFIX}${.CURDIR} if it exists.
|
|
Otherwise if
|
|
.Ev MAKEOBJDIR
|
|
and the named directory exists
|
|
.Nm
|
|
will
|
|
.Xr chdir 2
|
|
to it.
|
|
These actions are taken before any makefiles are read which is why they
|
|
need to be set in the environment.
|
|
.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 SEE ALSO
|
|
.Xr mkdep 1
|
|
.Sh HISTORY
|
|
A
|
|
.Nm
|
|
command appeared in
|
|
.At v7 .
|