make(1S)
NAME
make - maintain, update, and regenerate related programs and
files
SYNOPSIS
/usr/ccs/bin/make [-d] [-dd] [-D] [-DD] [-e] [-i] [-k] [-n]
[-p] [-P] [-q] [-r] [-s] [-S] [-t] [-V] [-f makefile]...
[-K statefile]... [target...] [ macro = value...]
/usr/xpg4/bin/make [-d] [-dd] [-D] [-DD] [-e] [-i] [-k] [-n]
[-p] [-P] [-q] [-r] [-s] [-S] [-t] [-V] [-f makefile]...
[target...] [ macro = value...]
DESCRIPTION
The make utility executes a list of shell commands associ-
ated with each target, typically to create or update a file
of the same name. makefile contains entries that describe
how to bring a target up to date with respect to those on
which it depends, which are called dependencies. Since each
dependency is a target, it may have dependencies of its own.
Targets, dependencies, and sub-dependencies comprise a tree
structure that make traces when deciding whether or not to
rebuild a target.
The make utility recursively checks each target against its
dependencies, beginning with the first target entry in
makefile if no target argument is supplied on the command
line. If, after processing all of its dependencies, a target
file is found either to be missing, or to be older than any
of its dependencies, make rebuilds it. Optionally with this
version of make, a target can be treated as out-of-date when
the commands used to generate it have changed since the last
time the target was built.
To build a given target, make executes the list of commands,
called a rule. This rule may be listed explicitly in the
target's makefile entry, or it may be supplied implicitly by
make.
If no target is specified on the command line, make uses the
first target defined in makefile.
If a target has no makefile entry, or if its entry has no
rule, make attempts to derive a rule by each of the follow-
ing methods, in turn, until a suitable rule is found. Each
method is described under USAGE below.
o Pattern matching rules.
o Implicit rules, read in from a user-supplied makefile.
o Standard implicit rules (also known as suffix rules),
typically read in from the file
/usr/share/lib/make/make.rules.
o SCCS retrieval. make retrieves the most recent version
from the SCCS history file (if any). See the descrip-
tion of the .SCCS_GET: special-function target for
details.
o The rule from the .DEFAULT: target entry, if there is
such an entry in the makefile.
If there is no makefile entry for a target, if no rule can
be derived for building it, and if no file by that name is
present, make issues an error message and halts.
OPTIONS
The following options are supported:
-d Displays the reasons why make chooses to rebuild a
target. make displays any and all dependencies that
are newer. In addition, make displays options read in
from the MAKEFLAGS environment variable.
-dd Displays the dependency check and processing in vast
detail.
-D Displays the text of the makefiles read in.
-DD Displays the text of the makefiles, make.rules file,
the state file, and all hidden-dependency reports.
-e Environment variables override assignments within
makefiles.
-f makefile
Uses the description file makefile. A `-' as the
makefile argument denotes the standard input. The con-
tents of makefile, when present, override the standard
set of implicit rules and predefined macros. When
more than one `-f makefile' argument pair appears,
make uses the concatenation of those files, in order
of appearance.
When no makefile is specified, /usr/ccs/bin/make tries
the following in sequence, except when in POSIX mode
(see the .POSIX Special-Function Targets in the USAGE
section below):
o If there is a file named makefile in the working
directory, make uses that file. If, however,
there is an SCCS history file (SCCS/s.makefile)
which is newer, make attempts to retrieve and
use the most recent version.
o In the absence of the above file(s), if a file
named Makefile is present in the working direc-
tory, make attempts to use it. If there is an
SCCS history file (SCCS/s.Makefile) that is
newer, make attempts to retrieve and use the
most recent version.
When no makefile is specified, /usr/ccs/bin/make in
POSIX mode and /usr/xpg4/bin/make try the following
files in sequence:
o ./makefile, ./Makefile
o s.makefile, SCCS/s.makefile
o s.Makefile, SCCS/s.Makefile
-i Ignores error codes returned by commands. Equivalent
to the special-function target `.IGNORE:'.
-k When a nonzero error status is returned by a rule, or
when make cannot find a rule, abandons work on the
current target, but continues with other dependency
branches that do not depend on it.
-K statefile
Uses the state file statefile. A `-' as the statefile
argument denotes the standard input. The contents of
statefile, when present, override the standard set of
implicit rules and predefined macros. When more than
one `-K statefile' argument pair appears, make uses
the concatenation of those files, in order of appear-
ance. (See also .KEEP_STATE and .KEEP_STATE_FILE in
the Special-Function Targets section).
-n No execution mode. Prints commands, but does not exe-
cute them. Even lines beginning with an @ are printed.
However, if a command line contains a reference to the
$(MAKE) macro, that line is always executed (see the
discussion of MAKEFLAGS in Reading Makefiles and the
Environment). When in POSIX mode, lines beginning with
a "+" are executed.
-p Prints out the complete set of macro definitions and
target descriptions.
-P Merely reports dependencies, rather than building
them.
-q Question mode. make returns a zero or nonzero status
code depending on whether or not the target file is up
to date. When in POSIX mode, lines beginning with a
"+" are executed.
-r Does not read in the default makefile
/usr/share/lib/make/make.rules.
-s Silent mode. Does not print command lines before exe-
cuting them. Equivalent to the special-function target
.SILENT:.
-S Undoes the effect of the -k option. Stops processing
when a non-zero exit status is returned by a command.
-t Touches the target files (bringing them up to date)
rather than performing their rules. Warning: This can
be dangerous when files are maintained by more than
one person. When the .KEEP_STATE: target appears in
the makefile, this option updates the state file just
as if the rules had been performed. When in POSIX
mode, lines beginning with a "+" are executed.
-V Puts make into SysV mode. Refer to sysV-make(1) for
respective details.
OPERANDS
The following operands are supported:
target
Target names, as defined in USAGE.
macro=value
Macro definition. This definition overrides any regu-
lar definition for the specified macro within the
makefile itself, or in the environment. However, this
definition can still be overridden by conditional
macro assignments.
USAGE
The usage of make is described below:
Reading Makefiles and the Environment
When make first starts, it reads the MAKEFLAGS environment
variable to obtain any of the following options specified
present in its value: -d, -D, -e, -i, -k, -n, -p, -q, -r,
-s, -S, or -t. Due to the implementation of POSIX.2 (see
POSIX.2(5), the MAKEFLAGS values will contain a leading `-'
character. The make utility then reads the command line for
additional options, which also take effect.
Next, make reads in a default makefile that typically con-
tains predefined macro definitions, target entries for
implicit rules, and additional rules, such as the rule for
retrieving SCCS files. If present, make uses the file
make.rules in the current directory; otherwise it reads the
file /usr/share/lib/make/make.rules, which contains the
standard definitions and rules. Use the directive:
include /usr/share/lib/make/make.rules
in your local make.rules file to include them.
Next, make imports variables from the environment (unless
the -e option is in effect), and treats them as defined mac-
ros. Because make uses the most recent definition it
encounters, a macro definition in the makefile normally
overrides an environment variable of the same name. When -e
is in effect, however, environment variables are read in
after all makefiles have been read. In that case, the
environment variables take precedence over definitions in
the makefile.
Next, make reads any makefiles you specify with -f, or one
of makefile or Makefile as described above and then the
state file, in the local directory if it exists. If the
makefile contains a .KEEP_STATE_FILE target, then it reads
the state file that follows the target. Refer to special
target .KEEP_STATE_FILE for details.
Next (after reading the environment if -e is in effect),
make reads in any macro definitions supplied as command line
arguments. These override macro definitions in the makefile
and the environment both, but only for the make command
itself.
make exports environment variables, using the most recently
defined value. Macro definitions supplied on the command
line are not normally exported, unless the macro is also an
environment variable.
make does not export macros defined in the makefile. If an
environment variable is set, and a macro with the same name
is defined on the command line, make exports its value as
defined on the command line. Unless -e is in effect, macro
definitions within the makefile take precedence over those
imported from the environment.
The macros MAKEFLAGS, MAKE, SHELL, HOST_ARCH, HOST_MACH, and
TARGET_MACH are special cases. See Special-Purpose Macros
below for details.
Makefile Target Entries
A target entry has the following format:
target [:|::] [dependency] ... [; command] ...
[command]
...
The first line contains the name of a target, or a space-
separated list of target names, terminated with a colon or
double colon. If a list of targets is given, this is
equivalent to having a separate entry of the same form for
each target. The colon(s) may be followed by a dependency,
or a dependency list. make checks this list before building
the target. The dependency list may be terminated with a
semicolon (;), which in turn can be followed by a single
Bourne shell command. Subsequent lines in the target entry
begin with a TAB and contain Bourne shell commands. These
commands comprise the rule for building the target.
Shell commands may be continued across input lines by escap-
ing the NEWLINE with a backslash (\). The continuing line
must also start with a TAB.
To rebuild a target, make expands macros, strips off initial
TAB characters and either executes the command directly (if
it contains no shell metacharacters), or passes each command
line to a Bourne shell for execution.
The first non-empty line that does not begin with a TAB or
'#' begins another target or macro definition.
Special Characters
Special characters are defined below.
Global
# Start a comment. The comment ends at the next NEWLINE.
If the `#' follows the TAB in a command line, that
line is passed to the shell (which also treats `#' as
the start of a comment).
include filename
If the word include appears as the first seven letters
of a line and is followed by a SPACE or TAB, the
string that follows is taken as a filename to interpo-
late at that line. include files can be nested to a
depth of no more than about 16. If filename is a macro
reference, it is expanded.
Targets and Dependencies
: Target list terminator. Words following the colon are
added to the dependency list for the target or tar-
gets. If a target is named in more than one colon-
terminated target entry, the dependencies for all its
entries are added to form that target's complete
dependency list.
:: Target terminator for alternate dependencies. When
used in place of a `:' the double-colon allows a tar-
get to be checked and updated with respect to alter-
nate dependency lists. When the target is out-of-date
with respect to dependencies listed in the first
alternate, it is built according to the rule for that
entry. When out-of-date with respect to dependencies
in another alternate, it is built according the rule
in that other entry. Implicit rules do not apply to
double-colon targets; you must supply a rule for each
entry. If no dependencies are specified, the rule is
always performed.
target [+ target...] :
Target group. The rule in the target entry builds all
the indicated targets as a group. It is normally per-
formed only once per make run, but is checked for com-
mand dependencies every time a target in the group is
encountered in the dependency scan.
% Pattern matching wild card metacharacter. Like the
`*' shell wild card, `%' matches any string of zero or
more characters in a target name or dependency, in the
target portion of a conditional macro definition, or
within a pattern replacement macro reference. Notice
that only one `%' can appear in a target, dependency-
name, or pattern-replacement macro reference.
./pathname
make ignores the leading `./' characters from targets
with names given as pathnames relative to "dot," the
working directory.
Macros
= Macro definition. The word to the left of this charac-
ter is the macro name; words to the right comprise its
value. Leading and trailing white space characters are
stripped from the value. A word break following the =
is implied.
$ Macro reference. The following character, or the
parenthesized or bracketed string, is interpreted as a
macro reference: make expands the reference (including
the $) by replacing it with the macro's value.
( )
{ } Macro-reference name delimiters. A parenthesized or
bracketed word appended to a $ is taken as the name of
the macro being referred to. Without the delimiters,
make recognizes only the first character as the macro
name.
$$ A reference to the dollar-sign macro, the value of
which is the character `$'. Used to pass variable
expressions beginning with $ to the shell, to refer to
environment variables which are expanded by the shell,
or to delay processing of dynamic macros within the
dependency list of a target, until that target is
actually processed.
\$ Escaped dollar-sign character. Interpreted as a
literal dollar sign within a rule.
+= When used in place of `=', appends a string to a macro
definition (must be surrounded by white space, unlike
`=').
:= Conditional macro assignment. When preceded by a list
of targets with explicit target entries, the macro
definition that follows takes effect when processing
only those targets, and their dependencies.
:sh = Define the value of a macro to be the output of a com-
mand (see Command Substitutions below).
:sh In a macro reference, execute the command stored in
the macro, and replace the reference with the output
of that command (see Command Substitutions below).
Rules
+ make will always execute the commands preceded by a
"+", even when -n is specified.
- make ignores any nonzero error code returned by a com-
mand line for which the first non-TAB character is a
`-'. This character is not passed to the shell as part
of the command line. make normally terminates when a
command returns nonzero status, unless the -i or -k
options, or the .IGNORE: special-function target is in
effect.
@ If the first non-TAB character is a @, make does not
print the command line before executing it. This char-
acter is not passed to the shell.
? Escape command-dependency checking. Command lines
starting with this character are not subject to com-
mand dependency checking.
! Force command-dependency checking. Command-dependency
checking is applied to command lines for which it
would otherwise be suppressed. This checking is nor-
mally suppressed for lines that contain references to
the `?' dynamic macro (for example, `$?').
When any combination of `+', `-', `@', `?', or `!'
appear as the first characters after the TAB, all that
are present apply. None are passed to the shell.
Special-Function Targets
When incorporated in a makefile, the following target names
perform special-functions:
.DEFAULT:
If it has an entry in the makefile, the rule for this
target is used to process a target when there is no
other entry for it, no rule for building it, and no
SCCS history file from which to retrieve a current
version. make ignores any dependencies for this tar-
get.
.DONE:
If defined in the makefile, make processes this target
and its dependencies after all other targets are
built. This target is also performed when make halts
with an error, unless the .FAILED target is defined.
.FAILED:
This target, along with its dependencies, is performed
instead of .DONE when defined in the makefile and make
halts with an error.
.GET_POSIX:
This target contains the rule for retrieving the
current version of an SCCS file from its history file
in the current working directory. make uses this rule
when it is running in POSIX mode.
.IGNORE:
Ignore errors. When this target appears in the
makefile, make ignores non-zero error codes returned
from commands. When used in POSIX mode, .IGNORE could
be followed by target names only, for which the errors
will be ignored.
.INIT:
If defined in the makefile, this target and its depen-
dencies are built before any other targets are pro-
cessed.
.KEEP_STATE:
If this target is in effect, make updates the state
file, .make.state, in the current directory. This
target also activates command dependencies, and hidden
dependency checks. If either the .KEEP_STATE: target
appears in the makefile, or the environment variable
KEEP_STATE is set ("setenv KEEP_STATE"), make will
rebuild everything in order to collect dependency
information, even if all the targets were up to date
due to previous make runs. See also the ENVIRONMENT
VARIABLES section. This target has no effect if used
in POSIX mode.
.KEEP_STATE_FILE:
This target has no effect if used in POSIX mode. This
target implies .KEEP_STATE. If the target is followed
by a filename, make uses it as the state file. If the
target is followed by a directory name, make looks for
a .make.state file in that directory. If the target is
not followed by any name, make looks for .make.state
file in the current working directory.
.MAKE_VERSION:
A target-entry of the form:
.MAKE_VERSION: VERSION-number
enables version checking. If the version of make
differs from the version indicated by a string like
"VERSION-1.0", make issues a warning message.
.NO_PARALLEL:
Currently, this target has no effect, it is, however,
reserved for future use.
.PARALLEL:
Currently of no effect, but reserved for future use.
.POSIX:
This target enables POSIX mode.
.PRECIOUS:
List of files not to delete. make does not remove any
of the files listed as dependencies for this target
when interrupted. make normally removes the current
target when it receives an interrupt. When used in
POSIX mode, if the target is not followed by a list of
files, all the file are assumed precious.
.SCCS_GET:
This target contains the rule for retrieving the
current version of an SCCS file from its history file.
To suppress automatic retrieval, add an entry for this
target with an empty rule to your makefile.
.SCCS_GET_POSIX:
This target contains the rule for retrieving the
current version of an SCCS file from its history file.
make uses this rule when it is running in POSIX mode.
.SILENT:
Run silently. When this target appears in the
makefile, make does not echo commands before executing
them. When used in POSIX mode, it could be followed by
target names, and only those will be executed
silently.
.SUFFIXES:
The suffixes list for selecting implicit rules (see
The Suffixes List).
.WAIT:
Currently of no effect, but reserved for future use.
Clearing Special Targets
In this version of make, you can clear the definition of the
following special targets by supplying entries for them with
no dependencies and no rule:
.DEFAULT, .SCCS_GET, and .SUFFIXES
Command Dependencies
When the .KEEP_STATE: target is effective, make checks the
command for building a target against the state file. If the
command has changed since the last make run, make rebuilds
the target.
Hidden Dependencies
When the .KEEP_STATE: target is effective, make reads
reports from cpp(1) and other compilation processors for any
"hidden" files, such as #include files. If the target is out
of date with respect to any of these files, make rebuilds
it.
Macros
Entries of the form
macro=value
define macros. macro is the name of the macro, and value,
which consists of all characters up to a comment character
or unescaped NEWLINE, is the value. make strips both leading
and trailing white space in accepting the value.
Subsequent references to the macro, of the forms: $(name) or
${name} are replaced by value. The parentheses or brackets
can be omitted in a reference to a macro with a single-
character name.
Macro references can contain references to other macros, in
which case nested references are expanded first.
Suffix Replacement Macro References
Substitutions within macros can be made as follows:
$(name:string1=string2)
where string1 is either a suffix, or a word to be replaced
in the macro definition, and string2 is the replacement suf-
fix or word. Words in a macro value are separated by SPACE,
TAB, and escaped NEWLINE characters.
Pattern Replacement Macro References
Pattern matching replacements can also be applied to macros,
with a reference of the form:
$(name: op%os= np%ns)
where op is the existing (old) prefix and os is the existing
(old) suffix, np and ns are the new prefix and new suffix,
respectively, and the pattern matched by % (a string of zero
or more characters), is carried forward from the value being
replaced. For example:
PROGRAM=fabricate
DEBUG= $(PROGRAM:%=tmp/%-g)
sets the value of DEBUG to tmp/fabricate-g.
Notice that pattern replacement macro references cannot be
used in the dependency list of a pattern matching rule; the
% characters are not evaluated independently. Also, any
number of % metacharacters can appear after the equal-sign.
Appending to a Macro
Words can be appended to macro values as follows:
macro += word ...
Special-Purpose Macros
When the MAKEFLAGS variable is present in the environment,
make takes options from it, in combination with options
entered on the command line. make retains this combined
value as the MAKEFLAGS macro, and exports it automatically
to each command or shell it invokes.
Notice that flags passed by way of MAKEFLAGS are only
displayed when the -d, or -dd options are in effect.
The MAKE macro is another special case. It has the value
make by default, and temporarily overrides the -n option for
any line in which it is referred to. This allows nested
invocations of make written as:
$(MAKE) ...
to run recursively, with the -n flag in effect for all com-
mands but make. This lets you use `make -n' to test an
entire hierarchy of makefiles.
For compatibility with the 4.2 BSD make, the MFLAGS macro is
set from the MAKEFLAGS variable by prepending a `-'. MFLAGS
is not exported automatically.
The SHELL macro, when set to a single-word value such as
/usr/bin/csh, indicates the name of an alternate shell to
use. The default is /bin/sh. Notice that make executes com-
mands that contain no shell metacharacters itself. Built-in
commands, such as dirs in the C shell, are not recognized
unless the command line includes a metacharacter (for
instance, a semicolon). This macro is neither imported from,
nor exported to the environment, regardless of -e. To be
sure it is set properly, you must define this macro within
every makefile that requires it.
The syntax of the VPATH macro is:
VPATH = [ pathname [ : pathname ] ... ]
VPATH specifies a list of directories to search for the
files, which are targets or dependencies, when make is exe-
cuted. VPATH is also used in order to search for the
include files mentioned in the particular makefile.
When processing a target or a dependency or an include
directive, make checks the existence of the file with the
same name in the current directory. If the file is found to
be missing, make will search for this file in the list of
directories presented in VPATH (like the PATH variable in
the shell). Unlike the PATH variable, VPATH is used in order
to search for the files with relative pathnames. When make
attempts to apply implicit rules to the target, it also
searches for the dependency files using VPATH.
When the file is found using VPATH, internal macros $@, @<,
$?, $*, and their alternative forms (with D or F appended)
are set in accordance with the name derived from VPATH. For
instance, if the target subdir/foo.o is found in the direc-
tory /aaa/bbb using VPATH, then the value of the internal
macro $@ for this target will be /aaa/bbb/subdir/foo.o.
If a target or a dependency file is found using VPATH, then
any occurrences of the word that is the same as the target
name in the subsequent rules will be replaced with the
actual name of the target derived from VPATH.
For example:
VPATH=./subdir
file.o : file.c
cc -c file.c -o file.o
If file.c is found in ./subdir, then the command
cc -c ./subdir/file.c -o file.o
will be executed.
The following macros are provided for use with cross-
compilation:
HOST_ARCH
The machine architecture of the host system. By
default, this is the output of the arch(1) command
prepended with `-'. Under normal circumstances, this
value should never be altered by the user.
HOST_MACH
The machine architecture of the host system. By
default, this is the output of the mach(1), prepended
with `-'. Under normal circumstances, this value
should never be altered by the user.
TARGET_ARCH
The machine architecture of the target system. By
default, the output of mach, prepended with `-'.
Dynamic Macros
There are several dynamically maintained macros that are
useful as abbreviations within rules. They are shown here as
references; if you were to define them, make would simply
override the definition.
$* The basename of the current target, derived as if
selected for use with an implicit rule.
$< The name of a dependency file, derived as if selected
for use with an implicit rule.
$@ The name of the current target. This is the only
dynamic macro whose value is strictly determined when
used in a dependency list. (In which case it takes the
form `$$@'.)
$? The list of dependencies that are newer than the
target. Command-dependency checking is automatically
suppressed for lines that contain this macro, just as
if the command had been prefixed with a `?'. See the
description of `?', under Special Character Rules
above. You can force this check with the ! command-
line prefix.
$% The name of the library member being processed. (See
Library Maintenance below.)
To refer to the $@ dynamic macro within a dependency list,
precede the reference with an additional `$' character (as
in, `$$@'). Because make assigns $< and $* as it would for
implicit rules (according to the suffixes list and the
directory contents), they may be unreliable when used within
explicit target entries.
These macros can be modified to apply either to the filename
part, or the directory part of the strings they stand for,
by adding an upper case F or D, respectively (and enclosing
the resulting name in parentheses or braces). Thus, `$(@D)'
refers to the directory part of the string `$@'; if there is
no directory part, `.' is assigned. $(@F) refers to the
filename part.
Conditional Macro Definitions
A macro definition of the form:
target-list := macro = value
indicates that when processing any of the targets listed and
their dependencies, macro is to be set to the value sup-
plied. Notice that if a conditional macro is referred to in
a dependency list, the $ must be delayed (use $$ instead).
Also, target-list may contain a % pattern, in which case the
macro will be conditionally defined for all targets encoun-
tered that match the pattern. A pattern replacement refer-
ence can be used within the value.
You can temporarily append to a macro's value with a condi-
tional definition of the form:
target-list := macro += value
Predefined Macros
make supplies the macros shown in the table that follows for
compilers and their options, host architectures, and other
commands. Unless these macros are read in as environment
variables, their values are not exported by make. If you run
make with any of these set in the environment, it is a good
idea to add commentary to the makefile to indicate what
value each is expected to take. If -r is in effect, make
does not read the default makefile (./make.rules or
/usr/share/lib/make/make.rules) in which these macro defini-
tions are supplied.
___________________________________________________________________
Table of Predefined Macros
Use Macro Default Value
Library AR ar
Archives ARFLAGS rv
Assembler AS as
Commands ASFLAGS
COMPILE.s $(AS) $(ASFLAGS)
COMPILE.S $(CC) $(ASFLAGS) $(CPPFLAGS) -c
C CC cc
Compiler CFLAGS
Commands CPPFLAGS
COMPILE.c $(CC) $(CFLAGS) $(CPPFLAGS) -c
LINK.c $(CC) $(CFLAGS) $(CPPFLAGS)
$(LDFLAGS)
C++ CCC CC
Compiler CCFLAGS CFLAGS
Commands CPPFLAGS
COMPILE.cc $(CCC) $(CCFLAGS) $(CPPFLAGS) -c
LINK.cc $(CCC) $(CCFLAGS) $(CPPFLAGS)
$(LDFLAGS)
COMPILE.C $(CCC) $(CCFLAGS) $(CPPFLAGS) -c
LINK.C $(CCC) $(CCFLAGS) $(CPPFLAGS)
$(LDFLAGS)
FORTRAN 77 FC f77
Compiler FFLAGS
Commands COMPILE.f $(FC) $(FFLAGS) -c
LINK.f $(FC) $(FFLAGS) $(LDFLAGS)
COMPILE.F $(FC) $(FFLAGS) $(CPPFLAGS) -c
LINK.F $(FC) $(FFLAGS) $(CPPFLAGS)
$(LDFLAGS)
FORTRAN 90 FC f90
Compiler F90FLAGS
Commands COMPILE.f90 $(F90C) $(F90FLAGS) -c
LINK.f90 $(F90C) $(F90FLAGS) $(LDFLAGS)
COMPILE.ftn $(F90C) $(F90FLAGS) $(CPPFLAGS) -c
LINK.ftn $(F90C) $(F90FLAGS) $(CPPFLAGS)
$(LDFLAGS)
Link Editor LD ld
Command LDFLAGS
lex LEX lex
Command LFLAGS
LEX.l $(LEX) $(LFLAGS) -t
lint LINT lint
Command LINTFLAGS
| LINT.c $(LINT) $(LINTFLAGS) $(CPPFLAGS) |
| | | |
| Modula 2 | M2C | m2c |
| Commands | M2FLAGS | |
| | MODFLAGS | |
| | DEFFLAGS | |
| | COMPILE.def | $(M2C) $(M2FLAGS) $(DEFFLAGS) |
| | COMPILE.mod | $(M2C) $(M2FLAGS) $(MODFLAGS) |
| | | |
| Pascal | PC | pc |
| Compiler | PFLAGS | |
| Commands | COMPILE.p | $(PC) $(PFLAGS) $(CPPFLAGS) -c |
| | LINK.p | $(PC) $(PFLAGS) $(CPPFLAGS)|
| | | $(LDFLAGS) |
| | | |
| Ratfor | RFLAGS | |
| Compilation | COMPILE.r | $(FC) $(FFLAGS) $(RFLAGS) -c |
| Commands | LINK.r | $(FC) $(FFLAGS) $(RFLAGS)|
| | | $(LDFLAGS) |
| | | |
| rm Command | RM | rm -f |
| | | |
| sccs | SCCSFLAGS | |
| Command | SCCSGETFLAGS| -s |
| | | |
| yacc | YACC | yacc |
| Command | YFLAGS | |
| | YACC.y | $(YACC) $(YFLAGS) |
| | | |
| Suffixes List| SUFFIXES | .o .c .c~ .cc .cc~ .y .y~ .l .l~|
| | | .s .s~ .sh .sh~ .S .S~ .ln .h .h~|
| | | .f .f~ .F .F~ .mod .mod~ .sym|
| | | .def .def~ .p .p~ .r .r~ .cps|
| | | .cps~ .C .C~ .Y .Y~ .L .L .f90|
| | | .f90~ .ftn .ftn~ |
|______________|______________|____________________________________|
Implicit Rules
When a target has no entry in the makefile, make attempts to
determine its class (if any) and apply the rule for that
class. An implicit rule describes how to build any target of
a given class, from an associated dependency file. The class
of a target can be determined either by a pattern, or by a
suffix; the corresponding dependency file (with the same
basename) from which such a target might be built. In addi-
tion to a predefined set of implicit rules, make allows you
to define your own, either by pattern, or by suffix.
Pattern Matching Rules
A target entry of the form:
tp%ts:dp%ds
rule
is a pattern matching rule, in which tp is a target prefix,
ts is a target suffix, dp is a dependency prefix, and ds is
a dependency suffix (any of which may be null). The `%'
stands for a basename of zero or more characters that is
matched in the target, and is used to construct the name of
a dependency. When make encounters a match in its search for
an implicit rule, it uses the rule in that target entry to
build the target from the dependency file. Pattern-matching
implicit rules typically make use of the $@ and $< dynamic
macros as placeholders for the target and dependency names.
Other, regular dependencies may occur in the dependency
list; however, none of the regular dependencies may contain
`%'. An entry of the form:
tp%ts:[dependency ...] dp%ds[dependency ...]
rule
is a valid pattern matching rule.
Suffix Rules
When no pattern matching rule applies, make checks the tar-
get name to see if it ends with a suffix in the known suf-
fixes list. If so, make checks for any suffix rules, as well
as a dependency file with same root and another recognized
suffix, from which to build it.
The target entry for a suffix rule takes the form:
DsTs: rule
where Ts is the suffix of the target, Ds is the suffix of
the dependency file, and rule is the rule for building a
target in the class. Both Ds and Ts must appear in the suf-
fixes list. (A suffix need not begin with a `.' to be recog-
nized.)
A suffix rule with only one suffix describes how to build a
target having a null (or no) suffix from a dependency file
with the indicated suffix. For instance, the .c rule could
be used to build an executable program named file from a C
source file named `file.c'. If a target with a null suffix
has an explicit dependency, make omits the search for a suf-
fix rule.
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for Assembly |
| Files |
| Implicit Rule Name| Command Line |
| .s.o | $(COMPILE.s) -o $@ $< |
| | |
| .s.a | $(COMPILE.s) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .s~.o | $(GET) $(GFLAGS) -p $< > $*.s |
| | $(COMPILE.s) -o $@ $*.s |
| | |
| .S.o | $(COMPILE.S) -o $@ $< |
| | |
| .S.a | $(COMPILE.S) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .S~.o | $(GET) $(GFLAGS) -p $< > $*.S |
| | $(COMPILE.S) -o $@ $*.S |
| | |
| .S~.a | $(GET) $(GFLAGS) -p $< > $*.S |
| | $(COMPILE.S) -o $% $*.S |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for C Files |
| Implicit Rule Name| Command Line |
| .c | $(LINK.c) -o $@ $< $(LDLIBS) |
| | |
| .c.ln | $(LINT.c) $(OUTPUT_OPTION) -i $< |
| | |
| .c.o | $(COMPILE.c) $(OUTPUT_OPTION) $< |
| | |
| .c.a | $(COMPILE.c) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .c~ | $(GET) $(GFLAGS) -p $< > $*.c |
| | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $*.c |
| | |
| .c~.o | $(GET) $(GFLAGS) -p $< > $*.c |
| | $(CC) $(CFLAGS) -c $*.c |
| | |
| .c~.ln | $(GET) $(GFLAGS) -p $< > $*.c |
| | $(LINT.c) $(OUTPUT_OPTION) -c $*.c |
| | |
| .c~.a | $(GET) $(GFLAGS) -p $< > $*.c |
| | $(COMPILE.c) -o $% $*.c |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for C++ |
| Files |
| Implicit Rule Name| Command Line |
| .cc | $(LINK.cc) -o $@ $< $(LDLIBS) |
| | |
| .cc.o | $(COMPILE.cc) $(OUTPUT_OPTION) $< |
| | |
| .cc.a | $(COMPILE.cc) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .cc~ | $(GET) $(GFLAGS) -p $< > $*.cc |
| | $(LINK.cc) -o $@ $*.cc $(LDLIBS) |
| | |
| .cc.o | $(COMPILE.cc) $(OUTPUT_OPTION) $< |
| | |
| .cc~.o | $(GET) $(GFLAGS) -p $< > $*.cc |
| | $(COMPILE.cc) $(OUTPUT_OPTION) $*.cc |
| | |
| .cc.a | $(COMPILE.cc) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .cc~.a | $(GET) $(GFLAGS) -p $< > $*.cc |
| | $(COMPILE.cc) -o $% $*.cc |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .C | $(LINK.C) -o $@ $< $(LDLIBS) |
| | |
| .C~ | $(GET) $(GFLAGS) -p $< > $*.C |
| | $(LINK.C) -o $@ $*.C $(LDLIBS) |
| | |
| .C.o | $(COMPILE.C) $(OUTPUT_OPTION) $< |
| | |
| .C~.o | $(GET) $(GFLAGS) -p $< > $*.C |
| | $(COMPILE.C) $(OUTPUT_OPTION) $*.C |
| | |
| .C.a | $(COMPILE.C) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .C~.a | $(GET) $(GFLAGS) -p $< > $*.C |
| | $(COMPILE.C) -o $% $*.C |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for FORTRAN |
| 77 Files |
| Implicit Rule Name| Command Line |
| .f | $(LINK.f) -o $@ $< $(LDLIBS) |
| | |
| .f.o | $(COMPILE.f) $(OUTPUT_OPTION) $< |
| | |
| .f.a | $(COMPILE.f) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .f | $(LINK.f) -o $@ $< $(LDLIBS) |
| | |
| .f~ | $(GET) $(GFLAGS) -p $< > $*.f |
| | $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $*.f |
| | |
| .f~.o | $(GET) $(GFLAGS) -p $< > $*.f |
| | $(FC) $(FFLAGS) -c $*.f |
| | |
| .f~.a | $(GET) $(GFLAGS) -p $< > $*.f |
| | $(COMPILE.f) -o $% $*.f |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .F | $(LINK.F) -o $@ $< $(LDLIBS) |
| | |
| .F.o | $(COMPILE.F) $(OUTPUT_OPTION) $< |
| | |
| .F.a | $(COMPILE.F) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .F~ | $(GET) $(GFLAGS) -p $< > $*.F |
| | $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $*.F |
| | |
| .F~.o | $(GET) $(GFLAGS) -p $< > $*.F |
| | $(FC) $(FFLAGS) -c $*.F |
| | |
| .F~.a | $(GET) $(GFLAGS) -p $< > $*.F |
| | $(COMPILE.F) -o $% $*.F |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for FORTRAN |
| 90 Files |
| Implicit Rule Name| Command Line |
| .f90 | $(LINK.f90) -o $@ $< $(LDLIBS) |
| | |
| .f90~ | $(GET) $(GFLAGS) -p $< > $*.f90 |
| | $(LINK.f90) -o $@ $*.f90 $(LDLIBS) |
| | |
| .f90.o | $(COMPILE.f90) $(OUTPUT_OPTION) $< |
| | |
| .f90~.o | $(GET) $(GFLAGS) -p $< > $*.f90 |
| | $(COMPILE.f90) $(OUTPUT_OPTION) $*.f90 |
| | |
| .f90.a | $(COMPILE.f90) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .f90~.a | $(GET) $(GFLAGS) -p $< > $*.f90 |
| | $(COMPILE.f90) -o $% $*.f90 |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .ftn | $(LINK.ftn) -o $@ $< $(LDLIBS) |
| | |
| .ftn~ | $(GET) $(GFLAGS) -p $< > $*.ftn |
| | $(LINK.ftn) -o $@ $*.ftn $(LDLIBS) |
| | |
| .ftn.o | $(COMPILE.ftn) $(OUTPUT_OPTION) $< |
| | |
| .ftn~.o | $(GET) $(GFLAGS) -p $< > $*.ftn |
| | $(COMPILE.ftn) $(OUTPUT_OPTION) $*.ftn |
| | |
| .ftn.a | $(COMPILE.ftn) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .ftn~.a | $(GET) $(GFLAGS) -p $< > $*.ftn |
| | $(COMPILE.ftn) -o $% $*.ftn |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for lex |
| Files |
| Implicit Rule Name| Command Line |
| .l | $(RM) $*.c |
| | $(LEX.l) $< > $*.c |
| | $(LINK.c) -o $@ $*.c $(LDLIBS) |
| | $(RM) $*.c |
| | |
| .l.c | $(RM) $@ |
| | $(LEX.l) $< > $@ |
| | |
| .l.ln | $(RM) $*.c |
| | $(LEX.l) $< > $*.c |
| | $(LINT.c) -o $@ -i $*.c |
| | $(RM) $*.c |
| | |
| .l.o | $(RM) $*.c |
| | $(LEX.l) $< > $*.c |
| | $(COMPILE.c) -o $@ $*.c |
| | $(RM) $*.c |
| | |
| .l~ | $(GET) $(GFLAGS) -p $< > $*.l |
| | $(LEX) $(LFLAGS) $*.l |
| | $(CC) $(CFLAGS) -c lex.yy.c |
| | rm -f lex.yy.c |
| | mv lex.yy.c $@ |
| | |
| .l~.c | $(GET) $(GFLAGS) -p $< > $*.l |
| | $(LEX) $(LFLAGS) $*.l |
| | mv lex.yy.c $@ |
| | |
| .l~.ln | $(GET) $(GFLAGS) -p $< > $*.l |
| | $(RM) $*.c |
| | $(LEX.l) $*.l > $*.c |
| | $(LINT.c) -o $@ -i $*.c |
| | $(RM) $*.c |
| | |
| .l~.o | $(GET) $(GFLAGS) -p $< > $*.l |
| | $(LEX) $(LFLAGS) $*.l |
| | $(CC) $(CFLAGS) -c lex.yy.c |
| | rm -f lex.yy.c |
| | mv lex.yy.c $@ |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for Modula 2 |
| Files |
| Implicit Rule Name| Command Line |
| .mod | $(COMPILE.mod) -o $@ -e $@ $< |
| | |
| .mod.o | $(COMPILE.mod) -o $@ $< |
| | |
| .def.sym | $(COMPILE.def) -o $@ $< |
| | |
| .def~.sym | $(GET) $(GFLAGS) -p $< > $*.def |
| | $(COMPILE.def) -o $@ $*.def |
| | |
| .mod~ | $(GET) $(GFLAGS) -p $< > $*.mod |
| | $(COMPILE.mod) -o $@ -e $@ $*.mod |
| | |
| .mod~.o | $(GET) $(GFLAGS) -p $< > $*.mod |
| | $(COMPILE.mod) -o $@ $*.mod |
| | |
| .mod~.a | $(GET) $(GFLAGS) -p $< > $*.mod |
| | $(COMPILE.mod) -o $% $*.mod |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| | Table of Standard |
| | Implicit (Suffix) |
| | Rules for NeWS |
| | Files |
|___________________|_________________________________________|
| Implicit Rule Name| Command Line |
|___________________|_________________________________________|
| .cps.h | cps $*.cps |
|___________________|_________________________________________|
| .cps~.h | $(GET) $(GFLAGS) -p $< > $*.cps |
|___________________|_________________________________________|
| | $(CPS) $(CPSFLAGS) $*.cps |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for Pascal |
| Files |
| Implicit Rule Name| Command Line |
| .p | $(LINK.p) -o $@ $< $(LDLIBS) |
| | |
| .p.o | $(COMPILE.p) $(OUTPUT_OPTION) $< |
| | |
| .p~ | $(GET) $(GFLAGS) -p $< > $*.p |
| | $(LINK.p) -o $@ $*.p $(LDLIBS) |
| | |
| .p~.o | $(GET) $(GFLAGS) -p $< > $*.p |
| | $(COMPILE.p) $(OUTPUT_OPTION) $*.p |
| | |
| .p~.a | $(GET) $(GFLAGS) -p $< > $*.p |
| | $(COMPILE.p) -o $% $*.p |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for Ratfor |
| Files |
| Implicit Rule Name| Command Line |
| .r | $(LINK.r) -o $@ $< $(LDLIBS) |
| | |
| .r.o | $(COMPILE.r) $(OUTPUT_OPTION) $< |
| | |
| .r.a | $(COMPILE.r) -o $% $< |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
| | |
| .r~ | $(GET) $(GFLAGS) -p $< > $*.r |
| | $(LINK.r) -o $@ $*.r $(LDLIBS) |
| | |
| .r~.o | $(GET) $(GFLAGS) -p $< > $*.r |
| | $(COMPILE.r) $(OUTPUT_OPTION) $*.r |
| | |
| .r~.a | $(GET) $(GFLAGS) -p $< > $*.r |
| | $(COMPILE.r) -o $% $*.r |
| | $(AR) $(ARFLAGS) $@ $% |
| | $(RM) $% |
|___________________|_________________________________________|
______________________________________________________________
| | Table of Standard |
| | Implicit (Suffix) |
| | Rules for SCCS |
| | Files |
|___________________|_________________________________________|
| Implicit Rule Name| Command Line |
|___________________|_________________________________________|
| .SCCS_GET | sccs $(SCCSFLAGS) get $(SCCSGETFLAGS)|
| | $@ -G$@ |
|___________________|_________________________________________|
| | |
|___________________|_________________________________________|
| | |
|___________________|_________________________________________|
| .SCCS_GET_POSIX | sccs $(SCCSFLAGS) get $(SCCSGETFLAGS)|
| | $@ |
|___________________|_________________________________________|
| | |
|___________________|_________________________________________|
| .GET_POSIX | $(GET) $(GFLAGS) s.$@ |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for Shell |
| Scripts |
| Implicit Rule Name| Command Line |
| .sh | cat $< >$@ |
| | chmod +x $@ |
| | |
| .sh~ | $(GET) $(GFLAGS) -p $< > $*.sh |
| | cp $*.sh $@ |
| | chmod a+x $@ |
|___________________|_________________________________________|
______________________________________________________________
| Table of Standard |
| Implicit (Suffix) |
| Rules for yacc |
| Files |
| Implicit Rule Name| Command Line |
| .y | $(YACC.y) $< |
| | $(LINK.c) -o $@ y.tab.c $(LDLIBS) |
| | $(RM) y.tab.c |
| | |
| .y.c | $(YACC.y) $< |
| | mv y.tab.c $@ |
| | |
| .y.ln | $(YACC.y) $< |
| | $(LINT.c) -o $@ -i y.tab.c |
| | $(RM) y.tab.c |
| | |
| .y.o | $(YACC.y) $< |
| | $(COMPILE.c) -o $@ y.tab.c |
| | $(RM) y.tab.c |
| | |
| .y~ | $(GET) $(GFLAGS) -p $< > $*.y |
| | $(YACC) $(YFLAGS) $*.y |
| | $(COMPILE.c) -o $@ y.tab.c |
| | $(RM) y.tab.c |
| | |
| .y~.c | $(GET) $(GFLAGS) -p $< > $*.y |
| | $(YACC) $(YFLAGS) $*.y |
| | mv y.tab.c $@ |
| | |
| .y~.ln | $(GET) $(GFLAGS) -p $< > $*.y |
| | $(YACC.y) $*.y |
| | $(LINT.c) -o $@ -i y.tab.c |
| | $(RM) y.tab.c |
| | |
| .y~.o | $(GET) $(GFLAGS) -p $< > $*.y |
| | $(YACC) $(YFLAGS) $*.y |
| | $(CC) $(CFLAGS) -c y.tab.c |
| | rm -f y.tab.c |
| | mv y.tab.o $@ |
|___________________|_________________________________________|
make reads in the standard set of implicit rules from the
file /usr/share/lib/make/make.rules, unless -r is in effect,
or there is a make.rules file in the local directory that
does not include that file.
The Suffixes List
The suffixes list is given as the list of dependencies for
the `.SUFFIXES:' special-function target. The default list
is contained in the SUFFIXES macro (See Table of Predefined
Macros for the standard list of suffixes). You can define
additional .SUFFIXES: targets; a .SUFFIXES target with no
dependencies clears the list of suffixes. Order is signifi-
cant within the list; make selects a rule that corresponds
to the target's suffix and the first dependency-file suffix
found in the list. To place suffixes at the head of the
list, clear the list and replace it with the new suffixes,
followed by the default list:
.SUFFIXES:
.SUFFIXES: suffixes $(SUFFIXES)
A tilde (~) indicates that if a dependency file with the
indicated suffix (minus the ~) is under SCCS its most recent
version should be retrieved, if necessary, before the target
is processed.
Library Maintenance
A target name of the form:
lib(member ...)
refers to a member, or a space-separated list of members, in
an ar(1) library.
The dependency of the library member on the corresponding
file must be given as an explicit entry in the makefile.
This can be handled by a pattern matching rule of the form:
lib(%.s): %.s
where .s is the suffix of the member; this suffix is typi-
cally .o for object libraries.
A target name of the form:
lib((symbol))
refers to the member of a randomized object library that
defines the entry point named symbol.
Command Execution
Command lines are executed one at a time, each by its own
process or shell. Shell commands, notably cd, are ineffec-
tual across an unescaped NEWLINE in the makefile. A line is
printed (after macro expansion) just before being executed.
This is suppressed if it starts with a `@', if there is a
`.SILENT:' entry in the makefile, or if make is run with the
-s option. Although the -n option specifies printing without
execution, lines containing the macro $(MAKE) are executed
regardless, and lines containing the @ special character are
printed. The -t (touch) option updates the modification date
of a file without executing any rules. This can be dangerous
when sources are maintained by more than one person.
make invokes the shell with the -e (exit-on-errors) argu-
ment. Thus, with semicolon-separated command sequences, exe-
cution of the later commands depends on the success of the
former. This behavior can be overridden by starting the com-
mand line with a `-', or by writing a shell script that
returns a non-zero status only as it finds appropriate.
Bourne Shell Constructs
To use the Bourne shell if control structure for branching,
use a command line of the form:
if expression ; \
then command ; \
... ; \
else command ; \
... ; \
fi
Although composed of several input lines, the escaped NEW-
LINE characters insure that make treats them all as one
(shell) command line.
To use the Bourne shell for control structure for loops, use
a command line of the form:
for var in list ; \
do command; \
... ; \
done
To refer to a shell variable, use a double-dollar-sign ($$).
This prevents expansion of the dollar-sign by make.
Command Substitutions
To incorporate the standard output of a shell command in a
macro, use a definition of the form:
MACRO:sh =command
The command is executed only once, standard error output is
discarded, and NEWLINE characters are replaced with SPACEs.
If the command has a non-zero exit status, make halts with
an error.
To capture the output of a shell command in a macro refer-
ence, use a reference of the form:
$(MACRO:sh)
where MACRO is the name of a macro containing a valid Bourne
shell command line. In this case, the command is executed
whenever the reference is evaluated. As with shell command
substitutions, the reference is replaced with the standard
output of the command. If the command has a non-zero exit
status, make halts with an error.
In contrast to commands in rules, the command is not subject
for macro substitution; therefore, a dollar sign ($) need
not be replaced with a double dollar sign ($$).
Signals
INT, SIGTERM, and QUIT signals received from the keyboard
halt make and remove the target file being processed unless
that target is in the dependency list for .PRECIOUS:.
EXAMPLES
Example 1: Defining dependencies
This makefile says that pgm depends on two files a.o and
b.o, and that they in turn depend on their corresponding
source files (a.c and b.c) along with a common file incl.h:
pgm: a.o b.o
$(LINK.c) -o $@a.o b.o
a.o: incl.h a.c
cc -c a.c
b.o: incl.h b.c
cc -c b.c
Example 2: Using implicit rules
The following makefile uses implicit rules to express the
same dependencies:
pgm: a.o b.o
cc a.o b.o -o pgm
a.o b.o: incl.h
ENVIRONMENT VARIABLES
See environ(5) for descriptions of the following environment
variables that affect the execution of make: LANG, LC_ALL,
LC_CTYPE, LC_MESSAGES, and NLSPATH.
KEEP_STATE
This environment variable has the same effect as the
.KEEP_STATE: special-function target. It enables com-
mand dependencies, hidden dependencies and writing of
the state file.
USE_SVR4_MAKE
This environment variable causes make to invoke the
generic System V version of make
(/usr/ccs/lib/svr4.make). See sysV-make(1).
MAKEFLAGS
This variable is interpreted as a character string
representing a series of option characters to be used
as the default options. The implementation will accept
both of the following formats (but need not accept
them when intermixed):
1. The characters are option letters without the lead-
ing hyphens or blank character separation used on a
command line.
2. The characters are formatted in a manner similar to
a portion of the make command line: options are
preceded by hyphens and blank-character-separated.
The macro=name macro definition operands can also
be included. The difference between the contents of
MAKEFLAGS and the command line is that the contents
of the variable will not be subjected to the word
expansions (see wordexp(3C)) associated with pars-
ing the command line values.
When the command-line options -f or -p are used,
they will take effect regardless of whether they
also appear in MAKEFLAGS. If they otherwise appear
in MAKEFLAGS, the result is undefined.
The MAKEFLAGS variable will be accessed from the
environment before the makefile is read. At that time,
all of the options (except -f and -p) and command-line
macros not already included in MAKEFLAGS are added to
the MAKEFLAGS macro. The MAKEFLAGS macro will be
passed into the environment as an environment variable
for all child processes. If the MAKEFLAGS macro is
subsequently set by the makefile, it replaces the
MAKEFLAGS variable currently found in the environment.
PROJECTDIR
Provides a directory to be used to search for SCCS
files not found in the current directory. In all of
the following cases, the search for SCCS files is made
in the directory SCCS in the identified directory. If
the value of PROJECTDIR begins with a slash, it shall
be considered an absolute pathname. Otherwise, the
value of PROJECTDIR is treated as a user name and that
user's initial working directory shall be examined for
a subdirectory src or source. If such a directory is
found, it shall be used. Otherwise, the value is used
as a relative pathname.
If PROJECTDIR is not set or has a null value, the
search for SCCS files shall be made in the directory
SCCS in the current directory. The setting of PRO-
JECTDIR affects all files listed in the remainder of
this utility description for files with a component
named SCCS.
EXIT STATUS
When the -q option is specified, the make utility will exit
with one of the following values:
0 Successful completion.
1 The target was not up-to-date.
>1 An error occurred.
When the -q option is not specified, the make utility will
exit with one of the following values:
0 Successful completion
>0 An error occurred
FILES
makefile
Makefile
current version(s) of make description file
s.makefile
s.Makefile
SCCS history files for the above makefile(s) in the
current directory
SCCS/s.makefile
SCCS/s.Makefile
SCCS history files for the above makefile(s)
make.rules
default file for user-defined targets, macros, and
implicit rules
/usr/share/lib/make/make.rules
makefile for standard implicit rules and macros (not
read if make.rules is)
.make.state
state file in the local directory
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
/usr/ccs/bin/make
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|_____________________________|_____________________________|
| Availability | SUNWsprot |
|_____________________________|_____________________________|
/usr/xpg4/bin/make
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|_____________________________|_____________________________|
| Availability | SUNWxcu4t |
|_____________________________|_____________________________|
| Interface Stability | Standard |
|_____________________________|_____________________________|
SEE ALSO
ar(1), arch(1), cd(1), cpp(1), lex(1), mach(1), sccs-get(1),
sh(1), sysV-make(1), yacc(1), wordexp(3C), passwd(4), attri-
butes(5), environ(5), POSIX.2(5), standards(5)
Solaris Advanced User's Guide
DIAGNOSTICS
Don't know how to make target 'target'
There is no makefile entry for target, and none of
make's implicit rules apply (there is no dependency
file with a suffix in the suffixes list, or the
target's suffix is not in the list).
*** target removed.
make was interrupted while building target. Rather
than leaving a partially-completed version that is
newer than its dependencies, make removes the file
named target.
*** target not removed.
make was interrupted while building target and target
was not present in the directory.
*** target could not be removed, reason
make was interrupted while building target, which was
not removed for the indicated reason.
Read of include file `file' failed
The makefile indicated in an include directive was not
found, or was inaccessible.
Loop detected when expanding macro value `macro'
A reference to the macro being defined was found in
the definition.
Could not write state file `file'
You used the .KEEP_STATE: target, but do not have
write permission on the state file.
*** Error code n
The previous shell command returned a nonzero error
code.
*** signal message
The previous shell command was aborted due to a sig-
nal. If `- core dumped' appears after the message, a
core file was created.
Conditional macro conflict encountered
Displayed only when -d is in effect, this message
indicates that two or more parallel targets currently
being processed depend on a target which is built dif-
ferently for each by virtue of conditional macros.
Since the target cannot simultaneously satisfy both
dependency relationships, it is conflicted.
BUGS
Some commands return nonzero status inappropriately; to
overcome this difficulty, prefix the offending command line
in the rule with a `-'.
Filenames with the characters `=', `:', or `@', do not work.
You cannot build file.o from lib(file.o).
Options supplied by MAKEFLAGS should be reported for nested
make commands. Use the -d option to find out what options
the nested command picks up from MAKEFLAGS.
This version of make is incompatible in certain respects
with previous versions:
o The -d option output is much briefer in this version.
-dd now produces the equivalent voluminous output.
o make attempts to derive values for the dynamic macros
`$*', `$<', and `$?', while processing explicit tar-
gets. It uses the same method as for implicit rules;
in some cases this can lead either to unexpected
values, or to an empty value being assigned. (Actu-
ally, this was true for earlier versions as well, even
though the documentation stated otherwise.)
o make no longer searches for SCCS history "(s.)" files.
o Suffix replacement in macro references are now applied
after the macro is expanded.
There is no guarantee that makefiles created for this ver-
sion of make will work with earlier versions.
If there is no make.rules file in the current directory, and
the file /usr/share/lib/make/make.rules is missing, make
stops before processing any targets. To force make to run
anyway, create an empty make.rules file in the current
directory.
Once a dependency is made, make assumes the dependency file
is present for the remainder of the run. If a rule subse-
quently removes that file and future targets depend on its
existence, unexpected errors may result.
When hidden dependency checking is in effect, the $? macro's
value includes the names of hidden dependencies. This can
lead to improper filename arguments to commands when $? is
used in a rule.
Pattern replacement macro references cannot be used in the
dependency list of a pattern matching rule.
Unlike previous versions, this version of make strips a
leading `./' from the value of the `$@' dynamic macro.
With automatic SCCS retrieval, this version of make does not
support tilde suffix rules.
The only dynamic macro whose value is strictly determined
when used in a dependency list is $@ (takes the form `$$@').
make invokes the shell with the -e argument. This cannot be
inferred from the syntax of the rule alone.
Man(1) output converted with
man2html