make(1S) SunOS Specific Commands make(1S)
make - maintain, update, and regenerate related programs and files
/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...]
The make utility executes a list of shell commands associated 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 dependen-
cies, 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 tar-
get 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 tar-
get 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 following 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 description 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.
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 argu-
ment denotes the standard input. The contents of makefile, when
present, override the standard set of implicit rules and prede-
fined 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 fol-
lowing 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 Make-
file is present in the working directory, 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 spe-
cial-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 con-
tinues 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 prede-
fined macros. When more than one `-K statefile' argument pair
appears, make uses the concatenation of those files, in order of
appearance. (See also .KEEP_STATE and .KEEP_STATE_FILE in the
Special-Function Targets section).
-n No execution mode. Prints commands, but does not execute them.
Even lines beginning with an @ are printed. However, if a com-
mand line contains a reference to the $(MAKE) macro, that line is
always executed (see the discussion of MAKEFLAGS in Reading Make-
files 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 depend-
ing 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 executing 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. 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.
The following operands are supported:
target
Target names, as defined in USAGE.
macro=value
Macro definition. This definition overrides any regular defini-
tion for the specified macro within the makefile itself, or in
the environment. However, this definition can still be overridden
by conditional macro assignments.
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 implementa-
tion 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 contains prede-
fined macro definitions, target entries for implicit rules, and addi-
tional 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 stan-
dard 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 macros. Because make uses the
most recent definition it encounters, a macro definition in the make-
file 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 over-
ride 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 com-
mand 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 TAR-
GET_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 depen-
dency, 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. Subse-
quent lines in the target entry begin with a TAB and contain Bourne
shell commands. These commands comprise the rule for building the tar-
get.
Shell commands may be continued across input lines by escaping the NEW-
LINE with a backslash (\). The continuing line must also start with a
TAB.
To rebuild a target, make expands macros, strips off initial TAB char-
acters 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
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 interpolate 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 targets. If a target is
named in more than one colon-terminated target entry, the depen-
dencies for all its entries are added to form that target's com-
plete dependency list.
:: Target terminator for alternate dependencies. When used in place
of a `:' the double-colon allows a target to be checked and
updated with respect to alternate dependency lists. When the tar-
get 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 indi-
cated targets as a group. It is normally performed only once per
make run, but is checked for command 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 refer-
ence. Notice that only one `%' can appear in a target, depen-
dency-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 character 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 depen-
dencies.
:sh = Define the value of a macro to be the output of a command (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 command 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 nor-
mally 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 character is not passed to
the shell.
? Escape command-dependency checking. Command lines starting with
this character are not subject to command dependency checking.
! Force command-dependency checking. Command-dependency checking is
applied to command lines for which it would otherwise be sup-
pressed. This checking is normally suppressed for lines that con-
tain 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 target.
.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 dependencies are
built before any other targets are processed.
.KEEP_STATE:
If this target is in effect, make updates the state file,
.make.state, in the current directory. This target also acti-
vates 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 pre-
vious 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 direc-
tory. 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:
Z.MAKE_VERSION: VERSION-number
enables version checking. If the version of make differs from
the version indicated, 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 exe-
cuted 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 con-
sists 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 suffix or word. Words in a
macro value are separated by SPACE, TAB, and escaped NEWLINE charac-
ters.
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) suf-
fix, 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 commands but
make. This lets you use `make -n' to test an entire hierarchy of make-
files.
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 commands 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 executed. 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 accor-
dance with the name derived from VPATH. For instance, if the target
subdir/foo.o is found in the directory /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 occur-
rences of the word that is the same as the target name in the subse-
quent 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 nor-
mal 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 cir-
cumstances, 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 suf-
fixes 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 paren-
theses 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 supplied. 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
encountered that match the pattern. A pattern replacement reference can
be used within the value.
You can temporarily append to a macro's value with a conditional defi-
nition 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 environ-
ment, 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 definitions are
supplied.
+------------------------------------------------------------------+
| | Table of P|redefined 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 addition 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 target name to
see if it ends with a suffix in the known suffixes 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 depen-
dency file, and rule is the rule for building a target in the class.
Both Ds and Ts must appear in the suffixes list. (A suffix need not
begin with a `.' to be recognized.)
A suffix rule with only one suffix describes how to build a target hav-
ing 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 suffix rule.
+-------------------------------------------------------------+
|Table of Standard I|mplicit (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 Standa|rd 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 Standar|d 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 Standar|d 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 I|mplicit (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 `.SUF-
FIXES:' 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 sig-
nificant 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 suf-
fix (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 typically .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 ineffectual 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 per-
son.
make invokes the shell with the -e (exit-on-errors) argument. Thus,
with semicolon-separated command sequences, execution of the later com-
mands depends on the success of the former. This behavior can be over-
ridden by starting the command 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 com-
mand line of the form:
if expression ; \
then command ; \
... ; \
else command ; \
... ; \
fi
Although composed of several input lines, the escaped NEWLINE charac-
ters 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 pre-
vents 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 reference, use a
reference of the form:
$(MACRO:sh)
where MACRO is the name of a macro containing a valid Bourne shell com-
mand 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:.
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 depen-
dencies:
pgm: a.o b.o
cc a.o b.o -o pgm
a.o b.o: incl.h
See environ(5) for descriptions of the following environment variables
that affect the execution of make: LC_CTYPE, LC_MESSAGES, and NLSPATH.
KEEP_STATE
This environment variable has the same effect as the .KEEP_STATE:
special-function target. It enables command dependencies, hidden
dependencies and writing of the state file.
USE_SVR4_MAKE
This environment variable causes make to invoke the generic Sys-
tem 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 leading 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 con-
tents 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 parsing 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 MAKE-
FLAGS. 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 vari-
able for all child processes. If the MAKEFLAGS macro is subse-
quently set by the makefile, it replaces the MAKEFLAGS variable
currently found in the environment.
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
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
See attributes(5) for descriptions of the following attributes:
/usr/ccs/bin/make
+-----------------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+-----------------------------+-----------------------------+
|Availability |SUNWsprot |
+-----------------------------+-----------------------------+
/usr/xpg4/bin/make
+-----------------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+-----------------------------+-----------------------------+
|Availability |SUNWxcu4t |
+-----------------------------+-----------------------------+
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), attributes(5), envi-
ron(5), POSIX.2(5)
Solaris Advanced User's Guide
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 defini-
tion.
Could not write state file `file'
You used the .KEEP_STATE: target, but do not have write permis-
sion 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 signal. 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 differently for each by virtue of condi-
tional macros. Since the target cannot simultaneously satisfy
both dependency relationships, it is conflicted.
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 com-
mands. 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 targets. 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 version 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 subsequently 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.
SunOS 5.9 1 Nov 1999 make(1S)