\input texinfo	@c -*- Texinfo -*-
@setfilename make.info
@synindex vr fn

@ignore
$Header$

$Log$
Revision 1.50  1988/05/22 14:49:44  mcgrath
Major Beta release before release 2.0.

Revision 1.24  88/05/22  13:39:08  mcgrath
Misc cleanup

Revision 1.23  88/05/22  12:29:23  mcgrath
Static pattern rules section rewritten by RMS.

Revision 1.22  88/05/20  17:00:49  mcgrath
Documented extended static rules.

Revision 1.17  88/05/18  16:26:55  mcgrath
Fixed a couple Texinfo bugs.

Revision 1.16  88/05/15  18:58:00  mcgrath
Miscellaneous changes by Richard Stallman, added `$$@' to the
list of unsupported features.

Revision 1.15  88/05/11  21:30:52  mcgrath
* Made `$<' automatic variable be the first dependency of any rule.
* Bumped revision number to correspond to `make.c'.

Revision 1.9  88/05/04  17:56:07  mcgrath
* Miscellaneous changes suggested by RMS.
* The `define' directive makes recursive variables.
* Removed the `expand' function.

Revision 1.8  88/05/01  14:49:57  mcgrath
Added Bugs section, replacing the paragraph in 
the Overview chapter (Top node).

Revision 1.7  88/04/30  15:24:24  mcgrath
* Removed `roland@rtsg.lbl.gov' address.
* Doubled up @'s in addresses to fix Makeinfo errors.

Revision 1.6  88/04/24  00:57:23  roland
Removed $($@) automatic macro.

Revision 1.5  88/04/23  22:01:48  roland
* Added paragraph about reporting bugs.
* Documented -v (print version info) flag.
* Corrected a couple typos (probably made a couple more :-).
* Given to RMS for beta-testing.

Revision 1.4  88/04/23  18:28:02  roland
* Changed RCS stuff slightly (added a keyword).
* Changed date from February to April, 1988.
* Given to RMS for beta-testing.

Revision 1.3  88/04/23  17:40:09  roland
* Bumped revision number to be the same as the source.
* Note that the `patsubst' expansion function and expansions
  of the form `$(a:-b)', etc. (from Sun sh) were in revision
  1.2 but were accidently omitted from the log entry.

Revision 1.2  88/04/23  16:16:04  roland
* Added RCS log.
* Changed the copyrights from Richard Stallman to Free Software Foundation.
* Added Roland McGrath to the authors on the title page.
* Missing `include'd makefiles are warnings, not fatal errors.
* Clarified that conditionals determine what is `seen' in the makefile,
  so they can't be used to determine commands based on macros that are
  defined when the commands are executed (such as `$@').
* Added `-w' switch to log directories to stdout.
* Added selective VPATH lists and the `vpath' directive.
* Added the previously undocumented `-lLIB' dependency syntax.
* Added the `filter', `filter-out', `strip' and `join' expansion functions.
* Added simply expanded vs. recursively expanded variables, `:=' variable
  assignments and changed most examples to use `:=' rather than `='.
* Corrected miscellaneous typos, grammatical errors, etc.

This version of the documentation is accurate for revision 1.2 of the source.

@end ignore

@ifinfo
This file documents the GNU Make utility.

Copyright (C) 1988 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).

@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end ifinfo
@c
@setchapternewpage odd
@settitle Make

@titlepage
@sp 6
@center @titlefont{GNU Make}
@sp 1
@center A Program for Directing Recompilation
@sp 2
@center April 1988
@sp 5
@center Richard M. Stallman, Roland McGrath
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1988 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end titlepage
@page

@node Top, Bugs,, (DIR)
@chapter Overview of @code{make}

The purpose of the @code{make} utility is to determine automatically which
pieces of a large program need to be recompiled, and issue the commands to
recompile them.  This manual describes the GNU implementation of @code{make}.

GNU @code{make} was implemented by Richard Stallman and Roland McGrath.

Our examples show C programs, since they are most common, but you can use
@code{make} with any programming language whose compiler can be run with a
shell command.  In fact, @code{make} is not limited to programs.  You can
use it to describe any task where some files must be updated automatically
from others whenever the others change.

To prepare to use @code{make}, you must write a file called
the @dfn{makefile} that describes the relationships among files
in your program, and the states the commands for updating each file.
In a program, typically the executable file is updated from object
files, which are in turn made by compiling source files.@refill

Once a suitable makefile exists, each time you change some source files,
this simple shell command:

@example
make
@end example

@noindent
suffices to perform all necessary recompilations.  The @code{make} program
uses the makefile data base and the last-modification times of the files to
decide which of the files need to be updated.  For each of those files, it
issues the commands recorded in the data base.

@iftex
Command arguments to @code{make} can be used to control which files should
be recompiled, or how.  @xref{Running}.
@end iftex

@menu
* Bugs::	If you have problems, or think you've found a bug.
* Simple::	A simple example explained.
* Makefiles::	The data base contains rules and variable definitions.
* Rules::	A rule says how and when to remake one file.
* Commands::	A rule contains shell commands that say how to remake.
* Variables::	A variable holds a text string for substitution into rules.
* Conditionals::Makefiles that do one thing or another depending on
		 variable values.
* Functions::	Functions can do text-processing within @code{make}.

* Running::	How to run @code{make}; how you can adjust the way
		 @code{make} uses the makefile.

* Implicit::	Implicit rules take over if the makefile doesn't say
		 how a file is to be remade.
* Archives::	How to use @code{make} to update archive files.
* Missing::	Features of other @code{make}s not supported by GNU @code{make}.

* Concept Index::Index of cross-references to where concepts are discussed.
* Name Index::	Index of cross-references for names of @code{make}'s
		 variables, functions, special targets and directives.
@end menu

@node Bugs, Simple, Top, Top
@section Problems and Bugs

If you have problems with GNU @code{make} or think you've found a bug,
please report it to Roland McGrath; he doesn't promise to do anything
but he might well want to fix it.

Before reporting a bug, make sure you've actually found a real bug.
Carefully re-read the documentation and see if it really says you can do
what you're trying to do.  If it's not clear whether you should be able
to do something or not, report that too; it's a bug in the documentation!

Before reporting a bug or trying to fix it yourself, try to isolate it to
the smallest possible makefile that reproduces the problem.  Then send
us the makefile and the exact results @code{make} gave you.  Also say what
you expected to occur; this will help us decide whether the problem
was really in the documentation.

Once you've got a precise problem, send electronic mail to
Internet address @samp{bug-gnu-utils@@prep.ai.mit.edu} or UUCP path
@samp{mit-eddie!prep.ai.mit.edu!bug-gnu-utils}.  Please include the version
number of @code{make} you are using.  You can get this information with the
command @samp{make -v -f /dev/null}.@refill

Non-bug suggestions are always welcome as well.
If you have questions about things that are unclear in the documentation
or are just obscure features, ask Roland McGrath; he'll be happy to help
you out (but no promises).  You can send him electronic mail at Internet
address @samp{roland@@wheaties.ai.mit.edu} or UUCP path
@samp{mit-eddie!wheaties.ai.mit.edu!roland}.

@node Simple, Makefiles, Bugs, Top
@section Simple Example of @code{make}

Suppose we have a text editor consisting of eight C source files and three
header files.  We need a makefile to tell @code{make} how to compile and
link the editor.  Assume that all the C files include @file{defs.h}, but
only those defining editing commands include @file{commands.h} and only low
level files that change the editor buffer include @file{buffer.h}.

To recompile the editor, each changed C source file must be recompiled.  If
a header file has changed, to be safe each C source file that
includes the header file must be recompiled.  Each compilation produces an
object file corresponding to the source file.  Finally, if any source file
has been recompiled, all the object files, whether newly made or saved from
previous compilations, must be linked together to produce the new
executable editor.

Here is a straightforward makefile that describes these criteria and says
how to compile and link when the time comes:

@example
edit : main.o kbd.o commands.o display.o \
       insert.o search.o files.o utils.o
	cc -o edit main.o kbd.o commands.o display.o \
                   insert.o search.o files.o utils.o

main.o : main.c defs.h
	cc -c main.c
kbd.o : kbd.c defs.h command.h
	cc -c kbd.c
commands.o : command.c defs.h command.h
	cc -c commands.c
display.o : display.c defs.h buffer.h
	cc -c display.c
insert.o : insert.c defs.h buffer.h
	cc -c insert.c
search.o : search.c defs.h buffer.h
	cc -c search.c
files.o : files.c defs.h buffer.h command.h
	cc -c files.c
utils.o : utils.c defs.h
	cc -c utils.c
@end example

We split each long line into two lines using a backslash-newline; this is
like using one long line, but is easier to read.

Each file that is generated by a program---that is to say, each file except
for source files---is the @dfn{target} of a @dfn{rule} (@pxref{Rules}).
(In this example, these are the object files such as @file{main.o},
@file{kbd.o}, etc., and the executable file @file{edit}.)  The target
appears at the beginning of a line, followed by a colon.

After the colon come the target's @dfn{dependencies}: all the files that
are used as input when the target file is updated.  A target file needs to
be recompiled or relinked if any of its dependencies changes.  In addition,
any dependencies that are themselves automatically generated should be
updated first.  In this example, @file{edit} depends on each of the eight
object files; the object file @file{main.o} depends on the source file
@file{main.c} and on the header file @file{defs.h}.

By default, @code{make} starts with the first rule (not counting rules
whose target names start with @samp{.}).  This is called the @dfn{default
goal}.  Therefore, we put the rule for the executable program @file{edit}
first.  The other rules are processed because their targets appear as
dependencies of the goal.

After each line containing a target and dependencies come one or more lines
of shell commands that say how to update the target file.  These lines
start with a tab to tell @code{make} that they are command lines.  But
@code{make} does not know anything about how the commands work.  It is up
to you to supply commands that will update the target file properly.
All @code{make} does is execute the commands you have specified when the
target file needs to be updated.

@subsection How @code{make} Processes This Makefile

After reading the makefile, @code{make} begins its real work by processing
the first rule, the one for relinking @file{edit}; but before it can fully
process this rule, it must process the rules for the files @file{edit}
depends on: all the object files.  Each of these files is processed
according to its own rule.  These rules say to update the @samp{.o} file by
compiling its source file.  The recompilation must be done if the source
file, or any of the header files named as dependencies, is more recent than
the object file, or if the object file does not exist.

Before recompiling an object file, @code{make} considers updating its
dependencies, the source file and header files.  This makefile does not
specify anything to be done for them---the @samp{.c} and @samp{.h} files
are not the targets of any rules---so nothing needs to be done.  But
automatically generated C programs, such as made by Yacc (or Bison), would
be updated by their own rules at this time.

After recompiling whichever object files need it, @code{make} can now
decide whether to relink @file{edit}.  This must be done if the file
@file{edit} does not exist, or if any of the object files are newer than
it.  If an object file was just recompiled, it is now newer than
@file{edit}, so @file{edit} will be relinked.

@subsection Variables Make Makefiles Simpler

In our example, we had to list all the object files twice in the rule for
@file{edit} (repeated here):

@example
edit : main.o kbd.o commands.o display.o \
       insert.o search.o files.o utils.o
	cc -o edit main.o kbd.o commands.o display.o \
                   insert.o search.o files.o utils.o
@end example

@vindex objects
Such duplication is error-prone; if a new object file is added to the
system, we might add it to one list and forget the other.  We can eliminate
the risk and simplify the makefile by using a @dfn{variable}.  Variables
allow a text string to be defined once and substituted in multiple places
later (@pxref{Variables}).

It's standard practice for every makefile to have a variable named
@code{objects}, @code{OBJECTS}, @code{objs}, @code{OBJS}, @code{obj} or
@code{OBJ} which is a list of all object file names.  We would define
such a variable @code{objects} with a line like this in the makefile:@refill

@example
objects = main.o kbd.o commands.o display.o \
              insert.o search.o files.o utils.o
@end example

@noindent
Then, each place we want to put a list of the object file names, we can
substitute the variable's value by writing @samp{$(objects)}
(@pxref{Variables}).  Here is how the rule for @code{edit} looks as a
result:

@example
edit : $(objects)
	cc -o edit $(objects)
@end example

@subsection Letting @code{make} Deduce the Commands

It is not necessary to spell out the commands for compiling the individual
C source files, because @code{make} can figure them out: it has an
@dfn{implicit rule} for updating a @samp{.o} file from a correspondingly
named @samp{.c} file using a @samp{cc -c} command.  For example, it will
use the command @samp{cc -c main.c -o main.o} to compile @file{main.c} into
@file{main.o}.  We can therefore omit the commands from the rules for the
object files.  @xref{Implicit}.@refill

When a @samp{.c} file is used automatically in this way, it is also
automatically added to the list of dependencies.  We can therefore omit
the @samp{.c} files from the dependencies, provided we omit the commands.

Here is the entire example, with both of these changes, and a variable
@code{objects} as suggested above:

@example
objects =  main.o kbd.o commands.o display.o \
 insert.o search.o files.o utils.o

edit : $(objects)
	cc -o edit $(objects)

main.o : defs.h
kbd.o : defs.h command.h
commands.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
@end example

@noindent
This is how we would write the makefile in actual practice.

@subsection Another Style of Makefile

Since the rules for the object files specify only dependencies, no
commands, one can alternatively combine them by dependency instead of by
target.  Here is what it looks like:

@example
objects =  main.o kbd.o commands.o display.o \
 insert.o search.o files.o utils.o

edit : $(objects)
	cc -o edit $(objects)

$(objects) : defs.h
kbd.o commands.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
@end example

@noindent
Here @file{defs.h} is given as a dependency of all the object files;
@file{commands.h} and @file{buffer.h} are dependencies of the specific
object files listed for them.

Whether this is better is a matter of taste: it is more compact, but some
people dislike it because they find it clearer to put all the information
about each target in one place.

@node Makefiles, Rules, Simple, Top
@chapter Writing Makefiles

@cindex makefile
The information that tells @code{make} how to recompile a system comes from
reading a data base called the @dfn{makefile}.

@menu
* Contents: Makefile Contents.   Overview of what you put in a makefile.
* Names: Makefile Names.	 Where @code{make} finds the makefile.
* Include::                      How one makefile can use another makefile.
@end menu

@node Makefile Contents, Makefile Names, Makefiles, Makefiles
@section What Makefiles Contain

Makefiles contain four kinds of things: @dfn{rules}, @dfn{variable
definitions}, @dfn{directives} and @dfn{comments}.  Rules, variables and
directives are described at length in later chapters.@refill

@itemize @bullet
@item
A rule says when and how to remake one or more files, called the rule's
@dfn{targets}.  It lists the other files that the targets @dfn{depend on},
and may also give commands to use to create or update the targets.
@xref{Rules}.

@item
A variable definition is a line that specifies a text string value for
a @dfn{variable} that can be substituted into the text later.  The
simple makefile example (@pxref{Simple}) shows a variable definition
for @code{objects} as a list of all object files.  @xref{Variables},
for full details.

@item
A directive is a command for @code{make} to do something special while
reading the makefile.  These include:

@itemize @bullet
@item
Reading another makefile (@pxref{Include}).

@item
Deciding (based on the values of variables) whether to use or
ignore a part of the makefile (@pxref{Conditionals}).

@item
Defining a variable from a verbatim string containing multiple lines
(@pxref{Defining}).
@end itemize

@item
@cindex comments
@samp{#} in a line of a makefile starts a comment.  It and the rest of
the line are ignored.  Comments may appear on any of the lines in the
makefile, except within a @code{define} directive, and perhaps within
commands (where the shell decides what is a comment).  A line
containing just a comment (with perhaps spaces before it) is
effectively blank, and is ignored.
@end itemize

@node Makefile Names, Include, Makefile Contents, Makefiles
@section What Name to Give Your Makefile

By default, when @code{make} looks for the makefile, it tries the names
@file{./makefile} and @file{./Makefile} in that order.  So normally you call
your makefile by one of these two names, and @code{make} finds it
automatically.  We recommend @file{Makefile} because it appears prominently
near the beginning of a directory listing (right near other important
files such as @file{README}).@refill

If @code{make} finds neither of these two names, it does not use any
makefile.  Then you must specify a goal with a command argument, and
@code{make} will attempt to figure out how to remake it using only its
built-in implicit rules.@refill

If you want to use a nonstandard name for your makefile, you can specify
the makefile name with the @samp{-f} option.  The arguments @samp{-f
@var{name}} tell @code{make} to read the file @var{name} as the makefile.
If you use more than one @samp{-f} option, you can specify several
makefiles.  All the makefiles are effectively concatenated in the order
specified.  The default makefile names @file{./makefile} and
@file{./Makefile} are not used if you specify @samp{-f}.@refill

@vindex MAKEFILES
If the environment variable @code{MAKEFILES} is defined, @code{make}
considers its value as a list of names (separated by whitespace) of
additional makefiles to be read before the others.  This works much like
the @code{include} directive: various directories are searched for those
files and the default goal is never taken from them.  @xref{Include}.  In
addition, it is not an error if the files listed in @code{MAKEFILES} are
not found.@refill

The main use of @code{MAKEFILES} is in communication between recursive
invocations of @code{make} (@pxref{Recursion}).  It usually isn't
desirable to set the environment variable before a top-level invocation
of @code{make}, because it is usually better not to mess with a makefile
from outside.  However, if you are running @code{make} without a specific
makefile, a makefile in @code{MAKEFILES} can do useful things to help the
built-in implicit rules work better, such as defining search paths.

Some users are tempted to set @code{MAKEFILES} in the environment
automatically on login, and program makefiles to expect this to be done.
This is a very bad idea, because such makefiles will fail to work if run by
anyone else.  It is much better to write explicit @code{include} directives
in the makefiles.

@node Include,, Makefile Names, Makefiles
@section Including Other Makefiles

@findex include
The @code{include} directive tells @code{make} to suspend reading the
current makefile and read another makefile before continuing.  The
directive is a line in the makefile that looks like this:

@example
include @var{filename}
@end example

Extra spaces are allowed and ignored at the beginning of the line, but a
tab is not allowed.  (If the line begins with a tab, it will be considered
a command line.)  Whitespace is required between @code{include} and
@var{filename}; extra whitespace is ignored there and at the end of the
directive.  A comment starting with @samp{#} is allowed at the end of the
line.

Reading of the containing makefile is temporarily suspended while the file
@var{filename} is read as a makefile.  When that is finished, @code{make}
goes on with reading the makefile in which the directive appears.

The default goal target is never taken from an included makefile
(@pxref{Goals}).

One occasion for using @code{include} directives is when several programs,
handled by individual makefiles in various directories, need to use a
common set of variable definitions (@pxref{Setting}) or pattern rules
(@pxref{Pattern Rules}).

Another such occasion is when you want to automatically generate
dependencies from source files; the dependencies can be put in a file that
is included by the main makefile.  This practice is generally cleaner than
that of somehow appending the dependencies to the end of the main makefile
as has been traditionally done with other versions of @code{make}.

If the specified name does not start with a slash, and the file is not
found in the current directory, several other directories are searched.
First, any directories you have specified with the @samp{-I} option are
searched (@pxref{Options}).  Then the following directories (if they
exist) are searched, in this order: @file{/usr/gnu/include},
@file{/usr/local/include}, @file{/usr/include}.
If an included makefile cannot be found in any of these directories, a
warning message is generated, but it is not a fatal error.@refill

@node Rules, Commands, Makefiles, Top
@chapter Writing Rules

@cindex rule
@cindex target
@cindex dependency
A @dfn{rule} appears in the makefile and says when and how to remake
certain files, called the rule's @dfn{targets} (usually only one per rule).
It lists the other files that are the @dfn{dependencies} of the target, and
@dfn{commands} to use to create or update the target.

The order of rules is not significant, except for determining the
@dfn{default goal}: the target for @code{make} to consider, if you do not
otherwise specify one.  The default goal comes from the first rule (not
counting included makefiles) whose target does not start with a period.
Therefore, the first rule is normally one for compiling the entire program
or all the programs described by the makefile.  @xref{Goals}.

@menu
* Rule Example::        An explained example of a rule.
* Rule Syntax::	        General syntax of rules, with explanation.

* Wildcards::	        Using wildcard characters like `*' in file names.
* Directory Search::    Searching other directories for source files.

* Phony Targets::       Using a target that isn't a real file's name.
* Special Targets::     Targets with special built-in meanings.
* Empty Targets::       Real files that are empty--only the date matters.
* Multiple Targets::    When it is useful to have several targets in a rule.
* Static Pattern::	Static pattern rules apply to multiple targets
			 and can vary the dependencies according to the
			 target name.
* Multiple Rules::      Using several rules with the same target.
* Double-Colon::        Special kind of rule allowing
                          several independent rules for one target.
* Commands::            Special features and details of how commands
                         in a rule are executed.
@end menu

@ifinfo
@node Rule Example, Rule Syntax, Rules, Rules
@isubsection Rule Example

Here is an example of a rule:

@example
foo.o : foo.c defs.h       # module for twiddling the frobs
        cc -c -g foo.c
@end example

Its target is @file{foo.o} and its dependencies are @file{foo.c} and
@file{defs.h}.  It has one command, which is @samp{cc -c -g foo.c}.
The command line starts with a tab to identify it as a command.

This rule says two things:

@itemize @bullet
@item
How to decide whether @file{foo.o} is out of date: it is out of date
if it does not exist, or if either @file{foo.c} or @file{defs.h} is
more recent than it.

@item
How to update the file @file{foo.o}: by running @code{cc} as stated.
The command does not explicitly mention @file{defs.h}, but we presume
that @file{foo.c} includes it, and that that is why @file{defs.h} was
added to the dependencies.
@end itemize
@end ifinfo

@node Rule Syntax, Wildcards, Rule Example, Rules
@section Rule Syntax

In general, a rule looks like this:

@example
@var{targets} : @var{dependencies}
        @var{command}
        @var{command}
        ...
@end example

@noindent
or like this:

@example
@var{targets} : @var{dependencies} ; @var{command}
        @var{command}
        @var{command}
        ...
@end example

The @var{targets} are file names, separated by spaces.  Wild card
characters may be used (@pxref{Wildcards}) and a name of the form
@file{@var{a}(@var{m})} represents member @var{m} in archive file @var{a}
(@pxref{Archive Members}).  Usually there is only one target per rule, but
occasionally there is a reason to have more (@pxref{Multiple Targets}).

The @var{command} lines start with a tab character.  The first command may
appear on the line after the dependencies, with a tab character, or may
appear on the same line, with a semicolon.  Either way, the effect is the
same.  @xref{Commands}.

Because dollar signs are used to start variable references, if you really
want a dollar sign in the rule you must write two of them (@samp{$$}).
@xref{Variables}.  A long line may be split by inserting a backslash
followed by a newline, but this is not required, as there is no limit on
the length of a line.

A rule tells @code{make} two things: when the targets are out of date,
and how to update them when necessary.

The criterion for being out of date is specified in terms of the
@var{dependencies}, which consist of file names separated by spaces.
(Wildcards and archive members are allowed here too.)  A target is out of
date if it does not exist or if it is older than any of the dependencies
(by comparison of last-modification times).  The idea is that the contents
of the target file are computed based on information in the dependencies,
so if any of the dependencies changes the contents of the existing target
file are no longer necessarily valid.

How to remake is specified by @var{commands}.  These are lines to be
executed by the shell (normally @samp{sh}), but with some extra features
(@pxref{Commands}).

@node Wildcards, Directory Search, Rule Syntax, Rules
@section Using Wildcards Characters in File Names
@cindex wildcard
@cindex file name

A single file name can specify many files using @dfn{wildcard characters}.
The wildcard characters in @code{make} are @samp{*}, @samp{?} and
@samp{[@dots{}]}, the same as in the Bourne shell.  For example, @file{*.c}
specifies a list of all the files (in the working directory) whose names
end in @samp{.c}.@refill

Wildcard expansion happens automatically in targets, in dependencies, and
in commands.  In other contexts, wildcard expansion happens only if you
request it explicitly with the @code{wildcard} function.

The special significance of a wildcard character can be turned off by
preceding it with a backslash.  Thus, @file{foo\*bar} would refer to a
specific file whose name consists of @samp{foo}, an asterisk, and
@samp{bar}.@refill

@menu
* Examples: Wildcard Examples.    Some simple examples.
* Pitfall: Wildcard Pitfall.      @code{*.o} won't do what you want!
* Function: Wildcard Function.
       How to do wildcard expansion when defining a variable
       using the function @code{wildcard}.
@end menu

@node Wildcard Examples, Wildcard Function, Wildcards, Wildcards
@subsection Wildcard Examples

Wildcards can be used in the commands of a rule.  For example, here is a
rule to delete all the object files:

@example
clean:
        rm -f *.o
@end example

Wildcards are also useful in the dependencies of a rule.  With the
following rule in the makefile, @samp{make print} will print all the
@samp{.c} files that have changed since the last time you printed them:

@example
print: *.c
        lpr -p $?
        touch print
@end example

@noindent
This rule uses @file{print} as an empty target file; @pxref{Empty Targets}.

Wildcard expansion does not happen when you define a variable.  Thus, if
you write this:

@example
objects=*.o
@end example

@noindent
then the value of the variable @code{objects} is the actual string
@samp{*.o}.  However, if you use the value of @code{objects} in a target,
dependency or command, wildcard expansion will take place at that time.

@node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards
@subsection Pitfalls of Using Wildcards

Now here is an example of a naive way of using wildcard expansion, that
does not do what you would intend.  Suppose you would like to say that the
executable file @file{foo} is made from all the object files in the
directory, and you write this:

@example
objects=*.o

foo : $(objects)
        cc -o foo $(CFLAGS) $(objects)
@end example

@noindent
The value of @code{objects} is the actual string @samp{*.o}.  Wildcard
expansion happens in the rule for @file{foo}, so that each @emph{existing}
@samp{.o} file becomes a dependency of @file{foo} and will be recompiled if
necessary.

But what if you delete all the @samp{.o} files?  Then @samp{*.o} will
expand into @emph{nothing}.  The target @file{foo} will have no
dependencies and would be remade by linking no object files.  This is not
what you want!

Actually you can use wildcard expansion for this purpose, but you need more
sophisticated techniques, including the @code{wildcard} function and string
substitution.
@ifinfo
@xref{Wildcard Function}.
@end ifinfo
@iftex
These are described in the following section.
@end iftex

@node Wildcard Function,, Wildcard Pitfall, Wildcards
@subsection The Function @code{wildcard}
@findex wildcard

Wildcard expansion happens automatically in rules.  But wildcard expansion
does not normally take place when a variable is set, or inside the
arguments of a function.  If you want to do wildcard expansion in such
places, you need to use the @code{wildcard} function, like this:

@example
$(wildcard @var{pattern})
@end example

This string, used anywhere in a makefile, is replaced by a space-separated
list of names of existing files that match the pattern @var{pattern}.

One use of the @code{wildcard} function is to get a list of all the C source
files in a directory, like this:

@example
$(wildcard *.c)
@end example

We can change the list of C source files into a list of object files by
substituting @samp{.o} for @samp{.c} in the result, like this:

@example
$(subst .c,.o,$(wildcard *.c))
@end example

Here we have used another function, @code{subst} (@pxref{Text Functions}).

Thus, a makefile to compile all C source files in the directory and then
link them together could be written as follows:

@example
objects:=$(subst .c,.o,$(wildcard *.c))

foo : $(objects)
        cc -o foo $(LDFLAGS) $(objects)
@end example

@noindent
(This takes advantage of the implicit rule for compiling C programs, so
there is no need to write explicit rules for compiling the files.)

@node Directory Search, Phony Targets, Wildcards, Rules
@section Searching Directories for Dependencies
@vindex VPATH
@findex vpath
@cindex vpath
@cindex search path for dependencies
@cindex directory search

For large systems, it is often desirable to put sources in a separate
directory from the binaries.  The @dfn{directory search} features of
@code{make} facilitate this by searching several directories automatically
to find a dependency.  When you redistribute the files among directories,
you do not need to change the individual rules, just the search paths.

@menu
* General Search::    The @code{VPATH} variable specifies a search path
			that applies to every dependency.
* Selective Search::  The @code{vpath} directive specifies a search path
			for a specified class of names.
* Commands/Search::   How to write shell commands that work together
			with search paths.
* Implicit/Search::   How search paths affect implicit rules.
* Libraries/Search::  Directory search for link libraries.
@end menu

@node General Search, Selective Search, Directory Search, Directory Search
@subsection @code{VPATH}: Search Path for All Dependencies

The value of the variable @code{VPATH} is a list of directories which
@code{make} should search (in the order specified) for dependency files.
The directory names are separated by colons.  For example:

@example
VPATH = src:../headers
@end example

@noindent
specifies a path containing two directories, @file{src} and @file{../headers}.

Whenever a file listed as a dependency does not exist in the current
directory, the directories listed in @code{VPATH} are searched for a file
with that name.  If a file is found in one of them, that file becomes the
dependency.  Rules may then specify the names of source files as if they
all existed in the current directory.

Using the value of @code{VPATH} set in the previous example, a rule like this:

@example
foo.o : foo.c
@end example

@noindent
is interpreted as if it were written like this:

@example
foo.o : src/foo.c
@end example

@noindent
assuming the file @file{foo.c} does not exist in the current directory but
is found in the directory @file{src}.

@node Selective Search, Commands/Search, General Search, Directory Search
@subsection The @code{vpath} Directive

Similar to the @code{VPATH} variable but more selective is the @code{vpath}
directive, which allows you to specify a search path for a particular class
of filenames, those that match a particular pattern.  Thus you can supply
certain search directories for one class of filenames and other directories
(or none) for other filenames.

There are three forms of the @code{vpath} directive:

@table @code
@item vpath @var{pattern} @var{directories}
Specify the search path @var{directories} for filenames that match
@code{pattern}.  If another path was previously specified for the same
pattern, the new path replaces it.  Note that it does @emph{not} add
to the old path for this pattern.@refill

The search path, @var{directories}, is a colon-separated list of
directories to be searched, just like the search path used in the
@code{VPATH} variable.

@item vpath @var{pattern}
Clear out the search path associated with @var{pattern}.

@item vpath
Clear all search paths previously specified with @code{vpath} directives.
@end table

A @code{vpath} pattern is a string containing a @samp{%} character.  The
string must match the filename of a dependency that is being searched for,
the @samp{%} character matching any sequence of zero or more characters (as
in pattern rules; @pxref{Pattern Rules}).  (It is valid to omit the
@samp{%}, but then the pattern must match the dependency exactly, which may
not be very useful.)

When a dependency fails to exist in the current directory, if the
@var{pattern} in a @code{vpath} directive matches the name of the
dependency file, then the @var{directories} in that directive are searched
just like (and before) the directories in the @code{VPATH} variable.@refill

If several @code{vpath} patterns match the dependency file's name, then
@code{make} processes each matching @code{vpath} directive one by one,
searching all the directories mentioned in each directive.  The @code{vpath}
directives are processed in the order in which they appear in the makefiles.

@node Commands/Search, Implicit/Search, Selective Search, Directory Search
@subsection Writing Shell-Commands with Directory Search

When a dependency is found in another directory through directory search,
this cannot change the commands of the rule; they will execute as written.
Therefore, you must write the commands with care so that they will look for
the dependency in the directory where @code{make} finds it.

This is done with the @dfn{automatic variables} such as @samp{$^}
(@pxref{Automatic}).  For instance, the value of @samp{$^} is a list of all
the dependencies of the rule, including the names of the directories in
which they were found, and the value of @samp{$@@} is the target.  Thus:

@example
foo.o : foo.c
        cc -c $(CFLAGS) $^ -o $@@
@end example

@noindent
The variable @code{CFLAGS} exists so you can specify flags for C
compilation by implicit rule; we use it here for consistency so it will
affect all C compilations uniformly.  (@pxref{Implicit Variables}).

Often the dependencies include header files as well, which you don't want
to mention in the commands.  The function @code{firstword} can be used to
extract just the first dependency from the entire list, as shown here
(@pxref{Filename Functions}):

@example
VPATH = src:../headers
foo.o : foo.c defs.h hack.h
        cc -c $(CFLAGS) $(firstword $^) -o $@@
@end example

@noindent
Here the value of @samp{$^} would be something like @samp{src/foo.c
../headers/defs.h hack.h}, from which @samp{$(firstword $^)} extracts just
@samp{src/foo.c}.@refill

@node Implicit/Search, Libraries/Search, Commands/Search, Directory Search
@subsection Directory Search and Implicit Rules

The search through the directories specified in @code{VPATH} or with
@code{vpath} happens also during consideration of implicit rules
(@pxref{Implicit}).

For example, when a file @file{foo.o} has no explicit rule, @code{make}
considers implicit rules, such as to compile @file{foo.c} if that file
exists.  If such a file is lacking in the current directory, the
appropriate directories are searched for it.  If @file{foo.c} exists (or is
mentioned in the makefile) in any of the directories, the implicit rule for
C compilation is applicable.

The commands of all the built-in implicit rules normally use automatic
variables as a matter of necessity; consequently they will use the file
names found by directory search with no extra effort.

@node Libraries/Search,, Implicit/Search, Directory Search
@subsection Directory Search for Link Libraries

Directory search applies in a special way to libraries used with the
linker.  This special feature comes into play when you write a dependency
whose name is of the form @code{-l@var{name}}.  (You can tell something
funny is going on here because the dependency is normally the name of a
file, and the @emph{file name} of the library looks like
@file{lib@var{name}.a}, not like @code{-l@var{name}}.)@refill

When a dependency's name has the form @code{-l@var{name}}, @code{make}
handles it specially by searching for the file @samp{lib@var{name}.a} in
the directories @samp{/lib} and @samp{/usr/lib}, and then using matching
@code{vpath} search paths and the @code{VPATH} search path.@refill

For example,

@example
foo : foo.c -lcurses
	cc $^ -o $@@
@end example

@noindent
would cause the command @samp{cc foo.c -lcurses -o foo} to be executed when
@file{foo} is older than @file{foo.c} or than @file{libcurses.a} (which has
probably been found by directory search in @file{/usr/lib/libcurses.a}).@refill

As shown by the example above, the file name found by directory search is
used only for comparing the file time with the target file's time.  It
does not replace the file's name in later usage (such as in automatic
variables like @code{$^}); the name remains unchanged, still starting
with @samp{-l}.  This leads to the correct results because the linker
will repeat the appropriate search when it processes its arguments.@refill

@node Phony Targets, Empty Targets, Directory Search, Rules
@section Phony Targets

A phony target is one that is not really the name of a file.
It is only a name for some commands to be executed when explicitly
requested.

If you write a rule whose commands will not create the target file, the
commands will be executed every time the target comes up for remaking.
Here is an example:

@example
clean:
        rm *.o temp
@end example

@noindent
Because the @code{rm} command does not create a file named @file{clean},
probably no such file will ever exist.  Therefore, the @code{rm} command
will be executed every time you say @samp{make clean}.

@findex .PHONY
The phony target will cease to work if anything ever does create a file
named @file{clean} in this directory.  Since there are no dependencies, the
@file{clean} would be considered up-to-date and its commands would not be
executed.  To avoid this problem, you can explicitly declare the target to
be phony, using the special target @code{.PHONY} (@pxref{Special Targets})
as follows:

@example
.PHONY : clean
@end example

@noindent
Once this is done, @code{make} will run the commands regardless of whether
there is a file named @file{clean}.

A phony target should not be a dependency of a real target file; strange
things can result from that.  As long as you don't do that, the phony
target commands will be executed only when the phony target is a goal
(@pxref{Goals}).

Phony targets can have dependencies.  When one directory contains multiple
programs, it is most convenient to describe all of the programs in one
makefile @file{./Makefile}.  Since the target remade by default will be the
first one in the makefile, it is common to make this a phony target named
@samp{all} and give it, as dependencies, all the individual programs.  For
example:

@example
all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
        cc -o prog1 prog1.o utils.o

prog2 : prog2.o
        cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
        cc -o prog3 prog3.o sort.o utils.o
@end example

@noindent
Now you can say @code{make} to remake all three programs, or specify
as arguments the ones to remake (as in @samp{make prog1 prog3}).

When one phony target is a dependency of another, it serves as a subroutine
of the other.  For example, here @samp{make cleanall} will delete the
object files, the difference files, and the file @file{program}:

@example
cleanall : cleanobj cleandiff
        rm program

cleanobj :
        rm *.o

cleandiff :
        rm *.diff
@end example

@node Empty Targets, Special Targets, Phony Targets, Rules
@section Empty Target Files to Record Events
@cindex empty target

The @dfn{empty target} is a variant of the phony target; it is used to hold
commands for an action that you request explicitly from time to time.
Unlike a phony target, this target file can really exist; but the file's
contents do not matter, and usually are empty.

The purpose of the empty target file is to record, with its
last-modification-time, when the rule's commands were last executed.  It
does so because one of the commands is a @code{touch} command to update the
target file.

The empty target file must have some dependencies.  When you ask to remake
the empty target, the commands are executed if any dependency is more
recent than the target; in other words, if a dependency has changed since
the last time you remade the target.  Here is an example:

@example
print: foo.c bar.c
        lpr -p $?
        touch print
@end example

@noindent
With this rule, @samp{make print} will execute the @code{lpr} command if
either source file has changed since the last @samp{make print}.  The
automatic variable @samp{$?} is used to print only those files that have
changed (@pxref{Automatic}).

@node Special Targets, Multiple Targets, Empty Targets, Rules
@section Special Built-in Target Names
@cindex special targets

Certain names have special meanings if they appear as targets.

@table @code
@item .PHONY
The dependencies of the special target @code{.PHONY} are considered to
be phony targets.  When it is time to consider such a target,
@code{make} will run its commands unconditionally, regardless of
whether a file with that name exists or what its date is.  @xref{Phony
Targets}.

@item .SUFFIXES
The dependencies of the special target @code{.SUFFIXES} are the list
of suffixes to be used in checking for suffix rules (@pxref{Suffix
Rules}).

@item .DEFAULT
The commands specified for @code{.DEFAULT} are used for any target for
which no other commands are known (either explicitly or through an
implicit rule).  If @code{.DEFAULT} commands are specified, every
nonexistent file mentioned as a dependency will have these commands
executed on its behalf.  @xref{Search Algorithm}.

@item .PRECIOUS
The targets which @code{.PRECIOUS} depends on are given this special
treatment: if @code{make} is killed or interrupted during the
execution of their commands, the target is not deleted.
@xref{Interrupts}.

@item .IGNORE
Simply by being mentioned as a target, @code{.IGNORE} says to ignore
errors in execution of commands.  The dependencies and commands for
@code{.IGNORE} are not meaningful.

@samp{.IGNORE} exists for historical compatibility.  Since
@code{.IGNORE} affects every command in the makefile, it is not very
useful; we recommend you use the more selective ways to ignore errors
in specific commands (@pxref{Errors}).

@item .SILENT
Simply by being mentioned as a target, @code{.SILENT} says not to
print commands before executing them.  The dependencies and commands
for @code{.SILENT} are not meaningful.

@samp{.SILENT} exists for historical compatibility.  We recommend you
use the more selective ways to silence specific commands
(@pxref{Echoing}).
@end table

An entire class of special targets have names made of the concatenation of
two implicit rule suffixes (two members of the list of dependencies of
@code{.SUFFIXES}).  Such special targets are suffix rules, an obsolete way
of defining implicit rules (but a way still widely used).  In principle,
any target name could be special in this way if you break it in two and add
both pieces to the suffix list.  In practice, suffixes normally begin with
@samp{.}, so these special target names also begin with @samp{.}.
@xref{Suffix Rules}.

@node Multiple Targets, Multiple Rules, Special Targets, Rules
@section Multiple Targets in a Rule

A rule with multiple targets is equivalent to writing many rules, each with
one target, and all identical aside from that.  The same commands apply to
all the targets, but their effects may vary because you can substitute the
actual target name into the command using @samp{$@@}.  The rule contributes
the same dependencies to all the targets also.

This is useful in two cases.

@itemize @bullet
@item
You want just dependencies, no commands.  For example:

@example
kbd.o commands.o files.o: command.h
@end example

@noindent
gives an additional dependency to each of the three object files
mentioned.

@item
Similar commands work for all the targets.  The commands do not need
to be absolutely identical, since the automatic variable @samp{$@@}
can be used to substitute the particular target to be remade into the
commands (@pxref{Automatic}).  For example:

@example
bigoutput littleoutput : text.g
        generate text.g -$(subst output,,$@@) > $@@
@end example

@noindent
is equivalent to

@example
bigoutput : text.g
        generate text.g -big > bigoutput
littleoutput : text.g
        generate text.g -little > littleoutput
@end example

@noindent
Here we assume the hypothetical program @code{generate} makes two
types of output, one if given @samp{-big} and one if given
@samp{-little}.@refill
@end itemize

@ifinfo
Suppose you would like to vary the dependencies according to the target,
much as the variable @samp{$@@} allows you to vary the commands.
You cannot do this with multiple targets in an ordinary rule, but you can
do it with a @dfn{static pattern rule}.  @xref{Static Pattern}.
@end ifinfo

@node Static Pattern, Multiple Rules, Multiple Targets, Rules
@section Static Pattern Rules
@cindex static pattern rules
@cindex varying dependencies

@dfn{Static pattern rules} are rules which specify multiple targets and
construct the dependency names for each target based on the target name.
They are more general than ordinary rules with multiple targets because the
targets don't have to have identical dependencies.  Their dependencies must
be @emph{analogous}, but not necessarily @emph{identical}.

Here is the syntax of a static pattern rule:

@example
@var{targets}: @var{target-pattern}: @var{dep-patterns} @dots{}
        @var{commands}
	@dots{}
@end example

@noindent
Here @var{targets} gives the list of targets that the rule applies to.  The
targets can contain wildcard characters, just like the targets of ordinary
rules (@pxref{Wildcards}).

The @var{target-pattern} and @var{dep-patterns} say how to compute the
dependencies of each target.  Each target is matched against the
@var{target-pattern} to extract a part of the target name, called the
@dfn{stem}.  This stem is substituted into each of the @var{dep-patterns}
to make the dependency names (one from each @var{dep-pattern}).

Each pattern normally contains the character @samp{%} just once.  When the
@var{target-pattern} matches a target, the @samp{%} can match any part of
the target name; this part is called the @dfn{stem}.  The rest of the
pattern must match exactly.  For example, the target @file{foo.o} matches
the pattern @samp{%.o}, with @samp{foo} as the stem.  The targets
@file{foo.c} and @file{foo.out} don't match that pattern.@refill

The dependency names for each target are made by substituting the stem for
the @samp{%} in each dependency pattern.  For example, if one dependency
pattern is @file{%.c}, then substitution of the stem @samp{foo} gives the
dependency name @file{foo.c}.  It is fine to write a dependency pattern that
doesn't contain @samp{%}; then this dependency is the same for all targets.

Here is an example, which compiles each of @file{foo.o} and @file{bar.o}
from the corresponding @file{.c} file:

@example
objects := foo.o bar.o

$(objects): %.o: %.c
	$(CC) -c $(CFLAGS) $< -o $@@
@end example

Each target specified must match the target pattern; a warning is issued
for each that does not.  If you have a list of files, only some of which
will match the pattern, you can use the @code{filter} function to remove
nonmatching filenames (@pxref{Functions}):

@example
files := foo.elc bar.o

$(filter %.o,$(files)): %.o: %.c
        $(CC) -c $(CFLAGS) $< -o $@@
$(filter %.elc,$(files)): %.elc: %.el
        emacs -f batch-byte-compile $<
@end example

@subsection Static Pattern Rules versus Implicit Rules

A static pattern rule has much in common with an implicit rule defined as a
pattern rule (@pxref{Pattern Rules}).  Both have a pattern for the target
and patterns for constructing the names of dependencies.  The difference is
in how @code{make} decides @emph{when} the rule applies.

An implicit rule @emph{can} apply to any target that matches its pattern,
but it @emph{does} apply only when the target has no commands otherwise
specified, and only when the dependencies can be found.  If more than one
implicit rule appears applicable, only one applies; the choice depends on
the order of rules.

By contrast, a static pattern rule applies to the precise list of targets
that you specify in the rule.  It cannot apply to any other target and it
invariably does apply to each of the targets specified.  If two conflicting
rules apply, and both have commands, that's an error.

The static pattern rule can be better than an implicit rule for these
reasons:

@itemize @bullet
@item
You may wish to override the usual implicit rule for a few files whose
names cannot be categorized syntactically but can be given in an
explicit list.

@item
If you cannot be sure of the precise contents of the directories you
are using, you may not be sure which other irrelevant files might lead
@code{make} to use the wrong implicit rule.  The choice might depend
on the order in which the implicit rule search is done.  With static
pattern rules, there is no uncertainty: each rule applies to precisely
the targets specified.
@end itemize

@node Multiple Rules, Double-Colon, Static Pattern, Rules
@section Multiple Rules for One Target

One file can be the target of several rules if at most one rule has commands.
The other rules can only have dependencies.  All the dependencies mentioned
in all the rules are merged into one list of dependencies for the target.
If the target is older than any dependency from any rule, the commands are
executed.

An extra rule with just dependencies can be used to give a few extra
dependencies to many files at once.  For example, one usually has a
variable named @code{objects} containing a list of all the compiler output
files in the system being made.  An easy way to say that all of them must
be recompiled if @file{config.h} changes is to write

@example
objects = foo.o bar.o
foo.o : defs.h
bar.o : defs.h test.h
$(objects) : config.h
@end example

This could be inserted or taken out without changing the rules that really
say how to make the object files, making it a convenient form to use if
you wish to add the additional dependency intermittently.

Another wrinkle is that the additional dependencies could be specified with
a variable that you could set with a command argument to @code{make}
(@pxref{Overriding}).  For example,

@example
extradeps=
$(objects) : $(extradeps)
@end example

@noindent
means that the command @samp{make extradeps=foo.h} will consider
@file{foo.h} as a dependency of each object file, but plain @samp{make}
will not.

If none of the explicit rules for a target has commands, then @code{make}
searches for an applicable implicit rule to find some commands.
@xref{Implicit}.

@node Double-Colon,, Multiple Rules, Rules
@section Double-Colon Rules
@cindex double-colon rule

@dfn{Double-colon} rules are rules written with @samp{::} instead of
@samp{:} after the target names.  They are handled differently from
ordinary rules when the same target appears in more than one rule.

When a target appears in multiple rules, all the rules must be the same
type: all ordinary, or all double-colon.  If they are double-colon, each of
them is independent of the others.  Each double-colon rule's commands are
executed if the target is older than any dependencies of that rule.  This
can result in executing none, any or all of the double-colon rules.

The double-colon rules for a target are executed in the order they appear
in the makefile.  However, the cases where double-colon rules really make
sense are those where the order of executing the commands would not matter.

Each double-colon rule should specify commands; if it does not, an
implicit rule will be used if one applies.  @xref{Implicit}.

@node Commands, Variables, Rules, Top
@chapter Writing the Commands in Rules
@cindex command (in rules)

The commands of a rule consist of shell command lines to be executed one by
one.  Each command line must start with a tab, except that the first
command line may be attached to the target-and-dependencies line with a
semicolon in between.  Blank lines and lines of just comments may appear
among the command lines; they are ignored.

Users use many different shell programs, but commands in makefiles are
always interpreted by @file{/bin/sh} unless the makefile specifies otherwise.

Whether comments can be written on command lines, and what syntax they use,
is under the control of the shell that is in use.  If it is @file{/bin/sh},
a @samp{#} at the start of a word starts a comment.

@menu
* Echoing::       Normally commands are echoed before execution,
                    but you can control this in several ways.
* Execution::     How commands are executed.
* Errors::	  What happens after an error in command execution.
		   How to ignore errors in certain commands.
* Interrupts::	  If a command is interrupted or killed,
		   the target may be deleted.
* Recursion::	  Invoking @code{make} from commands in makefiles.
* Sequences::     Defining canned sequences of commands.
@end menu

@node Echoing, Execution, Commands, Commands
@section Command Echoing

@cindex echoing (of commands)
@cindex silent operation
@cindex @@ (in commands)
@cindex -n
Normally @code{make} prints each command line before it is executed.  We
call this @dfn{echoing} because it gives the appearance that you are typing
the commands yourself.

When a line starts with @samp{@@}, it is normally not echoed.  The
@samp{@@} is discarded before the command is passed to the shell.  Typically
you would use this for a command whose only effect is to print something,
such as an @code{echo} command.

When @code{make} is given the flag @samp{-n}, echoing is all that happens,
no execution.  @xref{Options}.  In this case and only this case, even the
commands starting with @samp{@@} are printed.  This flag is useful for
finding out which commands @code{make} thinks are necessary without
actually doing them.

@cindex -s
@findex .SILENT
The @samp{-s} flag to @code{make} prevents all echoing, as if all commands
started with @samp{@@}.  A rule in the makefile for the special target
@code{.SILENT} has the same effect (@pxref{Special Targets}).
@code{.SILENT} is essentially obsolete since @samp{@@} is more
general.@refill

@node Execution, Errors, Echoing, Commands
@section Command Execution
@cindex execution
@cindex shell

When it is time to execute commands to update a target, they are executed
one at a time by making a new subshell for each line.  (In practice,
@code{make} may take shortcuts that do not affect the results.)

This implies that shell commands such as @code{cd} that set variables local
to each process will not affect the following command lines.  If you want
to use @code{cd} to affect the next command, put the two on a single line
with a semicolon between them.  Then @code{make} will consider them a
single command and pass them, together, to a shell which will execute them
in sequence.  For example:

@example
foo : bar/lose
        cd bar; gobble lose > ../foo
@end example

If you would like to split a single shell command into multiple lines of
text, you must use a backslash at the end of all but the last subline.
Such a sequence of lines is combined into a single line, by deleting the
backslash-newline sequences, before passing it to the shell.  Thus, the
following is equivalent to the preceding example:

@group
@example
foo : bar/lose
        cd bar;  \
        gobble lose > ../foo
@end example
@end group

@vindex SHELL
@vindex SHFLAGS
The program used as the shell is taken from the variable @code{SHELL}.  By
default, the program @file{/bin/sh} is used.

Unlike most variables, the variable @code{SHELL} will not be set from the
environment, except in a recursive @code{make}.  This is because the
environment variable @code{SHELL} is used to specify your personal choice
of shell program for interactive use.  It would be very bad for personal
choices like this to affect the functioning of makefiles.
@xref{Environment}.

The value of the variable @code{SHFLAGS} is used as additional command
arguments to give to the shell each time it is run.  By default, the
value is empty.  This variable also is not set from the environment
except in recursive use of @code{make}.

@node Errors, Interrupts, Execution, Commands
@section Errors in Commands

@cindex error (in commands)
After each shell command returns, @code{make} looks at its exit status.
If the command completed successfully, the next command line is executed in
a new shell, or after the last command line the rule is finished.

If there is an error (the exit status is nonzero), @code{make} gives up on
the current rule, and perhaps on all rules.

Sometimes it does not matter whether a command fails.  For example, you
may use the @code{mkdir} command to insure that a directory exists.  If
the directory already exists, @code{mkdir} will report an error, but you
probably want @code{make} to continue regardless.

@cindex - (in commands)
To ignore errors in a command line, write a @samp{-} at the beginning of
the line's text (after the initial tab).  The @samp{-} is discarded before
the command is passed to the shell for execution.

@cindex -i
@findex .IGNORE
When @code{make} is run with the @samp{-i} flag, errors are ignored in
all commands of all rules.  A rule in the makefile for the special target
@code{.IGNORE} has the same effect.  These ways of ignoring errors are
obsolete because @samp{-} is more general.

When errors are to be ignored, because of either a @samp{-} or the
@samp{-i} flag, @code{make} treats an error return just like success.

@cindex -k
When an error happens that @code{make} has not been told to ignore,
it implies that the current target cannot be correctly remade, and neither
can any other that depends on it either directly or indirectly.  No further
commands will be executed for these targets, since their preconditions
have not been achieved.

Normally @code{make} gives up immediately in this circumstance, returning a
nonzero status.  However, if the @samp{-k} flag is specified, @code{make}
continues to consider the other dependencies of the pending targets,
remaking them if necessary, before it gives up and returns nonzero status.
For example, after an error in compiling one object file, @samp{make -k}
will continue compiling other object files even though it already knows
that linking them will be impossible.  @xref{Options}.

The usual behavior assumes that your purpose is to get the specified
targets up to date; once @code{make} learns that this is impossible, it
might as well report the failure immediately.  @samp{-k} says that the real
purpose is to test as much as possible of the changes made in the program,
perhaps to find several independent problems so that you can correct them
all before the next attempt to compile.  This is why Emacs's @code{compile}
command passes the @samp{-k} flag by default.

@node Interrupts, Recursion, Errors, Commands
@section Interrupting or Killing @code{make}
@cindex interrupt
@cindex signal
@cindex deletion of target files

If @code{make} gets a fatal signal while a command is executing, it may
delete the target file that the command was supposed to update.  This is
done if the target file's date has changed since @code{make} first checked it.

The purpose of deleting the target is to make sure that it is remade from
scratch when @code{make} is next run.  Otherwise, a partially written file
could appear to be valid, since it is more recent than the dependencies.

@findex .PRECIOUS
You can prevent the deletion of a target file in this way by making the
special target @code{.PRECIOUS} depend on it.  Before remaking a target,
@code{make} checks to see whether it appears on the dependencies of
@code{.PRECIOUS}, and thereby decides whether the target should be
deleted if a signal happens.  Some reasons why you might do this are
that the target is updated in some atomic fashion or exists only to
record a date/time (its contents do not matter) or will cause trouble
if it ever fails to exist.

@node Recursion, Sequences, Interrupts, Commands
@section Recursive Use of @code{make}
@cindex recursion
@vindex MAKE

Recursive use of @code{make} means using @code{make} as a command in a
makefile.  This technique is useful when you want separate makefiles for
various subsystems that compose a larger system.  For example, suppose you
have a subdirectory @file{subdir} which has its own makefile, and you would
like the containing directory's makefile to run @code{make} on the
subdirectory.

You can do it by writing this:

@example
subsystem:
        cd subdir; $(MAKE)
@end example

@noindent
or, equivalently, this (@pxref{Options}):

@example
subsystem:
        $(MAKE) -c subdir
@end example

That's all you have to write in the makefile to cause the sub-@code{make}
to be run if you do @code{make subsystem}, but there are other things you
should know about how this does its job and how the sub-@code{make} relates
to the top-level @code{make}.

The commands above use the variable @code{MAKE}, whose value is the file
name with which @code{make} was invoked.  If this file name was
@file{/bin/make}, then the command executed is @samp{cd subdir; /bin/make}.
If you use a special version of @code{make} to run the top-level makefile,
the same special version will be executed for recursive invocations.  Also,
any arguments that define variable values are added to @code{MAKE}, so the
sub-@code{make} gets them too.  Thus, if you do @samp{make CFLAGS=-O}, so
that all C-compilations will be optimized, the sub-@code{make} is run with
@samp{cd subdir; /bin/make CFLAGS=-O}.

The flag options you give to the top-level @code{make} are passed down
to the sub-@code{make} automatically, through the variable @code{MAKEFLAGS}
as described below.

All the other variable values of the top-level @code{make} are passed to
the sub-@code{make} through the environment.  These variables are defined
in the sub-@code{make} as defaults, but do not override what is specified
in the sub-@code{make}'s makefile.  The way this works is that @code{make}
adds each variable and its value to the environment for running each
command.  (Variables whose names start with non-alphanumeric characters are
left out.)  The sub-@code{make}, in turn, uses the environment to
initialize its table of variable values.  @xref{Environment}.

@vindex MAKELEVEL
As a special feature, the variable @code{MAKELEVEL} is changed when it is
passed down from level to level.  This variable's value is a string which
is the depth of the level as a decimal number.  The value is @samp{0} for
the top-level @code{make}; @samp{1} for a sub-@code{make}, @samp{2} for a
sub-sub-@code{make}, and so on.  The incrementation happens when
@code{make} sets up the environment for a command.@refill

The main use of @code{MAKELEVEL} is to test it in a conditional directive
(@pxref{Conditionals}); this way you can write a makefile that behaves one
way if run recursively and another way if run directly by you.

@vindex MAKEFLAGS
Flags such as @samp{-s} and @samp{-k} are passed automatically to the
sub-@code{make} through the variable @code{MAKEFLAGS}.  This variable is
set up automatically by @code{make} to contain the flag letters that
@code{make} received.  Thus, if you do @samp{make -ks} then
@code{MAKEFLAGS} gets the value @samp{ks}.

As a consequence, every sub-@code{make} gets a value for @code{MAKEFLAGS}
in its environment.  In response, it takes the flags from that value and
processes them as if they had been given as arguments.  @xref{Options}.

The options @samp{-c}, @samp{-d}, @samp{-f}, @samp{-I}, @samp{-o}, and
@samp{-p} are not put into @code{MAKEFLAGS}; these options are not
passed down.@refill

If you don't want to pass the other the flags down, you must change the
value of @code{MAKEFLAGS}, like this:

@example
subsystem:
        cd subdir; $(MAKE) MAKEFLAGS=
@end example

@vindex MFLAGS
A similar variable @code{MFLAGS} exists also, for historical compatibility.
It has the same value as @code{MAKEFLAGS} except that a hyphen is added at
the beginning if it is not empty.  @code{MFLAGS} was traditionally used
explicitly in the recursive @code{make} command, like this:

@example
subsystem:
        cd subdir; $(MAKE) $(MFLAGS)
@end example

@noindent
but now @code{MAKEFLAGS} makes this usage redundant.

What about @samp{make -t}?  (@xref{Instead of Execution}.)  Following the
usual definition of @samp{-t}, this would create a file named
@file{subsystem}.  What you really want it to do is run @samp{cd subdir;
make -t}; but that would require executing the command, and @samp{-t} says
not to execute commands.@refill

The paradox is resolved by a special @code{make} feature: whenever a
command uses the variable @code{MAKE}, the flags @samp{-t}, @samp{-n} or
@samp{-q} do not apply to that rule.  The commands of that rule are
executed normally despite the presence of a flag that causes most
commands not to be run.  These flags are passed along via
@code{MAKEFLAGS}, so your request to touch the files, or print the
commands, is propagated to the subsystem.

@vindex MAKEFILES
If the environment variable @code{MAKEFILES} is defined, @code{make}
considers its value as a list of names (separated by whitespace) of
additional makefiles to be read before the others.  This works much like
the @code{include} directive: various directories are searched for those
files and the default goal is never taken from them.  @xref{Include}.  In
addition, it is not an error if the files listed in @code{MAKEFILES} are
not found.

The main use of @code{MAKEFILES} is with recursive invocation of @code{make}.
The outer @code{make} can set @code{MAKEFILES} to influence recursive
@code{make} levels.

If you are running @code{make} over a large directory tree, the @code{-w}
option can make understanding the output a lot easier by showing each
directory as it is entered and exited.  For example, if @code{make -w} is
run in the directory @file{/u/gnu/make}, @code{make} will print a line of
the form:

@example
make: Entering directory `/u/gnu/make'.
@end example

@noindent
before doing anything else, and a line of this form:

@example
make: Leaving directory `/u/gnu/make'.
@end example

@noindent
when processing is completed.

@node Sequences,, Recursion, Commands
@section Defining Canned Command Sequences
@cindex sequences of commands

When the same sequence of commands is useful in making various targets, you
can define it as a canned sequence with the @code{define} directive, and
refer to the canned sequence from the rules for those targets.  The canned
sequence is actually a variable, so the name must not conflict with other
variable names.

Here is an example of defining a canned sequence of commands:

@example
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@@
endef
@end example

@noindent
Here @code{run-yacc} is the name of the variable being defined;
@code{endef} marks the end of the definition; the lines in between are the
commands.  The @code{define} directive does not expand variable references
and function calls in the canned sequence; the @samp{$} characters,
parentheses, variable names, and so on, all become part of the value of the
variable you are defining.  @xref{Defining}, for a complete explanation of
@code{define}.

The first command in this example runs Yacc on the first dependency (of
whichever rule uses the canned sequence).  The output file from Yacc is
always named @file{y.tab.c}.  The second command moves the output to the
rule's target file name.

To use the canned sequence, substitute the variable into the commands of a
rule.  You can substitute it like any other variable (@pxref{Reference}).
Because variables defined by @code{define} are recursively expanded
variables, all the variable references you wrote inside the @code{define}
are expanded now.  For example:

@example
foo.c : foo.y
        $(run-yacc)
@end example

@noindent
@samp{foo.y} will substituted for the variable @samp{$^} when it occurs in
@code{run-yacc}'s value, and @samp{foo.c} for @samp{$@@}.@refill

This is a realistic example, but this particular one is not needed in
practice because @code{make} has an implicit rule to figure out these
commands based on the file names involved.  @xref{Implicit}.

@node Variables, Conditionals, Commands, Top
@chapter How to Use Variables
@cindex variable
@cindex value
@cindex recursive variable expansion
@cindex simple variable expansion

A @dfn{variable} is a name defined within @code{make} to represent a string
of text, called the variable's @dfn{value}.  These values can be
substituted by explicit request into targets, dependencies, commands and
other parts of the makefile.

Variables can represent lists of file names, options to pass to compilers,
programs to run, directories to look in for source files, directories to
write output in, or anything else you can imagine.

A variable name may be any sequence characters not containing @samp{:},
@samp{#}, @samp{=}, tab characters or leading or trailing spaces.  However,
variable names containing characters other than letters, numbers and
underscores should be avoided, as they may be given special meanings in
the future.

It is traditional to use upper case letters in variable names, but we
recommend using lower case letters for variable names that serve internal
purposes in the makefile, and reserving upper case for parameters that
control implicit rules or for parameters that the user should override with
command options (@pxref{Overriding}).

@menu
* Reference::	How to use the value of a variable.
* Values::      All the ways variables get their values.
* Flavors::	Variables come in two flavors.
* Setting::	How to set a variable in the makefile.
* Override Directive:: Setting a variable in the makefile
		 even if the user has set it with a command argument.
* Defining::    An alternate way to set a variable to a verbatim string.
* Environment:: Variable values can come from the environment.
@end menu

@node Reference, Values, Variables, Variables
@section Reference to Variables
@cindex reference to variables
@cindex $

To substitute a variable's value, write a dollar sign followed by the name
of the variable in parentheses or braces: either @samp{$(foo)} or
@samp{$@{foo@}} is a valid reference to the variable @code{foo}.  This
special significance of @samp{$} is why you must write @samp{$$} to have
the effect of a single dollar sign in a file name or command.

Variable references can be used in any context: targets, dependencies,
commands, most directives, and new variable values.  Here is a common kind
of example, where a variable holds the names of all the object files in a
program:

@example
objects = program.o foo.o utils.o
program : $(objects)
        cc -o program $(objects)

$(objects) : defs.h
@end example

Variable references work by strict textual substitution.  Thus, the rule

@example
foo = c
prog.o : prog.c
        $(foo)$(foo) prog.c
@end example

@noindent
could be used to compile a C program @file{prog.c}.  (Since spaces around
the variable value are ignored in variable assignments, the value of
@code{foo} is precisely @samp{c}.)

A dollar sign followed by a character other than a dollar sign,
open-parenthesis or open-brace treats that single character as the variable
name.  Thus, you could reference the variable @code{x} with @samp{$x}.
However, this practice is strongly discouraged, except with the automatic
variables (@pxref{Automatic}).

@subsection Modified References
@cindex modified variable reference
@cindex substitution variable reference
@cindex conditional variable reference

In addition to simple references, variables can be referenced in manners
which modify the value of the reference but do not modify the value of
the variable referenced.  There are two categories of modified references:
@dfn{substitution references} and @dfn{conditional references}.@refill

A @dfn{substitution reference} is really a simplified form of the
@code{patsubst} expansion function (@pxref{Functions}).  It has the form
@code{$(var:a=b)} (or @code{$@{var:a=b@}}) and is equivalent to
@code{$(patsubst %a,%b,$(var))}.  This means that it replaces every
@samp{a} at the end of a whitespace-separated word with a @samp{b}.
For example:@refill

@example
foo := a.o b.o c.o
bar := $(foo:.o=.c)
@end example

@noindent
sets @samp{bar} to @samp{a.c b.c c.c}.  @xref{Setting}.

@dfn{Conditional references} are references whose value depends on
whether or not some variable is set.  They are inspired by the similar
construct in the shell @code{sh}.  The syntax of conditional references is:

@table @code
@item $(@var{a}:-@var{b})
This expands to the value of the variable @var{a} if it is defined or to
@samp{@var{b}} (a literal string) if it is not.

@item $(@var{a}:+@var{b})
This expands to @samp{@var{b}} if the variable @var{a} is
defined or to nothing (no characters) if it is not.

@item $(@var{a}:@var{b}-@var{c})
This expands to @samp{@var{b}} if the variable @var{a} is defined or to
@samp{@var{c}} (a literal string) if it is not.
@end table

For the purpose of these conditional references, a variable is ``defined''
if it exists and is non-null.

In the first two alternatives, the @samp{:} may be omitted.  Then the
variable @var{a} is considered ``defined'' if it has been assigned any
value, even a null value.

Note that a variable value consisting solely of whitespace is @emph{not}
null.

@node Values, Flavors, Reference, Variables
@section How Variables Get Their Values

Variables can get values in several different ways:

@itemize @bullet
@item
You can specify an overriding value when you run @code{make}.
@xref{Overriding}.

@item
You can specify a value in the makefile, either with an assignment
(@pxref{Setting}) or with a verbatim definition (@pxref{Defining}).

@item
Values are inherited from the environment.  @xref{Environment}.

@item
Several @dfn{automatic} variables are given new values for each rule.
@xref{Automatic}.

@item
Several variables have constant initial values.  @xref{Implicit
Variables}.
@end itemize

@node Flavors, Setting, Values, Variables
@section The Two Flavors of Variables
@cindex flavors (of variables)
@cindex recursive variable expansion

There are two kinds of variables in GNU @code{make}.  They are
distinguished by two things: how they are defined and how they are expanded.

The first flavor of variable is a @dfn{recursively expanded} variable.
Variables of this sort are defined by lines using @samp{=}.
@ifinfo
(@xref{Setting}.)
@end ifinfo
@iftex
(See the next section.)
@end iftex
The value you specify is installed verbatim; if it contains references to
other variables, these references are expanded whenever this variable is
substituted (in the course of expanding some other string).  When this
happens, it is recursive expansion.

For example,

@example
foo = $(bar)
bar = $(ugh)
ugh = Huh?

all:;echo $(foo)
@end example

@noindent
will echo @samp{Huh?}: @code{$(foo)} expands to @code{$(bar)} which
expands to @code{$(ugh)} which finally expands to @samp{Huh?}.@refill

This flavor of variable is the only sort supported by other versions of
@code{make}.  It has its advantages and its disadvantages.  An advantage
(most would say) is that

@example
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
@end example

@noindent
will do what was intended: when @samp{CFLAGS} is expanded in a command,
it will expand to @samp{-Ifoo -Ibar}.  A major disadvantage is that you
can't append something on the end of a variable, as in

@example
CFLAGS = $(CFLAGS) -O
@end example

@noindent
because it will cause an infinite loop in the variable expansion.  (Actually
@code{make} detects the infinite loop and reports an error.)

Another disadvantage is that any functions (@pxref{Functions}) referenced
in the definition will be executed every time the variable is expanded.
This makes @code{make} run slower; worse, it causes the @code{wildcard}
function to give unpredictable results.

To avoid all the problems and inconveniences of recursively expanded
variables, there is another flavor: @dfn{simply expanded} variables.
Simply expanded variables are defined by lines using @samp{:=}.
@ifinfo
(@xref{Setting}.)
@end ifinfo
@iftex
(See the next section.)
@end iftex
The value of a simply expanded variable is scanned once and for all,
expanding any references to other variables and functions, when the
variable is defined.  The actual value of the simply expanded variable is
the result of expanding the value you write.  It does not contain any
references to other variables; it contains their values @emph{as of the
time this variable was defined}.  Therefore,

@example
x := foo
y := $(x) bar
x := later
@end example

@noindent
is equivalent to

@example
y := foo bar
x := later
@end example

When a simply expanded variable is referenced, its value is substituted
verbatim.

Simply expanded variables generally make complicated makefile programming
more predictable.  This way you can redefine a variable using its own value
(or its value processed in some way by one of the expansion functions;
@pxref{Functions}) and use the expansion functions much more efficiently.

You can also use them to introduce controlled leading or trailing spaces
into variable values.  Such spaces are discarded from your input before
substitution of variable references and function calls; this means you can
include leading or trailing spaces in a variable value by protecting them
with variable references, like this:

@example
nullstring :=
space := $(nullstring) $(nullstring)
@end example

@noindent
Here the value of the variable @code{space} is precisely one space.

@node Setting, Override Directive, Flavors, Variables
@section Setting Variables
@cindex setting variables
@cindex =
@cindex :=

To set a variable from the makefile, write a line starting with the
variable name followed by @samp{=} or @samp{:=}.  Whatever follows the
@samp{=} or @samp{:=} on the line becomes the value.  For example,

@example
objects = main.o foo.o bar.o utils.o
@end example

@noindent
defines a variable named @code{objects}.  Spaces around the variable name
are ignored, and so are spaces after the @samp{=} or at the end of the
line.

Variables defined with @samp{=} are @dfn{recursively expanded} variables.
Variables defined with @samp{:=} are @dfn{simply expanded} variables; these
definitions can contain variable references which will be expanded before
the definition is made.  @xref{Flavors}. 

There is no limit on the length of the value of a variable except the
amount of swapping space on the computer.  When a variable definition is
long, it is a good idea to break it into several lines by inserting
backslash-newline at convenient places in the definition.  This will not
affect the functioning of @code{make}, but it will make the makefile easier
to read.

Most variable names are considered to have the empty string as a value if
you have never set them.  Several variables have built-in initial values
that are not empty, but can be set by you in the usual ways
(@pxref{Implicit Variables}).  Several special variables are set
automatically to a new value for each rule; these are called the
@dfn{automatic} variables (@pxref{Automatic}).

@node Override Directive, Defining, Setting, Variables
@section The @code{override} Directive
@findex override

If a variable has been set with a command argument (@pxref{Overriding}),
then ordinary assignments in the makefile are ignored.  If you want to set
the variable in the makefile even though it was set with a command
argument, you can use an @code{override} directive, which is a line that
looks like this:

@example
override @var{variable} = @var{value}
@end example

or

@example
override @var{variable} := @var{value}
@end example

The @code{override} directive was not invented for escalation in the war
between makefiles and command arguments.  It was invented so you can alter
and add to values that the user specifies with command arguments.

For example, suppose you always want the @samp{-g} switch when you run the
C compiler, but you would like to allow the user to specify the other
switches with a command argument just as usual.  You could use this
@code{override} directive:

@example
override CFLAGS := $(CFLAGS) -g
@end example

@node Defining, Environment, Override Directive, Variables
@section Defining Variables Verbatim
@findex define
@findex endef

Another way to set the value of a variable is to use the @code{define}
directive.  This directive has a different syntax which allows newline
characters to be included in the value, which is convenient for defining
canned sequences of commands (@pxref{Sequences}).

The @code{define} directive is followed on the same line the name of the
variable and nothing more.  The value to give the variable appears on the
following lines.  The end of the value is marked by a line containing just
the word @code{endef}.  Aside from this difference in syntax, @code{define}
works just like @code{=}; it creates a recursively-expanded variable
(@pxref{Flavors}).

@example
define two-lines
echo foo
echo $(bar)
endef
@end example

The value in an ordinary assignment cannot contain a newline; but the
newlines that separate the lines of the value in a @code{define} become
part of the variable's value (except for the final newline which precedes
the @code{endef} and is not considered part of the value).@refill

Thus the previous example is functionally equivalent to:

@example
two-lines = echo foo; echo $(bar)
@end example

@noindent
since the shell will interpret the semicolon and the newline identically.

@node Environment,, Defining, Variables
@section Variables from the Environment

@cindex environment
Variables in @code{make} can come from the environment with which
@code{make} is run.  Every environment variable that @code{make} sees when
it starts up is transformed into a @code{make} variable with the same name
and value.  But an explicit assignment in the makefile, or with a command
argument, overrides the environment.  (If the @samp{-e} flag is specified,
then values from the environment override assignments in the makefile.
@xref{Options}.)

By setting the variable @code{CFLAGS} in your environment, you can cause
all C compilations in most makefiles to use the compiler switches you
prefer.  This is safe for variables with standard or conventional meanings
because you know that no makefile will use them for other things.  (But
this is not totally reliable; some makefiles set @code{CFLAGS} explicitly
and therefore are not affected by the value in the environment.)

When @code{make} is invoked recursively, variables defined in the outer
invocation are automatically passed to inner invocations through the
environment (@pxref{Recursion}).  This is the main purpose of turning
environment variables into @code{make} variables, and it requires no
attention from you.

Other use of variables from the environment is not recommended.  It is not
wise for makefiles to depend for their functioning on environment variables
set up outside their control, since this would cause different users to get
different results from the same makefile.  This is against the whole
purpose of most makefiles.

Such problems would be especially likely with the variable @code{SHELL},
which is normally present in the environment to specify the user's choice
of interactive shell.  It would be very undesirable for this choice to
affect @code{make}.  So @code{make} ignores the environment value of
@code{SHELL} (and @code{SHFLAGS}) if the value of @code{MAKELEVEL} is zero
(which is normally true except in recursive invocations of
@code{make}).@refill

@node Conditionals, Functions, Variables, Top
@chapter Conditional Parts of Makefiles

@cindex conditionals
A @dfn{conditional} causes part of a makefile to be obeyed or ignored
depending on the values of variables.  Conditionals can compare the value
of one variable with another, or the value of a variable with a constant
string.  Conditionals control what @code{make} actually ``sees'' in the
makefile, so they @emph{cannot} be used to control shell commands at the
time of execution.@refill

@menu
* Example: Conditional Example.   An annotated example.
* Syntax: Conditional Syntax.     Precise rules for syntax of conditionals.
* Flags: Testing Flags.           Conditionals testing flags such as @samp{-t}.
@end menu

@node Conditional Example, Conditional Syntax, Conditionals, Conditionals
@section Example of a Conditional

This conditional tells @code{make} to use one set of libraries if the
@code{CC} variable is @samp{gcc}, and a different set of libraries
otherwise.  It works by controlling which of two command lines will be used
as the command for a rule.  The result is that @samp{CC=gcc} as an argument
to @code{make} not only changes which compiler is used but also which
libraries are linked.

@example
libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif
@end example

@noindent
This conditional uses three directives: one @code{ifeq}, one @code{else}
and one @code{endif}.

The @code{ifeq} directive contains two arguments, separated by a comma and
surrounded by parentheses.  Variable substitution is performed on both
arguments and then they are compared.  The lines of the makefile following
the @code{ifeq} are obeyed if the two arguments match; otherwise they are
ignored.

The @code{else} directive causes the following lines to be obeyed if the
previous conditional failed.  In the example above, this means that the
second alternative linking command is used whenever the first alternative
is not used.  It is optional to have an @code{else} in a conditional.

The @code{endif} directive ends the conditional.  Every conditional must
end with an @code{endif}.  Unconditional makefile text follows.

When the variable @code{CC} has the value @samp{gcc}, the above example has
this effect:

@example
foo: $(objects)
        $(CC) -o foo $(objects) $(libs_for_gcc)
@end example

@noindent
When the variable @code{CC} has any other value, this effect is this:

@example
foo: $(objects)
        $(CC) -o foo $(objects) $(normal_libs)
@end example

Equivalent results can be obtained in another way by conditionalizing a
variable assignment and then using the variable unconditionally:

@example
libs_for_gcc = -lgnu
normal_libs =

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

foo: $(objects)
        $(CC) -o foo $(objects) $(libs)
@end example

@node Conditional Syntax, Testing Flags, Conditional Example, Conditionals
@section Syntax of Conditionals
@findex ifdef
@findex ifeq
@findex else
@findex endif

The syntax of a simple conditional with no @code{else} is as follows:

@example
@var{conditional-directive}
@var{text-if-true}
endif
@end example

@noindent
The @var{text-if-true} may be any lines of text, to be considered as part
of the makefile if the condition is true.  If the condition is false, no
text is used instead.

The syntax of a complex conditional is as follows:

@example
@var{conditional-directive}
@var{text-if-true}
else
@var{text-if-false}
endif
@end example

@noindent
If the condition is true, @var{text-if-true} is used; otherwise,
@var{text-if-false} is used instead.  The @var{text-if-false} can be any
number of lines of text.

Conditionals work at the textual level.  The lines of the
@var{text-if-true} are read as part of the makefile if the condition is
true; if the condition is false, those lines are ignored completely.  It
follows that syntactic units of the makefile, such as rules, may safely be
split across the beginning or the end of the conditional.@refill

You may use an @code{include} directive within a conditional, but you may
not start a conditional in one file and end it in another.

The syntax of the @var{conditional-directive} is the same whether the
conditional is simple or complex.  There are four different directives that
test different conditions.  Here is a table of them:

@table @code
@item ifeq (@var{arg1}, @var{arg2})
Expand all variable references in @var{arg1} and @var{arg2} and
compare them.  If they are identical, the @var{text-if-true} is
effective; otherwise, the @var{text-if-false}, if any, is effective.

@item ifneq (@var{arg1}, @var{arg2})
Expand all variable references in @var{arg1} and @var{arg2} and
compare them.  If they are different, the @var{text-if-true} is
effective; otherwise, the @var{text-if-false}, if any, is effective.

@item ifdef @var{variable-name}
If the variable @var{variable-name} has a non-empty value, the
@var{text-if-true} is effective; otherwise, the @var{text-if-false},
if any, is effective.  Variables that have never been defined have an
empty value.

@item ifndef @var{variable-name}
If the variable @var{variable-name} has an empty value, the
@var{text-if-true} is effective; otherwise, the @var{text-if-false},
if any, is effective.
@end table

Extra spaces are allowed and ignored at the beginning of the conditional
directive line, but a tab is not allowed.  (If the line begins with a tab,
it will be considered a command for a rule.)  Aside from this, extra spaces
or tabs may be inserted with no effect anywhere except within the directive
name or within an argument.  A comment starting with @samp{#} may appear at
the end of the line.

The other two directives that play a part in a conditional are @code{else}
and @code{endif}.  Each of these directives is written as one word, with no
arguments.  Extra spaces are allowed and ignored at the beginning of the
line, and spaces or tabs at the end.  A comment starting with @samp{#} may
appear at the end of the line.

@node Testing Flags,, Conditional Syntax, Conditionals
@section Conditionals that Test Flags

You can write a conditional that tests @code{make} command flags such as
@samp{-t} by using the variable @code{MAKEFLAGS} together with the
@code{findstring} function.  This is useful when @code{touch} is not
enough to make a file appear up to date.

The @code{findstring} function determines whether one string appears as a
substring of another.  If you want to test for the @samp{-t} flag,
use @samp{t} as the first string and the value of @code{MAKEFLAGS} as
the other.

For example, here is how to arrange to use @samp{ranlib -t} to finish
marking an archive file up to date:

@example
archive.a: @dots{}
ifneq (,$(findstring t,$(MAKEFLAGS)))
        @@echo $(MAKE) > /dev/null
        touch archive.a
	ranlib -t archive.a
else
        ranlib archive.a
endif
@end example

@noindent
The @code{echo} command does nothing when executed; but its presence, with
a reference to the variable @code{MAKE}, marks the rule as ``recursive'' so
that its commands will be executed despite use of the @samp{-t} flag.

@node Functions, Running, Conditionals, Top
@chapter Functions for Transforming Text
@cindex function

@dfn{Functions} allow you to do text processing in the makefile to
compute the files to operate on or the commands to use.

@menu
* Syntax: Function Syntax.  Syntax of function calls in general.
* Text Functions::          Text manipulation functions.
* Filename Functions::      Functions for manipulating file names.
@end menu

@node Function Syntax, Text Functions, Functions, Functions
@section Function Call Syntax
@cindex $

A function call resembles a variable reference.  It looks like this:

@example
$(@var{function} @var{arguments})
@end example

@noindent
or like this:

@example
$@{@var{function} @var{arguments}@}
@end example

Here @var{function} is a function name; one of a short list of names that
are part of @code{make}.  There is no provision for defining new functions.

The @var{arguments} are the arguments of the function.  They are separated
from the function name by one or more spaces and/or tabs, and if there are
more than one argument they are separated by commas.  Such whitespace and
commas are not part of any argument's value.  Parentheses or braces,
whichever you use to surround the function call, can appear in an argument
only in matching pairs; the ones that were not used to surround the
function call can appear freely.  If the arguments contain other function
calls or variable references, it is wisest to surround them with the same
delimiters used for the containing function call.

The text written for each argument is processed by substitution of
variables and function calls in order to produce the argument value, which
is the text on which the function acts.

Commas and unmatched parentheses or braces cannot appear in the text of an
argument as written; leading spaces cannot appear in the text of the first
argument as written.  These characters can be put into the argument value
by variable substitution.  First define variables @code{comma} and
@code{space} whose values are isolated comma and space characters, then
substitute those variables where such characters are wanted, like this:

@example
comma:= ,
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# @r{bar is now `a,b,c'.}
@end example

@noindent
Here the @code{subst} function replaces each space with a comma, through
the value of @code{foo}, and substitutes the result.

@node Text Functions, Filename Functions, Function Syntax, Functions
@section Functions for String Substitution and Analysis

Here are some functions that operate on substrings of a string:
@code{subst}, @code{patsubst}, @code{strip}, @code{findstring},
@code{filter} and @code{filter-out}.

@table @code
@item $(subst @var{from},@var{to},@var{text})
@findex subst
Performs a textual replacement on the text @var{text}: each occurrence
of @var{from} is replaced by @var{to}.  The result is substituted for
the function call.  For example,

@example
$(subst ee,EE,feet on the street)
@end example

substitutes the string @samp{fEEt on the strEEt}.

@item $(patsubst @var{pattern},@var{replacement},@var{text})
@findex patsubst
Finds whitespace-separated words in @var{text} that match
@var{pattern} and replaces them with @var{replacement}.  Here
@var{pattern} may contain a @samp{%} which acts as a wildcard,
matching any number of any characters within a word.  If
@var{replacement} also contains a @samp{%}, the @samp{%} is replaced
by the text that matched the @samp{%} in @var{pattern}.

Whitespace between words is folded into single space characters;
leading and trailing whitespace is discarded.

@item $(strip @var{string})
@findex strip
Removes leading and trailing whitespace from @var{string} and replaces
each internal sequence of one or more whitespace characters with a
single space.

@item $(findstring @var{find},@var{in})
@findex findstring
Searches @var{in} for an occurrence of @var{find}.  If it occurs, the
value is @var{find}; otherwise, the value is empty.  You can use this
function in a conditional to test for the presence of a specific
substring in a given string.  @xref{Testing Flags}, for a practical
application of @code{findstring}.

@item $(filter @var{pattern},@var{text})
@findex filter
Removes all whitespace-separated words in @var{text} that do @emph{not}
match @var{pattern}, returning only matching words.  The pattern is one
using @samp{%} as used in the @code{patsubst} function.  This can be used
to separate out different types of strings (such as filenames) in a variable.
For example:@refill

@example
sources := foo.c bar.c ugh.h
foo: $(sources)
	cc $(filter %.c,$(sources)) -o foo
@end example

@noindent
says that @file{foo} depends of @file{foo.c}, @file{bar.c} and
@file{ugh.h} but only @file{foo.c} and @file{bar.c} should be specified
in the command to the compiler.@refill

@item $(filter-out @var{pattern},@var{text})
@findex filter-out
Removes all whitespace-separated words in @var{text} that @emph{do}
match @var{pattern}, returning only matching words.  This is the exact
opposite of the @code{filter} function.@refill
@end table

Here is a realistic example of use of @code{subst}.  Suppose that a
makefile uses the @code{VPATH} variable to specify a list of directories
that @code{make} should search for dependency files.  This example shows
how to tell the C compiler to search for header files in the same list of
directories.

The value of @code{VPATH} is a list of directories separated by colons,
such as @samp{src:../headers}.  First, the @code{subst} function is used to
change the colons to spaces:

@example
$(subst :, ,$(VPATH))
@end example

@noindent
This produces @samp{src ../headers}.  Then another function,
@code{addprefix}, can turn each directory name into an @samp{-I} flag.
These can be added to the value of the variable @code{CFLAGS}, which is
passed automatically to the C compiler, like this:

@example
CFLAGS:= $(CFLAGS) $(addprefix -I,$(subst :, ,$(VPATH)))
@end example

@noindent
The effect is to append the text @samp{-Isrc -I../headers} to the
previously given value of @code{CFLAGS}.

The function @code{strip} can be very useful when used in conjunction
with conditionals.  When comparing something with the null string
@samp{""} using @code{ifeq} or @code{ifneq}, you usually want a string
of just whitespace to match the null string.  Thus,

@example
.PHONY: all
ifneq	"$(needs_made)" ""
all: $(needs_made)
else
all:;@@echo 'Nothing to make!'
endif
@end example

@noindent
might fail to have the desired results.  Replacing
@samp{"$(needs_made)"} with @samp{"$(strip $(needs_made))"} in the
@code{ifneq} directive would make it more reliable.@refill

@node Filename Functions,, Text Functions, Functions
@section Functions for File Names

Several of the built-in expansion functions relate specifically to
taking apart file names or lists of file names.

Each of these functions performs a specific transformation on a file name.
The argument of the function is regarded as a series of file names,
separated by whitespace.  (Leading and trailing whitespace is ignored.)
Each file name in the series is transformed in the same way and the results
are concatenated with single spaces between them.

@table @code
@item $(dir @var{names})
@findex dir
Extracts the directory-part of each file name in @var{names}.  The
directory-part of the file name is everything up through (and
including) the last slash in it.  If the file name contains no slash,
the directory part is the string @samp{./}.  For example,

@example
$(dir src/foo.c hacks)
@end example

@noindent
produces the result @samp{src/ ./}.

@item $(notdir @var{names})
@findex notdir
Extracts all but the directory-part of each file name in @var{names}.
If the file name contains no slash, it is left unchanged.  Otherwise,
everything through the last slash is removed from it.  A file name
that ends with a slash becomes an empty string.  This is unfortunate,
because it means that the result does not always have the same number
of whitespace-separated file names as the argument had; but we do not
see any other valid alternative.

For example,

@example
$(notdir src/foo.c hacks)
@end example

@noindent
produces the result @samp{foo.c hacks}.

@item $(suffix @var{names})
@findex suffix
Extracts the suffix of each file name in @var{names}.  If the file name
contains a period, the suffix is everything starting with the last
period.  Otherwise, the suffix is the empty string.  This frequently
means that the result will be empty when @var{names} is not, and if
@var{names} contains multiple file names, the result may contain fewer
file names.

For example,

@example
$(suffix src/foo.c hacks)
@end example

@noindent
produces the result @samp{.c}.

@item $(basename @var{names})
@findex basename
Extracts all but the suffix of each file name in @var{names}.  If the
file name contains a period, the basename is everything starting up to
(and not including) the last period.  Otherwise, the basename is the
entire file name.  For example,

@example
$(basename src/foo.c hacks)
@end example

@noindent
produces the result @samp{src/foo hacks}.

@item $(addsuffix @var{suffix},@var{names})
@findex addsuffix
The argument @var{names} is regarded as a series of names, separated
by whitespace; @var{suffix} is used as a unit.  The value of
@var{suffix} is appended to the end of each individual name and the
resulting larger names are concatenated with single spaces between
them.  For example,

@example
$(addsuffix .c,foo bar)
@end example

@noindent
produces the result @samp{foo.c bar.c}.

@item $(addprefix @var{prefix},@var{names})
@findex addprefix
The argument @var{names} is regarded as a series of names, separated
by whitespace; @var{prefix} is used as a unit.  The value of
@var{prefix} is appended to the front of each individual name and the
resulting larger names are concatenated with single spaces between
them.  For example,

@example
$(addprefix src/,foo bar)
@end example

@noindent
produces the result @samp{src/foo src/bar}.

@item $(join @var{list1},@var{list2})
@findex join
Concatenates the two arguments word by word: the two first words (one
from each argument) concatenated form the first word of the result, the
two second words form the second word of the result, and so on.  So the
@var{n}th word of the result comes from the @var{n}th word of each
argument.  If one argument has more words that the other, the extra
words are copied unchanged into the result.

Whitespace between the words in the lists is not preserved; it is
replaced with a single space.

This function can reverse the effect of the @code{dir} and @code{notdir}
functions, after other processing has been done on the separated lists
of directories and files.@refill

@item $(firstword @var{names})
@findex firstword
The argument @var{names} is regarded as a series of names, separated
by whitespace.  The value is the first name in the series.  The rest
of the names are ignored.  For example,

@example
$(firstword foo bar)
@end example

@noindent
produces the result @samp{foo}.

@item $(wildcard @var{pattern})
@findex wildcard
The argument @var{pattern} is a file name pattern, typically
containing wildcards characters.  The result of @code{wildcard} is a
space-separated list of the names of existing files that match the
pattern.

Wildcard are expanded automatically in rules (@pxref{Wildcards}).  But
it does not normally take place when a variable is set, or inside the
arguments of other functions.  Those occasions are when the
@code{wildcard} function is useful.
@end table

@node Running, Implicit, Functions, Top
@chapter How to Run @code{make}

A makefile that says how to recompile a program can be used in more than
one way.  The simplest use is to recompile every file that is out of date.
This is what @code{make} will do if run with no arguments.

But you might want to update only some of the files; you might want to use
a different compiler or different compiler options; you might want just to
find out which files are out of date without changing them.

By specifying arguments when you run @code{make}, you can do any of these
things or many others.

@menu
* Makefile Arguments::    Arguments to specify which makefile to use.

* Goals::                 Goal arguments specify which parts of the makefile
                           should be used.

* Avoid Compilation::     How to avoid recompiling certain files.

* Instead of Execution::  Mode flags specify what kind of thing to do
                           with the commands in the makefile
                           other than simply execute them.

* Overriding::            Overriding a variable can specify an alternate
                           compiler, or alternate flags for the compiler,
                           or whatever else you program into the makefile.

* Testing::               How to proceed past some errors, to test compilation.

* Options::               Summary of all options @code{make} accepts.
@end menu

@node Makefile Arguments, Goals, Running, Running
@section Arguments to Specify the Makefile

The way to specify the name of the makefile is with the @samp{-f} option.
For example, @samp{-f altmake} says to use the file @file{altmake} as
the makefile.

If you use the @samp{-f} flag several times (each time with a
following argument), all the specified files are used jointly as
makefiles.

If you do not use the @samp{-f} flag, the default is to use
@file{./makefile}, or, if that does not exist, @file{./Makefile}.
@xref{Makefiles}.@refill

@node Goals, Avoid Compilation, Makefile Arguments, Running
@section Goals
@cindex goal

The @dfn{goals} are the targets that @code{make} should strive ultimately
to update.  Other targets are updated as well if they appear as
dependencies of goals, or dependencies of dependencies of goals, etc.

By default, the goal is the first target in the makefile (not counting
targets that start with a period or that appear in included makefiles).
Therefore, makefiles are usually written so that the first target is for
compiling the entire program or programs they describe.

You can specify a different goal or goal with arguments to @code{make}.
Use the name of the goal as an argument.  If you specify several goals,
@code{make} processes each of them in turn, in the order you name them.

Any target in the makefile may be specified as a goal (unless it starts
with @samp{-} or contains an @samp{=}).  Even targets not in the makefile
may be specified, if @code{make} can find implicit rules that say how to
make them.

One use of specifying a goal is if you want to compile only a part of
the program, or only one of several programs.  Specify as a goal each
file that you wish to remake.  For example, consider a directory containing
a several programs, with a makefile that starts like this:

@example
all: size nm ld ar as
@end example

If you are working on the program @code{size}, you might want to say
@samp{make size} so that only the files of that program are recompiled.

Another use of specifying a goal is to make files that aren't normally
made.  For example, there may be a file of debugging output, or a version
of the program that is compiled specially for testing, which has a rule
in the makefile but isn't a dependency of the default goal.

Another use of specifying a goal is to run the commands associated with a
phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty Targets}).
Many makefiles contain a phony target named @file{clean} which deletes
everything except source files.  Naturally, this is done only if you
request it explicitly with @samp{make clean}.  Here is a list of typical
phony and empty target names:

@table @file
@item clean
Delete all files that the makefile could remake.

@item install
Copy the executable file into a directory that users typically search for
commands.

@item print
Print listings of the source files that have changed.

@item tar
Create a tar file of the source files.
@end table

@node Avoid Compilation, Instead of Execution, Goals, Running
@section Avoiding Recompilation of Some Files

Sometimes you may have changed a source file but you don't want to
recompile all the files that depend on it.  For example, suppose you add a
macro or a declaration to a header file that many other files depend on.
Being conservative, @code{make} assumes that any change in the header file
requires recompilation of all dependent files, but you know that they don't
need to be recompiled and you would rather not waste the time waiting.

If you anticipate the problem before making the change, you can use the
@samp{-t} flag.  This flag tells @code{make} not to run the commands in the
rules, but rather to mark the target up-to-date by changing its
last-modification date.  You would follow this procedure:

@enumerate
@item
Use the command @samp{make} to recompile the source files that really
need recompilation.

@item
Make the changes in the header files.

@item
Use the command @samp{make -t} to mark all the object files as
up-to-date.  The next time you run @code{make}, the changes in the
header files will not cause any recompilation.
@end enumerate

If you have already changed the header file at a time when some files do
need recompilation, it is too late to do this.  Instead, you can use the
@samp{-o @var{file}} flag, which marks a specified file as ``old''
(@pxref{Options}).  This means that the file itself won't be remade,
and nothing else will be remade on its account.  Follow this procedure:

@enumerate
@item
Recompile the source files that need compilation for reasons independent
of the particular header file, with @samp{make -o @var{headerfile}}.
If several header files are involved, use a separate @samp{-o} option
for each header file.

@item
Touch all the object files with @samp{make -t}.
@end enumerate

@node Instead of Execution, Overriding, Avoid Compilation, Running
@section Instead of Executing the Commands
@cindex -t
@cindex touch
@cindex -q
@cindex -n

The makefile tells @code{make} how to tell whether a target is up to date,
and how to update each target.  But updating the targets is not always
what you want.  Certain options specify other activities for @code{make}.

@table @samp
@item -t
``Touch''.  The activity is to mark the targets as up to date without
actually changing them.  In other words, @code{make} pretends to compile
the targets but does not really change their contents.

@item -n
``No-op''.  The activity is to print what commands would be used to make
the targets up to date, but not actually execute them.

@item -q
``Question''.  The activity is to find out silently whether the targets
are up to date already; but execute no commands in either case.  In other
words, neither compilation nor output will occur.
@end table

With the @samp{-n} flag, @code{make} prints without execution the commands
that it would normally execute.

With the @samp{-t} flag, @code{make} ignores the commands in the rules
and uses (in effect) the command @code{touch} for each target that needs to
be remade.  The @code{touch} command is also printed, unless @samp{-s} or
@code{.SILENT} is used.  For speed, @code{make} does not actually invoke
the program @code{touch}.  It does the work directly.

With the @samp{-q} flag, @code{make} prints nothing and executes no
commands, but the exit status code it returns is zero if and only if the
targets to be considered are already up to date.

It is an error to use more than one of these three flags in the same
invocation of @code{make}.

If you are not at all interested in what @code{make} @emph{would} do,
but rather in some other information about @code{make}, there are two
options: the command line @samp{make -p -f /dev/null} will print the
information in @code{make}'s database of variables, rules, directories
and files and @samp{make -v -f /dev/null} will print information about
what version of GNU @code{make} you are using.  @xref{Options}.@refill

@node Overriding, Testing, Instead of Execution, Running
@section Overriding Variables

You can override the value of a variable using an argument to @code{make}
that contains a @samp{=}.  The argument @samp{@var{v}=@var{x}} (or
@samp{@var{v}:=@var{x}}; @pxref{Flavors}) sets the value of the variable
@var{v} to @var{x}.

Values specified this way override all values specified in the makefile
itself; once you have set a variable with a command argument, any ordinary
attempt in the makefile to change that variable is simply ignored.

One way to use this facility is to pass extra flags to compilers.
For example, in a properly written makefile, the variable @code{CFLAGS}
is included in each command that runs the C compiler, so a file
@file{foo.c} would be compiled like this:

@example
cc -c $(CFLAGS) foo.c
@end example

Thus, whatever value you set for @code{CFLAGS} affects each compilation
that occurs.  The makefile probably specifies the usual value for
@code{CFLAGS}, like this:

@example
CFLAGS=-g
@end example

Each time you run @code{make}, you can override this value and specify a
different value.  For example, if you say @samp{make CFLAGS='-g -O'}, each
C compilation will be done with @samp{cc -c -g -O}.  (This illustrates how
you can enclose spaces and other special characters in the value of a
variable when you override it.)

The variable @code{CFLAGS} is only one of many standard variables that
exist just so that you can change them this way.  @xref{Implicit
Variables}, for a complete list.

You can also program the makefile to look at additional variables of your
own, giving the user ability to control other aspects of how the makefile
works by changing the variables.

There is one way that the makefile can change a variable that you have
overridden.  This is to use the @code{override} directive, which is a line
that looks like this:

@example
override @var{variable} = @var{value}
@end example

or

@example
override @var{variable} := @var{value}
@end example

@noindent
This line acts like an ordinary variable assignment except that it is
not ignored even if you have used a command option to set the variable.
@xref{Override Directive}.

@node Testing, Options, Overriding, Running
@section Testing the Compilation of a Program

Normally, when an error happens in executing a shell command, @code{make}
gives up immediately, returning a nonzero status.  No further commands are
executed for any target.  The error implies that the goal cannot be
correctly remade, so @code{make} reports this as soon as it knows.

When you are compiling a program that you have just changed, this is not
what you want.  Instead, you would rather that @code{make} try compiling
every file that can be tried, to show you all the compilation errors.

@cindex -k
Then you should use the @samp{-k} flag.  If the @samp{-k} flag is
specified, @code{make} continues to consider the other dependencies of the
pending targets, remaking them if necessary, before it gives up and returns
nonzero status.  For example, after an error in compiling one object file,
@samp{make -k} will continue compiling other object files even though it
already knows that linking them will be impossible.  @xref{Options}.

The usual behavior of @code{make} assumes that your purpose is to get the
goals up to date; once @code{make} learns that this is impossible, it might
as well report the failure immediately.  The @samp{-k} flag says that the
real purpose is to test as much as possible of the changes made in the
program, perhaps to find several independent problems so that you can
correct them all before the next attempt to compile.  This is why Emacs's
@code{compile} command passes the @samp{-k} flag by default.

@node Options,, Testing, Running
@section Summary of Options
@cindex options
@cindex flags

Here is a table of all the options @code{make} understands:

@table @samp
@item -b
This option is ignored for compatibility with other versions of
@code{make}.

@item -c @var{dir}
Change to directory @var{dir} before executing the rules.  If multiple
@samp{-c} options are specified, each is interpreted relative to the
previous one: @samp{-c / -c etc} is equivalent to @samp{-c /etc}.
This is typically used with recursive invocations of @code{make}
(@pxref{Recursion}).

@item -d
Print debugging information in addition to normal processing.  The
debugging information says which files are being considered for
remaking, which file-times are being compared and with what results,
which files actually need to be remade, which implicit rules are
considered and which are applied---everything interesting about how
@code{make} decides what to do.

@item -f @var{file}
Use file @var{file} as a makefile.  @xref{Makefiles}.

@item -i
Ignore all errors in commands executed to remake files.
@xref{Errors}.

@item -I @var{dir}
Specifies a directory @var{dir} to search for included makefiles.
@xref{Include}.  If several @samp{-I} options are used to specify
several directories, the directories are searched in the order
specified.

@item -k
Continue as much as possible after an error.  While the target that
failed, and those that depend on it, cannot be remade, the other
dependencies of these targets can be processed all the same.
@xref{Testing}.

@item -n
Print the commands that would be executed, but do not execute them.
@xref{Instead of Execution}.

@item -o @var{file}
Do not remake the file @var{file} even if it is older than its
dependencies, and do not remake anything on account of changes in
@var{file}.  Essentially the file is treated as very old and its rules
are ignored.  @xref{Avoid Compilation}.

@item -p
Print the data base (rules and variable values) that results from
reading the makefiles; then execute as usual or as otherwise
specified.  This also prints the version information given by
the @samp{-v} switch (see below).  To print the data base without
trying to remake any files, use @samp{make -p -f /dev/null}.

@item -q
``Question mode''.  Do not run any commands, or print anything; just
return an exit status that is zero if the specified targets are
already up to date, nonzero otherwise.  @xref{Instead of Execution}.

@item -r
Eliminate use of the built-in implicit rules (@pxref{Implicit}).
Also clear out the default list of suffixes for suffix rules
(@pxref{Suffix Rules}).

@item -s
Silent operation; do not print the commands as they are executed.
@xref{Echoing}.

@item -S
Cancel the effect of the @samp{-k} option.  This is never necessary
except in a recursive @code{make} where @samp{-k} might be inherited
from the top-level @code{make} via @code{MAKEFLAGS} (@pxref{Recursion})
or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill

@item -t
Touch files (mark them up to date without really changing them)
instead of running their commands.  This is used to pretend (to fool
future invocations of @code{make}) that the commands were done.
@xref{Instead of Execution}.

@item -v
Print the version of the @code{make} program plus a copyright,
list of authors and notice of (non)warranty (short).
After this information is printed, processing continues normally.
To get the version information without doing anything else,
use @samp{make -v -f /dev/null}.

@item -w
Print a message containing the working directory both before and after
executing the makefile; this is useful for tracking down errors from
builds of large directory trees.  @xref{Recursion}.
@end table

@node Implicit, Archives, Running, Top
@chapter Using Implicit Rules
@cindex implicit rule

Certain standard ways of remaking target files are used very often.  For
example, one customary way to make an object file is from a C source file
using the C compiler, @code{cc}.

@dfn{Implicit rules} tell @code{make} how to use customary techniques so
that you don't have to specify them in detail when you want to use them.
For example, there is an implicit rule for C compilation.

Implicit rules work based on file names.  For example, C compilation typically
takes a @file{.c} file and makes a @file{.o} file.  So @code{make} applies
the implicit rule when it sees this combination of file-name endings.

A chain of implicit rules can apply in sequence; for example, @code{make}
will remake a @file{.o} file from a @file{.y} file by way of a @file{.c} file.
@iftex
@xref{Chained Rules}.
@end iftex

The built-in implicit rules use several variables in their commands so
that, by changing the values of the variables, you can change the way the
implicit rule works.  For example, the variable @code{CFLAGS} controls the
flags given to the C compiler by the implicit rule for C compilation.
@iftex
@xref{Implicit Variables}.
@end iftex

You can define your own implicit rules by writing @dfn{pattern rules}.
@iftex
@xref{Pattern Rules}.
@end iftex

@menu
* Using Implicit::       How to use an existing implicit rule
                          to get the commands for updating a file.

* Catalogue of Rules::   Catalogue of built-in implicit rules.

* Implicit Variables::   By changing certain variables, you can
                          change what the predefined implicit rules do.

* Chained Rules::        Using a chain of implicit rules.

* Pattern Rules::        Defining new implicit rules.

* Search Algorithm::     Precise algorithm for applying implicit rules.
@end menu

@node Using Implicit, Catalogue of Rules, Implicit, Implicit
@section Using Implicit Rules

To allow @code{make} to find a customary method for updating a target file,
all you have to do is refrain from specifying commands yourself.  Either
write a rule with no command lines, or don't write a rule at all.  Then
@code{make} will figure out which implicit rule to use based on which
kind of source file exists.

For example, suppose the makefile looks like this:

@example
foo : foo.o bar.o
        cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
@end example

@noindent
Because you mention @file{foo.o} but do not give a rule for it, @code{make}
will automatically look for an implicit rule that tells how to update it.
This happens whether or not the file @file{foo.o} currently exists.

If an implicit rule is found, it supplies both commands and a dependency
(the source file).  You would want to write a rule for @file{foo.o} with no
command lines if you need to specify additional dependencies, such as
header files, that the implicit rule cannot supply.

Each implicit rule has a target pattern and dependency patterns.  There may
be many implicit rules with the same target pattern.  For example, numerous
rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler;
another, from a @samp{.p} file with the Pascal compiler; and so on.  The rule
that actually applies is the one whose dependency exists or can be made.

So, if you have a file @file{foo.c}, @code{make} will run the C compiler;
otherwise, if you have a file @file{foo.p}, @code{make} will run the Pascal
compiler; and so on.

Of course, when you write the makefile, you know which implicit rule you
want @code{make} to use, and you know it will choose that one because you
know which other files are supposed to exist.  @xref{Catalogue of Rules},
for a catalogue of all the predefined implicit rules.

Above, we said an implicit rule applies if the required dependency ``exists
or can be made''.  A file ``can be made'' if it is mentioned explicitly in
the makefile as a target or a dependency, or if an implicit rule can be
recursively found for how to make it.  When the implicit dependency is the
result of another implicit rule, we say that @dfn{chaining} is occurring.
@xref{Chained Rules}.

In general, @code{make} searches for an implicit rule for each target, and
for each double-colon rule, that has no commands.  A file that is mentioned
only as a dependency is considered a target whose rule specifies nothing,
so implicit rule search happens for it.  @xref{Search Algorithm}, for the
details of how the search is done.

@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit
@section Catalogue of Implicit Rules

Here is a catalogue of predefined implicit rules which are always available
unless the makefile explicitly overrides or cancels them.
(@xref{Canceling Rules}, for information on canceling or overriding an
implicit rule.  The @samp{-r} option cancels all predefined rules.)

@table @asis
@item Compiling C programs
@file{@var{n}.o} will be made automatically from @file{@var{n}.c} 
with the command @samp{$(CC) -c $(CFLAGS)}.@refill

@item Compiling Pascal programs
@file{@var{n}.o} will be made automatically from @file{@var{n}.p}
with the command @samp{$(PC) -c $(PFLAGS)}.@refill

@item Compiling Fortran, EFL and Ratfor programs
@file{@var{n}.o} will be made automatically from @file{@var{n}.e},
@file{@var{n}.r}, @file{@var{n}.F} or @file{@var{n}.f} by running the
Fortran compiler.  The precise command used is as follows:@refill

@table @samp
@item .e
@samp{$(FC) -c $(EFLAGS)}.
@item .f
@samp{$(FC) -c $(FFLAGS)}.
@item .F
@samp{$(FC) -c $(FFLAGS)}.
@item .r
@samp{$(FC) -c $(RFLAGS)}.
@end table

@item Preprocessing Fortran, EFL and Ratfor programs
@file{@var{n}.f} will be made automatically from @file{@var{n}.e},
@file{@var{n}.r} or @file{@var{n}.F}.  This rule runs just the
preprocessor to convert a Ratfor, EFL or preprocessable Fortran
program into a strict Fortran program.  The precise command used is as
follows:@refill

@table @samp
@item .e
@samp{$(FC) -F $(EFLAGS)}.
@item .F
@samp{$(FC) -F $(FFLAGS)}.
@item .r
@samp{$(FC) -F $(RFLAGS)}.
@end table

@item Assembling assembler programs
@file{@var{n}.o} will be made automatically from @file{@var{n}.s} by
running the assembler @code{as}.  The precise command used is
@samp{$(AS) $(ASFLAGS)}.@refill

@item Linking a single object file
@file{@var{n}} will be made automatically from @file{@var{n}.o} by
running the linker @code{ld} via the C compiler.  The precise command
used is @samp{$(CC) $(LDFLAGS) @dots{} $(LOADLIBES)}.@refill

This rule does the right thing for a simple program with only one source
file.  In more complicated cases, you must write an explicit command for
linking.

@item Compiling C into assembler code
@file{@var{n}.s} will be made automatically from @file{@var{n}.c}
with the command @samp{$(CC) -S $(CFLAGS)}.@refill

It would be possible for @code{make} to convert @file{@var{n}.c} into
@file{@var{n}.o} by way of @file{@var{n}.s}, using this rule and the
rule for running the assembler.  But that is not what @code{make}
does, because the rule for compiling @file{@var{n}.c} into
@file{@var{n}.o} directly comes earlier in the order of rules.  The
upshot is that the file @file{@var{n}.s} is not created or changed
when @file{@var{n}.o} is being remade.  This rule is used only if you
explicitly specify @file{@var{n}.s} as a goal or needed dependency.

This is a deliberate decision, for the sake of compatibility with Unix
@code{make}.@refill

If you want @code{make} update @file{@var{n}.s} on the way to updating
@file{@var{n}.o}, you can request this by canceling the other rule
that allows direct compilation.  @xref{Canceling Rules}.@refill

@item Compiling Pascal, Fortran, EFL or Ratfor into assembler code
@file{@var{n}.s} will be made automatically from @file{@var{n}.p},
@file{@var{n}.e}, @file{@var{n}.r}, @file{@var{n}.F} or @file{@var{n}.F}
by running the appropriate compiler with the @samp{-S} flag
instead of the @samp{-c} flag.@refill

For compatibility with Unix @code{make}, these rules apply only if you
expressly request @code{make} to update @file{@var{n}.s}.  See the
information immediately above.

@item Yacc for C programs
@file{@var{n}.c} will be made automatically from @file{@var{n}.y} by
running Yacc with the command @samp{$(YACC) $(YFLAGS)}.

@item Yacc for Ratfor programs
@file{@var{n}.r} will be made automatically from @file{@var{n}.yr} by
running Yacc with the command @samp{$(YACCR) $(YFLAGS)}.

@item Yacc for EFL programs
@file{@var{n}.e} will be made automatically from @file{@var{n}.ye} by
running Yacc with the command @samp{$(YACCE) $(YFLAGS)}.

@item Lex for C programs
@file{@var{n}.c} will be made automatically from @file{@var{n}.l} by
by running Lex.  The actual command is @samp{$(LEX) $(LFLAGS)}.

@item Lex for Ratfor programs
@file{@var{n}.r} will be made automatically from @file{@var{n}.l} by
by running Lex.  The actual command is @samp{$(LEX) $(LFLAGS)}.

The traditional custom of using the same suffix @samp{.l} for all Lex
files regardless of whether they produce C code or Ratfor code makes
it impossible for @code{make} to determine automatically which of the
two languages you are using in any particular case.  If @code{make} is
called upon to remake an object file from a @samp{.l} file, it must
guess which compiler to use.  It will guess the C compiler, because
that is more common.  If you are using Ratfor, make sure @code{make}
knows this by mentioning @file{@var{n}.r} in the makefile.

@item RCS
Any file @file{@var{n}} will be extracted if necessary from an RCS
file named either @file{@var{n},v} or @file{RCS/@var{n},v}.  The
precise command used is @samp{$(CO) $(COFLAGS)}.  The variable
@code{CO} has default value @samp{co}.

@item SCCS
Any file @file{@var{n}} will be extracted if necessary from an SCCS
file named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}.  The
precise command used is @samp{$(GET) $(GFLAGS)}.

I recommend that you avoid the use of SCCS.  RCS is widely held to be
superior, and RCS is also free.  By choosing free software in place of
comparable proprietary software, you support the free software
movement.
@end table

@node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit
@section Variables Used by Implicit Rules
@cindex flags for compilers

The commands in built-in implicit rules make liberal use of certain
predefined variables.  You can redefine these variables, either in the
makefile or with arguments to @code{make}, to alter how the implicit rules
work without actually redefining them.

For example, the command used to compile a C source file actually says
@samp{$(CC) -c $(CFLAGS)}.  The default values of the variables used
are @samp{cc} and nothing, resulting in the command @samp{cc -c}.  By
redefining @samp{$(CC)} to @samp{ncc}, you could cause @samp{ncc} to
be used for all C compilations performed by the implicit rule.  By
redefining @samp{$(CFLAGS)} to be @samp{-g}, you could pass the
@samp{-g} option to each compilation.  @emph{All} implicit rules that
do C compilation use @samp{$(CC)} to get the program name for the
compiler and @emph{all} include @samp{$(CFLAGS)} among the arguments
given to the compiler.@refill

The variables used in implicit rules fall into two classes: those that are
names of programs (like @code{CC}) and those that contain arguments for the
programs (like @code{CFLAGS}).  (The ``name of a program'' may also contain
some command arguments, but it must start with an actual executable program
name.)  If a variable value contains more than one argument, separate them
with spaces.

Here is a table of variables used as names of programs:

@table @code
@item AS
@vindex AS
Program for doing assembly; default @samp{as}.

@item CC
@vindex CC
Program for compiling C programs; default @samp{cc}.

@item CO
@vindex CO
Program for extracting a file from RCS; default @samp{co}.

@item FC
@vindex FC
Program for compiling or preprocessing Fortran programs (or Ratfor or
EFL programs); default @samp{f77}.

@item GET
@vindex GET
Program for extracting a file from SCCS; default @samp{get}.

@item LEX
@vindex LEX
Program to use to turn Lex grammars into C programs or Ratfor programs;
default @samp{lex}.

@item PC
@vindex PC
Program for compiling Pascal programs; default @samp{pc}.

@item YACC
@vindex YACC
Program to use to turn Yacc grammars into C programs; default
@samp{yacc}.

@item YACCR
@vindex YACCR
Program to use to turn Yacc grammars into Ratfor programs; default
@samp{yacc -r}.

@item YACCE
@vindex YACCE
Program to use to turn Yacc grammars into EFL programs; default
@samp{yacc -e}.

@item RANLIB
@vindex RANLIB
Program to use to update the symbol-directory of an archive
(the @file{__.SYMDEF} member); default @samp{ranlib}.
@end table

Here is a table of variables whose values are additional arguments for the
programs above:

@table @code
@item ASFLAGS
@vindex ASFLAGS
Extra flags to give to the assembler (when explicitly invoked
on a @samp{.s} file).

@item CFLAGS
@vindex CFLAGS
Extra flags to give to the C compiler; default is empty.

@item EFLAGS
@vindex EFLAGS
Extra flags to give to the Fortran compiler for EFL programs; default
is empty.

@item FFLAGS
@vindex FFLAGS
Extra flags to give to the Fortran compiler; default is empty.

@item LFLAGS
@vindex LFLAGS
Extra flags to give to Lex; default is empty.

@item LDFLAGS
@vindex LDFLAGS
Extra flags to give to compilers when they are supposed to invoke the
linker, @samp{ld}; default is empty.

@item PFLAGS
@vindex PFLAGS
Extra flags to give to the Pascal compiler; default is empty.

@item RFLAGS
@vindex RFLAGS
Extra flags to give to the Fortran compiler for Ratfor programs;
default is empty.

@item YFLAGS
@vindex YFLAGS
Extra flags to give to Yacc; default is empty.
@end table

@node Chained Rules, Pattern Rules, Implicit Variables, Implicit
@section Chains of Implicit Rules

@cindex chains of rules
Sometimes a file can be made by a sequence of implicit rules.  For example,
a file @file{@var{n}.o} could be made from @file{@var{n}.y} by running
first Yacc and then @code{cc}.  Such a sequence is called a @dfn{chain}.

If the file @file{@var{n}.c} exists, or is mentioned in the makefile, no
special searching is required: @code{make} finds that the object file can
be made by C compilation from @file{@var{n}.c}; later on, when considering
how to make @file{@var{n}.c}, the rule for running Yacc will be
used.  Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are
updated.@refill

@cindex intermediate file
However, even if @file{@var{n}.c} does not exist and is not mentioned,
@code{make} knows how to envision it as the missing link between
@file{@var{n}.o} and @file{@var{n}.y}!  In this case, @file{@var{n}.c} is
called an @dfn{intermediate file}.  Once @code{make} has decided to use the
intermediate file, it is entered in the data base as if it had been
mentioned in the makefile, along with the implicit rule that says how to
create it.@refill

Intermediate files are remade using their rules just like all other
files.  The difference is that the intermediate file is deleted when
@code{make} is finished.  Therefore, the intermediate file which did
not exist before @code{make} also does not exist after @code{make}.
The deletion is reported to you by printing a @code{rm -f} command
that shows what @code{make} is doing.  (You can optionally define an
implicit rule so as to preserve certain intermediate files.  You can also
list the target pattern of an implicit rule (such as @code{%.o}) as a
dependency file of the special target @code{.PRECIOUS} to preserve intermediate
files whose target patterns match that file's name.)@refill

A chain can involve more than two implicit rules.  For example, it is
possible to make a file @file{foo} from @file{RCS/foo.y,v} by running RCS,
Yacc and @code{cc}.  Then both @file{foo.y} and @file{foo.c} are
intermediate files that are deleted at the end.@refill

No single implicit rule can appear more than once in a chain.  This means
that @code{make} will not even consider such a ridiculous thing as making
@file{foo} from @file{foo.o.o} by running the linker twice.  This
constraint has the added benefit of preventing any infinite loop in the
search for an implicit rule chain.

There are some special implicit rules to optimize certain cases that would
otherwise by handled by rule chains.  For example, making @file{foo} from
@file{foo.c} could be handled by compiling and linking with separate rules,
using @file{foo.o} as an intermediate file.  But what actually happens is
that a special rule for this case does the compilation and linking with a
single @code{cc} command.  The optimized rule is used in preference to the
step-by-step chain because it comes earlier in the ordering of rules.

@node Pattern Rules, Last Resort, Chained Rules, Implicit
@section Defining and Redefining Pattern Rules

@cindex pattern rule
You define an implicit rule by writing a @dfn{pattern rule}.  A pattern
rule looks like an ordinary rule, except that its target contains the
character @samp{%} (exactly one of them).  The target is considered a
pattern for matching file names; the @samp{%} can match any substring,
while other characters match only themselves.

For example, @samp{%.c} as a pattern matches any file name that ends in
@samp{.c}.  @samp{s.%.c} as a pattern matches any file name that starts
with @samp{s.}, ends in @samp{.c} and is at least five characters long.
(There must be at least one character to match the @samp{%}.)  The substring
that the @samp{%} matches is called the @dfn{stem}.@refill

A pattern rule must have at least one dependency that uses @samp{%}.
@samp{%} in a dependency of a pattern rule stands for the same stem
that was matched by the @samp{%} in the target.  In order for
the pattern rule to apply, its target pattern must match the file name
under consideration, and its dependency patterns must name files that
exist or can be made.  These files become dependencies of the target.

There may also be dependencies that do not use @samp{%}; such a dependency
attaches to every file made by this pattern rule.  These unvarying
dependencies are rarely useful.

The order in which pattern rules appear in the makefile is important
because the rules are considered in that order.  Of equally applicable
rules, the first one found is used.  The rules you write take precedence
over those that are built in.  Note, however, that a rule whose
dependencies actually exist or are mentioned always takes priority over a
rule with dependencies that must be made by chaining other implicit rules.

@menu
* Examples: Pattern Examples.  Real examples of pattern rule definitions.

* Vars: Automatic.             The automatic variables enable the commands
                                in pattern rules to act on the right files.

* Matching: Pattern Match.     Details of how patterns match.

* Match-Anything Rules::       Precautions in defining a rules that can
                                match any target file whatever.

* Canceling Rules::           Overriding or canceling built-in rules.

* Last Resort::                How to define a last-resort rule
                                that applies to any target that no other
                                rule applies to.

* Suffix Rules::               The old-fashioned way to define implicit rules.
@end menu

@node Pattern Examples, Automatic, Pattern Rules, Pattern Rules
@subsection Pattern Rule Examples

Here are some examples of pattern rules actually predefined in
@code{make}.  First, the rule that compiles @samp{.c} files into @samp{.o}
files:@refill

@example
%.o : %.c
        $(CC) -c $(CFLAGS) $< -o $@@
@end example

@noindent
defines a rule that can make any file @file{@var{x}.o} from
@file{@var{x}.c}.  The command uses the automatic variables @samp{$@@} and
@samp{$<} to substitute the names of the target file and the source file
as they are in each case where the rule apply (@pxref{Automatic}).@refill

Here is a second built-in rule:

@example
% :: RCS/%,v
        $(CO) $(COFLAGS) $<
@end example

@noindent
defines a rule that can make any file @file{@var{x}} whatever from a
corresponding file @file{@var{x},v} in the subdirectory @file{RCS}.  Since
the target is @samp{%}, this rule will apply to any file whatever, provided
the appropriate dependency file exists.  The double colon makes the rule
@dfn{terminal}, which means that its dependency may not be an intermediate
file (@pxref{Match-Anything Rules}).@refill

@node Automatic, Pattern Match, Pattern Examples, Pattern Rules
@subsection Automatic Variables
@cindex automatic variables
@cindex $

Suppose you are writing a pattern rule to compile a @samp{.c} file into a
@samp{.o} file: how do you write the @samp{cc} command so that it operates
on the right source file name?  You can't write the name in the command,
because the name is different each time the implicit rule is applied.

What you do is use a special feature of @code{make}, the @dfn{automatic
variables}.  These variables have values computed afresh for each rule that
is executed, based on the target and dependencies of the rule.  In this
example, you would use @samp{$@@} for the object file name and @samp{$<}
for the source file name.

Here is a table of automatic variables:

@table @code
@item $@@
The file name of the target of the rule.  If the target is an archive
member, then @samp{$@@} is the name of the archive file.

@item $%
The target member name, when the target is an archive member.  For
example, if the target is @file{foo.a(bar.o)} then @samp{$%} is
@file{bar.o} and @samp{$@@} is @file{foo.a}.  @samp{$%} is empty
when the target is not an archive member.

@item $<
The name of the first dependency.

@item $?
The names of all the dependencies that are newer than the target, with
spaces between them.

@item $^
The names of all the dependencies, with spaces between them.

@item $*
The stem with which an implicit rule matches (@pxref{Pattern Match}).
If the target is @file{dir/a.foo.b} and the target pattern is
@file{a.%.b} then the stem is @file{dir/foo}.  The stem is useful for
constructing names of related files.@refill
@end table

@samp{$?} is useful even in explicit rules when you wish to operate on only
the dependencies that have changed.  For example, suppose that an archive
named @file{lib} is supposed to contain copies of several object files.
This rule copies just the changed object files into the archive:

@example
lib: foo.o bar.o lose.o win.o
        ar c lib $?
@end example

Of the variables listed above, four have values that are single file names.
These four have variants that get just the file's directory name or just
the file name within the directory.  The variant variables' names are
formed by appending @samp{D} or @samp{F}, respectively.  These variants are
semi-obsolete in GNU @code{make} since the functions @code{dir} and
@code{notdir} can be used to get an equivalent effect (@pxref{Filename
Functions}).  Here is a table of the variants:@refill

@table @samp
@item $(@@D)
The directory part of the file name of the target.  If the value of
@samp{$@@} is @file{dir/foo.o} then @samp{$(@@D)} is @file{dir/}.
This value is @file{./} if @samp{$@@} does not contain a slash.
@samp{$(@@D)} is equivalent to @samp{$(dir $@@)}.@refill

@item $(@@F)
The file-within-directory part of the file name of the target.  If the
value of @samp{$@@} is @file{dir/foo.o} then @samp{$(@@F)} is
@file{foo.o}.  @samp{$(@@F)} is equivalent to @samp{$(notdir $@@)}.

@item $($/)
The same as @code{$(@@F)}, for compatibility with some other versions
of @code{make}.

@item $(%D)
@itemx $(%F)
The directory part and the file-within-directory part of the archive
member name.

@item $(*D)
@itemx $(*F)
The directory part and the file-within-directory part of the stem;
@file{dir/} in this example.

@item $(<D)
@itemx $(<F)
The directory part and the file-within-directory part of the first
implicit dependency.
@end table

@node Pattern Match, Match-Anything Rules, Automatic, Pattern Rules
@subsection How Patterns Match

@cindex stem
A target pattern is composed of a @samp{%} between a prefix and a suffix,
either of which may be empty.  The pattern matches a file name only if the
file name starts with the prefix and ends with the suffix, without overlap.
The text between the prefix and the suffix is called the @dfn{stem}.  Thus,
when the pattern @samp{%.o} matches the file name @file{test.o}, the stem
is @samp{test}.  The pattern rule dependencies are turned into actual file
names by substituting the stem for the character @samp{%}.  Thus, if in the
same example one of the dependencies is written as @samp{%.c}, it expands
to @samp{test.c}.@refill

When the target pattern does not contain a slash (and usually it does not),
directory names in the file names are removed from the file name before it
is compared with the target prefix and suffix.  The directory names, along
with the slash that ends them, are added back to the stem.  Thus,
@samp{e%t} does match the file name @file{src/eat}, with @samp{src/a} as
the stem.  When dependencies are turned into file names, the directories
from the stem are added at the front, while the rest of the stem is
substituted for the @samp{%}.  The stem @samp{src/a} with a dependency
pattern @samp{c%r} gives the file name @file{src/car}.@refill

@node Match-Anything Rules, Canceling Rules, Pattern Match, Pattern Rules
@subsection Match-Anything Pattern Rules

@cindex match-anything rule
@cindex terminal rule
When a pattern rule's target is just @samp{%}, it matches any filename
whatever.  We call these rules @dfn{match-anything} rules.  They are very
useful, but it can take a lot of time for @code{make} to think about them,
because it must consider every such rule for each file name listed either
as a target or as a dependency.

Suppose the makefile mentions @file{foo.c}.  For this target, @code{make}
would have to consider making it by linking an object file @file{foo.c.o},
or by C compilation-and-linking in one step from @file{foo.c.c}, or by
Pascal compilation-and-linking from @file{foo.c.p}, and many other
possibilities.  We know these possibilities are ridiculous since
@file{foo.c} is a C source file, not an executable.@refill

If @code{make} did consider these possibilities, it would ultimately reject
them, because files such as @file{foo.c.o}, @file{foo.c.p}, etc. would not
exist.  But these possibilities are so numerous that @code{make} would run
very slowly if it had to consider them.@refill

To gain speed, we have put various constraints on the way @code{make}
considers match-anything rules.  There are two different constraints that
can be applied, and each time you define a match-anything rule you must
choose one or the other for that rule.

One choice is to mark the match-anything rule as @dfn{terminal} by defining
it with a double colon.  When a rule is terminal, it does not apply
unless its dependencies actually exist.  Dependencies that could be made
with other implicit rules are not good enough.

For example, the built-in implicit rules for extracting sources from RCS
and SCCS files are terminal; as a result, if the file @file{foo.c,v} does
not exist, @code{make} will not even consider trying to make it as an
intermediate file from @file{foo.c,v.o} or from @file{RCS/SCCS/s.foo.c,v}.
RCS and SCCS files are generally ultimate source files, which should not be
remade from any other files; therefore, @code{make} can save time by not
looking for ways to remake them.@refill

If you do not mark the match-anything rule as terminal, then it is
nonterminal.  A nonterminal match-anything rule cannot apply to a file name
that indicates a specific type of data.  A file name indicates a specific
type of data if some non-match-anything implicit rule target matches it.

For example, the file name @file{foo.c} matches the target for the pattern
rule @samp{%.c : %.y} (the rule to run Yacc).  Regardless of whether this
rule is actually applicable (which happens only if there is a file
@file{foo.y}), the fact that its target matches is enough to prevent
consideration of any nonterminal match-everything rules for the file
@file{foo.c}.  Thus, @code{make} will not even consider trying to make
@file{foo.c} as an executable file from @file{foo.c.o}, @file{foo.c.c},
@file{foo.c.p}, etc.@refill

The motivation for this constraint is that nonterminal match-everything
rules are used for making files containing specific types of data (such as
executable files) and a file name with a recognized suffix indicates a
specific different type of data (such as a C source file).

Special built-in dummy pattern rules are provided solely to recognize
certain file names so that nonterminal match-everything rules won't be
considered.  These dummy rules have no dependencies and no commands, and
they are ignored for all other purposes.  For example, the built-in
implicit rule

@example
%.p :
@end example

@noindent
exists to make sure that Pascal source files such as @file{foo.p} match a
specific target pattern and thereby prevent time from being wasted looking
for @file{foo.p.o} or @file{foo.p.c}.

@node Canceling Rules,, Match-Anything Rules, Pattern Rules
@subsection Canceling Implicit Rules

You can override a built-in implicit rule by defining a new pattern rule
with the same target and dependencies, but different commands.  When the
new rule is defined, the built-in one is replaced.  The new rule's position
in the sequence of implicit rules is determined by where you write the new
rule.

You can cancel a built-in implicit rule by defining a pattern rule with the
same target and dependencies, but no commands.  For example, the following
would cancel the rule that runs the assembler:

@example
%.o : %.s
@end example

@node Last Resort, Suffix Rules, Pattern Rules, Implicit
@section Defining Last-Resort Default Rules

@findex .DEFAULT
You can define a last-resort implicit rule by writing a rule for the target
@code{.DEFAULT}.  Such a rule's commands are used for all targets and
dependencies that have no commands of their own and for which no other
implicit rule applies.  Naturally, there is no @code{.DEFAULT} rule unless
you write one.

For example, when testing a makefile, you might not care if the source
files contain real data, only that they exist.  Then you might do this:

@example
.DEFAULT:
        touch $@@
@end example

@noindent
to cause all the source files needed (as dependencies) to be created
silently.

@node Suffix Rules, Search Algorithm, Last Resort, Implicit
@section Old-Fashioned Suffix Rules
@cindex suffix rules

@dfn{Suffix rules} are the old-fashioned way of defining implicit rules for
@code{make}.  Suffix rules are obsolete because pattern rules are more
general and clearer.  They are supported in GNU @code{make} for
compatibility with old makefiles.  They come in two kinds:
@dfn{double-suffix} and @dfn{single-suffix}.@refill

A double-suffix rule is defined by a pair of suffixes: the target suffix
and the source suffix.  It matches any file whose name ends with the target
suffix.  The corresponding implicit dependency is to the file name made by
replacing the target suffix with the source suffix.  A two-suffix rule
whose target and source suffixes are @samp{.o} and @samp{.c} is equivalent
to the pattern rule @samp{%.o : %.c}.

A single-suffix rule is defined by a single suffix, which is the source
suffix.  It matches any file name, and the corresponding implicit
dependency name is made by appending the source suffix.  A single-suffix
rule whose source suffix is @samp{.c} is equivalent to the pattern rule
@samp{% : %.c}.

Suffix rule definitions are recognized by comparing each rule's target
against a defined list of known suffixes.  When @code{make} sees a rule
whose target is a known suffix, this rule is considered a single-suffix
rule.  When @code{make} sees a rule whose target is two known suffixes
concatenated, this rule is taken as a double-suffix rule.

For example, @samp{.c} and @samp{.o} are both on the default list of known
suffixes.  Therefore, if you define a rule whose target is @samp{.c.o},
@code{make} takes it to be a double-suffix rule with source suffix
@samp{.c} and target suffix @samp{.o}.  For example, here is the old
fashioned way to define the rule for compiling a C source:@refill

@example
.c.o:
        $(CC) -c $(CFLAGS) -o $@@ $<
@end example

@findex .SUFFIXES
The known suffixes are simply the names of the dependencies of the special
target @code{.SUFFIXES}.  You can add your own suffixes by writing a rule
for @code{.SUFFIXES} that adds more dependencies, as in

@example
.SUFFIXES: .hack .win
@end example

@noindent
which adds @samp{.hack} and @samp{.win} to the end of the list of suffixes.

If you wish to eliminate the default known suffixes instead of just adding
to them, write a rule for @code{.SUFFIXES} with no dependencies.  By
special dispensation, this eliminates all existing dependencies of
@code{.SUFFIXES}.  You can then write another rule to add the suffixes you
want.  For example,

@example
.SUFFIXES:    @r{# Delete the default suffixes}
.SUFFIXES: .c .o .h   @r{# Define our suffix list}
@end example

The @samp{-r} flag causes the default list of suffixes to be empty.

@node Search Algorithm,, Last Resort, Implicit
@section Implicit Rule Search Algorithm

Here is the procedure @code{make} uses for searching for an implicit rule
for a target @var{t}.  This procedure is followed for each double-colon
rule with no commands, for each target of ordinary rules none of which have
commands, and for each dependency that is not the target of any rule.  It
is also followed recursively for dependencies that come from implicit
rules, in the search for a chain of rules.

Suffix rules are not mentioned in this algorithm because suffix rules are
converted to equivalent pattern rules after the makefiles have been read
in.

For an archive member target of the form
@samp{@var{archive}(@var{member})}, the following algorithm is run twice,
first using @samp{(@var{member})} as the target @var{t}, and second using
the entire target if the first run found no rule.@refill

@enumerate
@item
Split @var{t} into a directory part, called @var{d}, and the rest,
called @var{n}.  For example, if @var{t} is @samp{src/foo.o}, then
@var{d} is @samp{src/} and @var{n} is @samp{foo.o}.@refill

@item
Make a list of the pattern rules whose target matches @var{d} or
@var{n}.  If the target pattern contains a slash, it is matched
against @var{t}; otherwise, against @var{n}.

@item
If any rule in that list is @emph{not} a match-anything rule, then
remove all nonterminal match-anything rules from the list.

@item
Remove any rules with no dependencies from the list.

@item
For each pattern rule in the list:

@enumerate
@item
Find the stem @var{s}: the part of @var{d} or @var{n} that the
@samp{%} in the target pattern matches.@refill

@item
Compute the dependency names by substituting @var{s} for @samp{%}; if
the target pattern does not contain a slash, @var{d} is appended to
the front of each dependency name.

@item
Test whether all the dependencies exist or ought to exist.  (If a
file name mentioned in the makefile as a target or as an explicit
dependency then we say it ought to exist.)

If all dependencies exist or ought to exist, then this rule applies.
@end enumerate

@item
If no pattern rule has been found so far, try harder.  For
each pattern rule in the list:

@enumerate
@item
If the rule is a terminal match-anything rule, ignore it and go
on to the next rule.

@item
Compute the dependency names as before.

@item
Test whether all the dependencies exist or ought to exist.

@item
For each dependency that does not exist, follow this algorithm
recursively to see if the dependency can be made by an implicit
rule.

@item
If all dependencies exist, ought to exist, or can be made by
implicit rules, then this rule applies.
@end enumerate

@item
If no rule has been found so far, this target cannot be made by an
implicit rule.  Return failure.

@item
If no implicit rule applies, the rule for @code{.DEFAULT}, if any,
applies.  In that case, give @var{t} the same commands that
@code{.DEFAULT} has.  Otherwise, there are no commands for @var{t}.
@end enumerate

When the commands of a pattern rule are executed for @var{t}, the automatic
variables @samp{$@@}, @samp{$*} and @samp{$<} are set as follows:

@table @samp
@item $@@
@var{t}
@item $*
If the target pattern contains a slash, this is @var{s}; otherwise, it
is @var{d}@var{s}.
@item $<
The name of the first dependency that came via the implicit rule.
@end table

For @code{.DEFAULT} commands, as for non-implicit commands, @samp{$*}
and @samp{$<} are empty.  @samp{$@@} is @var{t}, as always.

@node Archives, Missing, Implicit, Top
@chapter Using @code{make} to Update Archive Files
@cindex archive

@dfn{Archive files} are files containing named subfiles called
@dfn{members}; they are maintained with the program @code{ar} and their
main use is as subroutine libraries for linking.

@menu
* Members: Archive Members.    How to name an archive member
				as a target or dependency.
* Update: Archive Update.      An implicit rule can update
				most archive member targets just right.
* Symbols: Archive Symbols.    Another implicit rule runs @code{ranlib}
				to update the special member @file{__.SYMDEF}.
@end menu

@node Archive Members, Archive Update, Archives, Archives
@section Archive Members as Targets
@cindex archive member targets

An individual member of an archive file can be used as a target or
dependency in @code{make}.  The archive file must already exist, but the
member need not exist.  You specify the member named @var{member} in
archive file @var{archive} as follows:

@example
@var{archive}(@var{member})
@end example

@noindent
This construct is available only in targets and dependencies, not in
commands!  Most programs that you might use in commands do not support this
syntax and cannot act directly on archive members.  Only @code{ar} and
other programs specifically designed to operate on archives can do so.
Therefore, valid commands to update an archive member target probably must
use @code{ar}.  For example, this rule says to create a member
@file{hack.o} in archive @file{foolib} by copying the file @file{hack.o}:

@example
foolib(hack.o) : hack.o
        ar r foolib hack.o
@end example

In fact, nearly all archive member targets are updated in just this way
and there is an implicit rule to do it for you.

@node Archive Update, Archive Symbols, Archive Members, Archives
@section Implicit Rule for Archive Member Targets

Recall that a target that looks like @file{@var{a}(@var{m})} stands for the
member named @var{m} in the archive file @var{a}.

When @code{make} looks for an implicit rule for such a target, as a special
feature it considers implicit rules that match @file{(@var{m})}, as well as
those that match the actual target @file{@var{a}(@var{m})}.

This causes one special rule whose target is @file{(%)} to match.  This
rule updates the target @file{@var{a}(@var{m})} by copying the file @var{m}
into the archive.  For example, it will update the archive member target
@file{foo.a(bar.o)} by copying the @emph{file} @file{bar.o} into the
archive @file{foo.a} as a member named @file{bar.o}.

When this rule is chained with others, the result is very powerful.  The
command @samp{make "foo.a(bar.o)"} in the presence of a file @file{bar.c}
is enough to cause the following commands to be run, even without a
makefile:

@example
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
@end example

@noindent
Here the file @file{bar.o} has been invented as an intermediate file.

@node Archive Symbols,, Archive Update, Archives
@subsection Updating Archive Symbol Directories
@cindex __.SYMDEF

An archive file that is used as a library usually contains a special member
named @file{__.SYMDEF} that contains a directory of the external symbol
names defined by all the other members.  After you update any other
members, you need to update @file{__.SYMDEF} so that it will summarize the
other members properly.  This is done by running the @code{ranlib} program:

@example
ranlib @var{archivefile}
@end example

Normally you would put this command in the rule for the archive file,
and make all the members of the archive file dependents of that rule.
For example,

@example
libfoo.a: libfoo.a(x.o) libfoo.a(y.o) @dots{}
        ranlib libfoo.a
@end example

@noindent
The effect of this is to update archive members @file{x.o}, @file{y.o},
etc., and then update the symbol directory member @file{__.SYMDEF} by
running @code{ranlib}.  The rules for updating the members are not shown
here; most likely you can omit them and use the implicit rule which copies
files into the archive, as described in the preceding section.

@node Missing, Concept Index, Archives, Top
The variable @code{MAKELEVEL} which keeps track of the current level
of @code{make} recursion.  @xref{Recursion}.
The @code{make} programs in various other systems support three features
@item
Static pattern rules.  @xref{Static Pattern}.

@item
Selective @code{vpath} search.  @xref{Directory Search}.

@item
Recursive variable references.  @xref{Reference}.
@end itemize

@node Missing, Concept Index, Features, Top
@chapter Missing Features in GNU @code{make}

The @code{make} programs in various other systems support a few features
that are not implemented in GNU @code{make}.

suffix rule @samp{.c~.o} would make files @file{@var{n}.o} file from
@item
A target of the form @samp{@var{file}((@var{entry}))} stands for a member
of archive file @var{file}.  The member is chosen, not by name, but by
being an object file which defines the linker symbol @var{entry}.@refill

This feature was not put into GNU @code{make} because of the
nonmodularity of putting knowledge into @code{make} of the internal
format of archive file symbol directories.  @xref{Archive Symbols}.

@item
Suffixes (used in suffix rules) that end with the character @samp{~}
have a special meaning; they refer to the SCCS file that corresponds
to the file one would get without the @samp{~}.  For example, the
suffix rule @samp{.c~.o} would make the file @file{@var{n}.o} file from
@noindent
can be replaced with the GNU @code{make} static pattern rule:

@example
$(targets): %: %.o lib.a
@end example

@item
In System V and 4.3 BSD @code{make}, files found by @code{VPATH} search
(@pxref{Directory Search}) have their names changed inside command strings.
We feel it is much cleaner to always use automatic variables and thus
obviate the need for this feature.  We are still debating whether to
implement this to be compatible or to leave it out to avoid such ugliness.
@end itemize

@node Concept Index, Name Index, Missing, Top
@unnumbered Index of Concepts

@printindex cp

@node Name Index,, Concept Index, Top
@unnumbered Index of Functions, Directives and Variables

@printindex fn

@contents
@bye
