707c22856e
to defined(), e.g., ``.if 1'' is equivalent to ``.if defined(1)'', which is only true when the ${1} variable is defined.
1279 lines
32 KiB
Groff
1279 lines
32 KiB
Groff
.\" 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.
|
|
.\"
|
|
.\" @(#)make.1 8.8 (Berkeley) 6/13/95
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd June 13, 1995
|
|
.Dt MAKE 1
|
|
.Os
|
|
.Sh NAME
|
|
.Nm make
|
|
.Nd maintain program dependencies
|
|
.Sh SYNOPSIS
|
|
.Nm
|
|
.Op Fl BPSXeiknqrstv
|
|
.Op Fl C Ar directory
|
|
.Op Fl D Ar variable
|
|
.Op Fl d Ar flags
|
|
.Op Fl E Ar variable
|
|
.Op Fl f Ar makefile
|
|
.Op Fl I Ar directory
|
|
.Bk -words
|
|
.Op Fl j Ar max_jobs
|
|
.Op Fl m Ar directory
|
|
.Ek
|
|
.Op Fl V Ar variable
|
|
.Op Ar variable Ns No = Ns Ar value
|
|
.Op Ar target ...
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Nm
|
|
utility is a program designed to simplify the maintenance of other programs.
|
|
Its input is a list of specifications
|
|
describing dependency relationships between the generation of
|
|
files and programs.
|
|
The first of
|
|
.Ql Pa BSDmakefile ,
|
|
.Ql Pa makefile
|
|
and
|
|
.Ql Pa Makefile
|
|
that can be found in either the current directory or a special object directory
|
|
(see
|
|
.Ql Va .OBJDIR )
|
|
will be read for this list of specifications.
|
|
If the file
|
|
.Ql Pa .depend
|
|
can be found, it is also read (see
|
|
.Xr mkdep 1 ) .
|
|
.Pp
|
|
This manual page is intended as a reference document only.
|
|
For a more thorough introduction to
|
|
.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.
|
|
This is turned on by default unless
|
|
.Fl j
|
|
is used.
|
|
.It Fl C Ar directory
|
|
Change to
|
|
.Ar directory
|
|
while running.
|
|
.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.
|
|
Argument
|
|
.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 f
|
|
Print debugging information about the execution of for loops.
|
|
.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 l
|
|
Print commands in Makefiles regardless of whether or not they are prefixed
|
|
by @ or other "quiet" flags.
|
|
Also known as "loud" behavior.
|
|
.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.
|
|
.El
|
|
.It Fl E Ar variable
|
|
Specify a variable whose environment value (if any) will override
|
|
macro assignments within makefiles.
|
|
.It Fl e
|
|
Specify that environment values override macro assignments within
|
|
makefiles for all variables.
|
|
.It Fl f Ar makefile
|
|
Specify a makefile to read instead of the default
|
|
.Ql Pa makefile
|
|
and
|
|
.Ql Pa Makefile .
|
|
If
|
|
.Ar makefile
|
|
is
|
|
.Ql \- ,
|
|
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 \-
|
|
before each command line in the makefile.
|
|
.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
|
|
.Pa sys.mk
|
|
and makefiles included via the <...> style.
|
|
Multiple directories can be added to form a search path.
|
|
This path will override the default system include path:
|
|
.Pa /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.
|
|
.It Fl P
|
|
Collate the output of a given job and display it only when the job finishes,
|
|
instead of mixing the output of parallel jobs together.
|
|
This option has no effect unless
|
|
.Fl j
|
|
is used too.
|
|
.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
|
|
Stop processing when an error is encountered.
|
|
Default behaviour.
|
|
This is needed to negate the
|
|
.Fl k
|
|
option during recursive builds.
|
|
.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
|
|
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 v
|
|
Be extra verbose.
|
|
For multi-job makes, this will cause file banners to be generated.
|
|
.It Fl X
|
|
When using the
|
|
.Fl V
|
|
option to print the values of variables,
|
|
do not recursively expand the values.
|
|
.It Ar variable Ns No = Ns Ar 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
|
|
.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 expressions
|
|
.Ql \&? ,
|
|
.Ql * ,
|
|
.Ql []
|
|
and
|
|
.Ql {} .
|
|
The expressions
|
|
.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 expression
|
|
.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
|
|
.Nm
|
|
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 whitespace 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 \&> .
|
|
.It Va .ARCHIVE
|
|
The name of the archive file; also known as
|
|
.Ql Va \&! .
|
|
.It Va .IMPSRC
|
|
The name/path of the source from which the target is to be transformed
|
|
(the
|
|
.Dq implied
|
|
source); also known as
|
|
.Ql Va \&< .
|
|
.It Va .MEMBER
|
|
The name of the archive member; also known as
|
|
.Ql Va \&% .
|
|
.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 \&< ,
|
|
.Ql Va \&% ,
|
|
.Ql Va \&? ,
|
|
.Ql Va \&> ,
|
|
and
|
|
.Ql Va *
|
|
are permitted for backward
|
|
compatibility and are not recommended.
|
|
The six variables
|
|
.Ql Va "@F" ,
|
|
.Ql Va "@D" ,
|
|
.Ql Va "<F" ,
|
|
.Ql Va "<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 internal variables or environment
|
|
variables:
|
|
.Bl -tag -width MAKEFLAGS
|
|
.It Va \&$
|
|
A single dollar sign
|
|
.Ql \&$ ,
|
|
i.e.\&
|
|
.Ql \&$$
|
|
expands to a single dollar
|
|
sign.
|
|
.It Va MAKE
|
|
The name that
|
|
.Nm
|
|
was executed with
|
|
.Pq Va argv Ns Op 0 .
|
|
.It Va .CURDIR
|
|
A path to the directory where
|
|
.Nm
|
|
was executed.
|
|
The
|
|
.Nm
|
|
utility sets
|
|
.Va .CURDIR
|
|
to the canonical path given by
|
|
.Xr getcwd 3 .
|
|
.It Va .OBJDIR
|
|
A path to the directory where the targets are built.
|
|
At startup,
|
|
.Nm
|
|
searches for an alternate directory to place target files.
|
|
It will attempt to change into this special directory
|
|
and will search this directory for makefiles
|
|
not found in the current directory.
|
|
The following directories are tried in order:
|
|
.Pp
|
|
.Bl -enum -compact
|
|
.It
|
|
${MAKEOBJDIRPREFIX}/`pwd`
|
|
.It
|
|
${MAKEOBJDIR}
|
|
.It
|
|
obj.${MACHINE}
|
|
.It
|
|
obj
|
|
.It
|
|
/usr/obj/`pwd`
|
|
.El
|
|
.Pp
|
|
The first directory that
|
|
.Nm
|
|
successfully changes into is used.
|
|
If either
|
|
.Ev MAKEOBJDIRPREFIX
|
|
or
|
|
.Ev MAKEOBJDIR
|
|
is set in the environment but
|
|
.Nm
|
|
is unable to change into the corresponding directory,
|
|
then the current directory is used
|
|
without checking the remainder of the list.
|
|
If they are undefined and
|
|
.Nm
|
|
is unable to change into any of the remaining three directories,
|
|
then the current directory is used.
|
|
.Pp
|
|
The
|
|
.Nm
|
|
utility sets
|
|
.Va .OBJDIR
|
|
to the canonical path given by
|
|
.Xr getcwd 3 .
|
|
.It Va .MAKEFLAGS
|
|
The environment variable
|
|
.Ev MAKEFLAGS
|
|
may contain anything that
|
|
may be specified on
|
|
.Nm Ns 's
|
|
command line.
|
|
Its contents are stored in
|
|
.Nm Ns 's
|
|
.Va .MAKEFLAGS
|
|
variable.
|
|
Anything specified on
|
|
.Nm Ns 's
|
|
command line is appended to the
|
|
.Va .MAKEFLAGS
|
|
variable which is then
|
|
entered into the environment as
|
|
.Ev MAKEFLAGS
|
|
for all programs which
|
|
.Nm
|
|
executes.
|
|
.It Va MFLAGS
|
|
A synonym for
|
|
.Va .MAKEFLAGS
|
|
provided for backward compatibility.
|
|
.It Va .TARGETS
|
|
List of targets
|
|
.Nm
|
|
is currently building.
|
|
.It Va .INCLUDES
|
|
See
|
|
.Ic .INCLUDES
|
|
special target.
|
|
.It Va .LIBS
|
|
See
|
|
.Ic .LIBS
|
|
special target.
|
|
.It Va MACHINE
|
|
Name of the machine architecture
|
|
.Nm
|
|
is running on, obtained from the
|
|
.Ev MACHINE
|
|
environment variable, or through
|
|
.Xr uname 3
|
|
if not defined.
|
|
.It Va MACHINE_ARCH
|
|
Name of the machine architecture
|
|
.Nm
|
|
was compiled for, defined at compilation time.
|
|
.It Va VPATH
|
|
Makefiles may assign a colon-delimited list of directories to
|
|
.Va VPATH .
|
|
These directories will be searched for source files by
|
|
.Nm
|
|
after it has finished parsing all input makefiles.
|
|
.El
|
|
.Pp
|
|
Variable expansion may be modified to select or modify each word of the
|
|
variable (where a
|
|
.Dq word
|
|
is whitespace-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 Cm
|
|
.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 an extended regular expression (see
|
|
.Xr re_format 7 )
|
|
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 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 L
|
|
Converts variable to lower-case letters.
|
|
.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
|
|
.Cm M ,
|
|
but selects all words which do not match
|
|
the rest of the modifier.
|
|
.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.
|
|
.Sm off
|
|
.It Cm S No \&/ Ar old_string Xo
|
|
.No \&/ Ar new_string
|
|
.No \&/ Op Cm g
|
|
.Xc
|
|
.Sm on
|
|
Modify the first occurrence of
|
|
.Ar old_string
|
|
in each word of 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
|
|
.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 &
|
|
is replaced by
|
|
.Ar old_string .
|
|
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.
|
|
.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 T
|
|
Replaces each word in the variable with its last component.
|
|
.It Cm U
|
|
Converts variable to upper-case letters.
|
|
.El
|
|
.Sh DIRECTIVES, CONDITIONALS, AND FOR LOOPS
|
|
Directives, conditionals, 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.
|
|
The following directives are supported:
|
|
.Bl -tag -width Ds
|
|
.It Ic \&.include Ar <file>
|
|
.It Ic \&.include Ar \*qfile\*q
|
|
Include the specified makefile.
|
|
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.
|
|
.It Ic \&.undef Ar variable
|
|
Un-define the specified global variable.
|
|
Only global variables may be un-defined.
|
|
.It Ic \&.error Ar message
|
|
Terminate processing of the makefile immediately.
|
|
The filename of the
|
|
makefile, the line on which the error was encountered and the specified
|
|
message are printed to standard output and
|
|
.Nm
|
|
terminates with exit code 1.
|
|
Variables in the message are expanded.
|
|
.El
|
|
.Pp
|
|
Conditionals are used to determine which parts of the Makefile
|
|
to process.
|
|
They are used similarly to the conditionals supported
|
|
by the C pre-processor.
|
|
The following conditionals are supported:
|
|
.Bl -tag -width Ds
|
|
.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 Ns 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 Ns 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
|
|
.Tn OR
|
|
.It Cm \&&&
|
|
Logical
|
|
.Tn AND ;
|
|
of higher precedence than
|
|
.Ql Ic || .
|
|
.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 \&&& .
|
|
.Pp
|
|
The value of
|
|
.Ar expression
|
|
may be any of the following:
|
|
.Bl -tag -width Ic
|
|
.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.
|
|
.El
|
|
.Pp
|
|
An
|
|
.Ar expression
|
|
may also be an arithmetic or string comparison, with the left-hand side
|
|
being a variable expansion.
|
|
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 expressions, and it encounters
|
|
a 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 .if ,
|
|
.Ql Ic .ifdef
|
|
or
|
|
.Ql Ic .ifndef ,
|
|
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 -width indent -compact
|
|
.It Ic .for Ar variable Ic in Ar expression
|
|
.It <make-rules>
|
|
.It Ic \&.endfor
|
|
.El
|
|
.Pp
|
|
After the for
|
|
.Ar expression
|
|
is evaluated, it is split into words.
|
|
The
|
|
iteration
|
|
.Ar variable
|
|
is successively set to each word, and substituted in the
|
|
.Ic make-rules
|
|
inside the body of the for loop.
|
|
.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 Ic
|
|
.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 .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 .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 Ic
|
|
.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 .INCLUDES
|
|
A list of suffixes that indicate files that can be included in a source
|
|
file.
|
|
The suffix must have already been declared with
|
|
.Ic .SUFFIXES ;
|
|
any suffix so declared will have the directories on its search path (see
|
|
.Ic .PATH )
|
|
placed in the
|
|
.Va .INCLUDES
|
|
special variable, each preceded by a
|
|
.Fl I
|
|
flag.
|
|
.It Ic .INTERRUPT
|
|
If
|
|
.Nm
|
|
is interrupted, the commands for this target will be executed.
|
|
.It Ic .LIBS
|
|
This does for libraries what
|
|
.Ic .INCLUDES
|
|
does for include files, except that the flag used is
|
|
.Fl L .
|
|
.It Ic .MAIN
|
|
If no target is specified when
|
|
.Nm
|
|
is invoked, this target will be built.
|
|
This is always set, either
|
|
explicitly, or implicitly when
|
|
.Nm
|
|
selects the default target, to give the user a way to refer to the default
|
|
target on the command line.
|
|
.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 .NOTPARALLEL
|
|
Disable parallel mode.
|
|
.It Ic .NO_PARALLEL
|
|
Same as above, for compatibility with other
|
|
.Nm 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.
|
|
Where possible, use of
|
|
.Ic .PATH
|
|
is preferred over use of the
|
|
.Va VPATH
|
|
variable.
|
|
.It Ic .PATH\fIsuffix\fR
|
|
The sources are directories which are to be searched for suffixed files
|
|
not found in the current directory.
|
|
The
|
|
.Nm
|
|
utility
|
|
first searches the suffixed search path, before reverting to the default
|
|
path if the file is not found there.
|
|
This form is required for
|
|
.Ic .LIBS
|
|
and
|
|
.Ic .INCLUDES
|
|
to work.
|
|
.It Ic .PHONY
|
|
Apply the
|
|
.Ic .PHONY
|
|
attribute to any specified sources.
|
|
Targets with this attribute are always
|
|
considered to be out of date.
|
|
.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 suffices are deleted.
|
|
.El
|
|
.Sh COMPATIBILITY
|
|
Older versions of
|
|
.Nm
|
|
used
|
|
.Ev MAKE
|
|
instead of
|
|
.Ev MAKEFLAGS .
|
|
This was removed for POSIX compatibility.
|
|
The internal variable
|
|
.Va MAKE
|
|
is set to the same value as
|
|
.Va .MAKE ;
|
|
support for this may be removed in the future.
|
|
.Pp
|
|
Most of the more esoteric features of
|
|
.Nm
|
|
should probably be avoided for greater compatibility.
|
|
.Sh ENVIRONMENT
|
|
The
|
|
.Nm
|
|
utility uses the following environment variables, if they exist:
|
|
.Ev MACHINE ,
|
|
.Ev MAKE ,
|
|
.Ev MAKEFLAGS ,
|
|
.Ev MAKEOBJDIR ,
|
|
and
|
|
.Ev MAKEOBJDIRPREFIX .
|
|
.Sh FILES
|
|
.Bl -tag -width /usr/share/doc/psd/12.make -compact
|
|
.It Pa .depend
|
|
list of dependencies
|
|
.It Pa Makefile
|
|
list of dependencies
|
|
.It Pa makefile
|
|
list of dependencies
|
|
.It obj
|
|
object directory
|
|
.It Pa sys.mk
|
|
system makefile (processed before any other file, including
|
|
.Pa makefile
|
|
and
|
|
.Pa Makefile )
|
|
.It Pa /usr/share/mk
|
|
system makefile directory
|
|
.It /usr/share/doc/psd/12.make
|
|
PMake tutorial
|
|
.It Pa /usr/obj
|
|
default
|
|
.Ev MAKEOBJDIRPREFIX
|
|
directory.
|
|
.El
|
|
.Sh BUGS
|
|
The determination of
|
|
.Va .OBJDIR
|
|
is contorted to the point of absurdity.
|
|
.Pp
|
|
In the presence of several
|
|
.Ic .MAIN
|
|
special targets,
|
|
.Nm
|
|
silently ignores all but the first.
|
|
.Pp
|
|
.Va .TARGETS
|
|
is not set to the default target when
|
|
.Nm
|
|
is invoked without a target name and no
|
|
.Ic .MAIN
|
|
special target exists.
|
|
.Pp
|
|
The evaluation of
|
|
.Ar expression
|
|
in a test is very simple-minded.
|
|
Currently, the only form that works is
|
|
.Ql .if ${VAR} op something
|
|
For instance, you should write tests as
|
|
.Ql .if ${VAR} = "string"
|
|
not the other way around, which doesn't work.
|
|
.Pp
|
|
For loops are expanded before tests, so a fragment such as:
|
|
.Bd -literal -offset indent
|
|
\&.for TMACHINE in ${SHARED_ARCHS}
|
|
\&.if ${TMACHINE} = ${MACHINE}
|
|
...
|
|
\&.endif
|
|
\&.endfor
|
|
.Ed
|
|
.Pp
|
|
won't work, and should be rewritten the other way around.
|
|
.Pp
|
|
The parsing code is broken with respect to handling a semicolon
|
|
after a colon, so a fragment like this will fail:
|
|
.Bd -literal -offset indent
|
|
HDRS= foo.h bar.h
|
|
|
|
all:
|
|
\&.for h in ${HDRS:S;^;${.CURDIR}/;}
|
|
...
|
|
\&.endfor
|
|
.Ed
|
|
.Sh SEE ALSO
|
|
.Xr mkdep 1 ,
|
|
.Xr make.conf 5
|
|
.Rs
|
|
.%T "PMake - A Tutorial"
|
|
.Re
|
|
in
|
|
.Pa /usr/share/doc/psd/12.make
|
|
.Sh HISTORY
|
|
A
|
|
.Nm
|
|
command appeared in PWB UNIX.
|