Contents|Index|Previous|Next
Features
of GNU make
The
following is a summary of the features of GNU make,
for comparison with and credit to other versions of make.
We consider the features of make
in 4.2 BSD systems as a baseline. If you are concerned with writing portable
makefiles, you should use only the features of make
not listed in the following documentation or in Incompatibilities
and missing features. Many features come from the version of
make
in System V.
-
The VPATH
variable and its special meaning. See Searching
directories for dependencies. This feature exists in System
V make,
but is undocumented. It is documented in 4.3 BSD make
(which says it mimics System Vs VPATH
feature).
-
Included makefiles. See Including
other makefiles. Allowing multiple files to be included with
a single directive is a GNU extension.
-
Variables are read from and
communicated via the environment. See Variables
from the environment.
-
Options passed through the variable
MAKEFLAGS
to recursive invocations of make.
See Communicating
options to a sub-make.
-
The automatic variable, $%,
is set to the member name in an archive reference. See Automatic
variables.
-
The automatic variables, $@,
$*,
$<,
$%,
and $?
have corresponding forms like $(@F)
and $(@D).
We have generalized this to $
as an obvious extension. See Automatic
variables.
-
Substitution variable references.
See Basics
of variable references.
-
The command-line options -b
and -m,
accepted and ignored. In System V make,
these options actually do something.
-
Execution of recursive commands
to run make
via the variable MAKE
even if -n,
-q
or -t
is specified. See Recursive
use of make.
-
Support for suffix .a
in suffix rules. See Suffix
rules for archive files. This feature is obsolete in GNU make
because the general feature of rule chaining (see Chains
of implicit rules) allows one pattern rule for installing members
in an archive (see Implicit
rule for archive member targets) to be sufficient.
-
The arrangement of lines and
backslash-newline combinations in commands is retained when the commands
are printed, so they appear as they do in the makefile, except for the
stripping of initial whitespace.
The following features were
inspired by various other versions of make.
In some cases it is unclear exactly which versions inspired which others.
-
Pattern rules using %.
This has been implemented in several versions of make.
Were not sure who invented it first, but its been spread around a bit.
See Defining
and redefining pattern rules.
-
Rule chaining and implicit intermediate
files. This was implemented by Stu Feldman in his version of make
for AT&T Eighth Edition Research Unix, and later by Andrew Hume of
AT&T Bell Labs in his mk
program (where he terms it transitive closure). We do not really know
if we got this from either of them or thought it up ourselves at the same
time. See Chains
of implicit rules.
-
The automatic variable, $,
containing a list of all dependencies of the current target. We did not
invent this, but we have no idea who did. See Automatic
variables. The automatic variable, $+,
is a simple extension of $.
-
The what if flag (-W
in GNU make)
was (as far as we know) invented by Andrew Hume in mk.
See Instead
of executing the commands.
-
The concept of doing several
things at once (parallelism) exists in many incarnations of make
and similar programs, though not in the System V or BSD implementations.
See Command
execution.
-
Modified variable references
using pattern substitution come from SunOS 4. See Basics
of variable references. This functionality was provided in GNU
make
by the patsubst
function before the alternate syntax was implemented for compatibility
with SunOS 4. It is not altogether clear who inspired whom, since GNU make
had patsubst
before SunOS 4 was released.
-
The special significance of
+
characters preceding command lines (see Instead
of executing the commands) is mandated by IEEE Standard 1003.2-1992
(POSIX.2).
-
The +=
syntax to append to the value of a variable comes from SunOS 4 make.
See Appending
more text to variables.
-
The syntax archive(mem1
mem2
...)
to list multiple members in a single archive file comes from SunOS 4 make.
See Implicit
rule for archive member targets.
-
The -include
directive to include makefiles with no error for a nonexistent file comes
from SunOS 4 make.
(But note that SunOS 4 make
does not allow multiple makefiles to be specified in one -include
directive.)
The remaining features are
inventions new in GNU make:
-
Use the -v
or --version
option to print version and copyright information.
-
Use the -h
or --help
option to summarize the options to make.
-
Simply-expanded variables. See
The
two flavors of variables.
-
Pass command-line variable assignments
automatically through the variable, MAKE,
to recursive make
invocations. See Recursive
use of make.
-
Use the -C
or --directory
command option to change directory. See Summary
of options.
-
Make verbatim variable definitions
with define.
See Defining
variables verbatim.
Declare phony targets with
the special target, .PHONY.
Andrew Hume of AT&T
Bell Labs implemented a similar feature with a different syntax in his
mk
program. This seems to be a case of parallel discovery. See Phony
targets.
-
Manipulate text by calling functions.
See Functions
for transforming text.
-
Use the -o
or --old-file
option to pretend a files modification-time is old. See Avoiding
recompilation of some files.
-
Conditional execution
This feature has been implemented
numerous times in various versions of make;
it seems a natural extension derived from the features of the C preprocessor
and similar macro languages and is not a revolutionary concept. See Conditional
parts of makefiles.
-
Specify a search path for included
makefiles. See Including
other makefiles.
-
Specify extra makefiles to read
with an environment variable. See The
variable, MAKEFILES
.
-
Strip leading sequences of ./
from file names, so that ./file
and file
are considered to be the same file.
-
Use a special search method
for library dependencies written in the form -l
name.
See Directory
search for link libraries.
-
Allow suffixes for suffix rules
(see Old-fashioned
suffix rules) to contain any characters. In other versions of
make,
they must begin with .
and not contain any /
characters.
-
Keep track of the current level
of make
recursion using the variable MAKELEVEL.
See Recursive
use of make.
-
Specify static pattern rules.
See Static
pattern rules.
-
Provide selective vpath
search. See Searching
directories for dependencies.
-
Provide computed variable references.
See Basics
of variable references.
-
Update makefiles. See How
makefiles are remade. System V make
has a very, very limited form of this functionality in that it will check
out SCCS files for makefiles.
-
Various new built-in implicit
rules. See Catalogue
of implicit rules.
-
The built-in variable, MAKE_VERSION,
gives the version number of make.
Top|Contents|Index|Previous|Next