summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog8
-rwxr-xr-xdebian/rules2
-rw-r--r--debian/source/local-options2
-rw-r--r--src/kmk/doc/make.texi11150
4 files changed, 9 insertions, 11153 deletions
diff --git a/debian/changelog b/debian/changelog
index 9f83330..bbeb5ed 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+kbuild (1:0.1.9998svn2543+dfsg-0.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Remove unused and non DFSG-compliant src/kmk/doc/make.texi from source.
+ (Closes: #695779)
+
+ -- David Prévot <taffit@debian.org> Sun, 30 Dec 2012 16:27:03 -0400
+
kbuild (1:0.1.9998svn2543-2) unstable; urgency=low
* Fix FTBFS on kfreebsd: link against pthread. (Closes: #645698)
diff --git a/debian/rules b/debian/rules
index e4cc389..152917d 100755
--- a/debian/rules
+++ b/debian/rules
@@ -6,7 +6,7 @@ YACC := YACC=/usr/bin/byacc
BOOTSTRAP := ASH=/bin/bash ECHO=/bin/echo MKDIR=/bin/mkdir CP=/bin/cp \
RM=/bin/rm INSTALL=/usr/bin/install $(YACC)
SVNROOT := http://svn.netlabs.org/repos/kbuild/trunk
-REVISION := $(shell echo $(UPSTREAM_VERSION) | sed -e's,.*svn,,')
+REVISION := $(shell echo $(UPSTREAM_VERSION) | sed -e's,.*svn,,' | sed -e's,+dfsg.*,,')
export LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS) -Wl,--as-needed
diff --git a/debian/source/local-options b/debian/source/local-options
deleted file mode 100644
index 9cdfca9..0000000
--- a/debian/source/local-options
+++ /dev/null
@@ -1,2 +0,0 @@
-unapply-patches
-abort-on-upstream-changes
diff --git a/src/kmk/doc/make.texi b/src/kmk/doc/make.texi
deleted file mode 100644
index 67df584..0000000
--- a/src/kmk/doc/make.texi
+++ /dev/null
@@ -1,11150 +0,0 @@
-\input texinfo @c -*- Texinfo -*-
-@c %**start of header
-@setfilename make.info
-
-@include version.texi
-@set EDITION 0.70
-@set RCSID $Id: make.texi,v 1.52 2008/05/18 15:11:40 psmith Exp $
-
-@settitle GNU @code{make}
-@setchapternewpage odd
-@c Combine the variable and function indices:
-@syncodeindex vr fn
-@c Combine the program and concept indices:
-@syncodeindex pg cp
-@c FSF publishers: format makebook.texi instead of using this file directly.
-@c ISBN provided by Lisa M. Opus Goldstein <opus@gnu.org>, 5 May 2004
-@set ISBN 1-882114-83-5
-@c %**end of header
-
-@copying
-This file documents the GNU @code{make} utility, which determines
-automatically which pieces of a large program need to be recompiled,
-and issues the commands to recompile them.
-
-This is Edition @value{EDITION}, last updated @value{UPDATED},
-of @cite{The GNU Make Manual}, for GNU @code{make} version @value{VERSION}.
-
-Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007
-Free Software Foundation, Inc.
-
-@quotation
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2 or
-any later version published by the Free Software Foundation; with no
-Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
-and with the Back-Cover Texts as in (a) below. A copy of the
-license is included in the section entitled ``GNU Free Documentation
-License.''
-
-(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
-this GNU Manual. Buying copies from GNU Press supports the FSF in
-developing GNU and promoting software freedom.''
-@end quotation
-@end copying
-
-@c finalout
-
-@c ISPELL CHECK: done, 10 June 1993 --roland
-@c ISPELL CHECK: done, 2000-06-25 --Martin Buchholz
-
-
-@dircategory Software development
-@direntry
-* Make: (make). Remake files automatically.
-@end direntry
-
-@iftex
-@shorttitlepage GNU Make
-@end iftex
-@titlepage
-@title GNU Make
-@subtitle A Program for Directing Recompilation
-@subtitle GNU @code{make} Version @value{VERSION}
-@subtitle @value{UPDATED-MONTH}
-@author Richard M. Stallman, Roland McGrath, Paul D. Smith
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@sp 2
-Published by the Free Software Foundation @*
-51 Franklin St. -- Fifth Floor @*
-Boston, MA 02110-1301 USA @*
-ISBN @value{ISBN} @*
-@sp 2
-Cover art by Etienne Suvasa.
-@end titlepage
-
-@summarycontents
-@contents
-
-@ifnottex
-@node Top, Overview, (dir), (dir)
-@top GNU @code{make}
-
-@insertcopying
-@end ifnottex
-
-@menu
-* Overview:: Overview of @code{make}.
-* Introduction:: An introduction to @code{make}.
-* Makefiles:: Makefiles tell @code{make} what to do.
-* Rules:: Rules describe when a file must be remade.
-* Recipes:: Recipes say how to remake a file.
-* Using Variables:: You can use variables to avoid repetition.
-* Conditionals:: Use or ignore parts of the makefile based
- on the values of variables.
-* Functions:: Many powerful ways to manipulate text.
-* Invoking make: Running. How to invoke @code{make} on the command line.
-* Implicit Rules:: Use implicit rules to treat many files alike,
- based on their file names.
-* Archives:: How @code{make} can update library archives.
-* Features:: Features GNU @code{make} has over other @code{make}s.
-* Missing:: What GNU @code{make} lacks from other @code{make}s.
-* Makefile Conventions:: Conventions for writing makefiles for
- GNU programs.
-* Quick Reference:: A quick reference for experienced users.
-* Error Messages:: A list of common errors generated by @code{make}.
-* Complex Makefile:: A real example of a straightforward,
- but nontrivial, makefile.
-
-* GNU Free Documentation License:: License for copying this manual
-* Concept Index:: Index of Concepts
-* Name Index:: Index of Functions, Variables, & Directives
-
-@detailmenu
- --- The Detailed Node Listing ---
-
-Overview of @code{make}
-
-* Preparing:: Preparing and running make
-* Reading:: On reading this text
-* Bugs:: Problems and bugs
-
-An Introduction to Makefiles
-
-* Rule Introduction:: What a rule looks like.
-* Simple Makefile:: A simple makefile
-* How Make Works:: How @code{make} processes this makefile
-* Variables Simplify:: Variables make makefiles simpler
-* make Deduces:: Letting @code{make} deduce the recipe
-* Combine By Prerequisite:: Another style of makefile
-* Cleanup:: Rules for cleaning the directory
-
-Writing Makefiles
-
-* Makefile Contents:: What makefiles contain.
-* Makefile Names:: How to name your makefile.
-* Include:: How one makefile can use another makefile.
-* MAKEFILES Variable:: The environment can specify extra makefiles.
-* Remaking Makefiles:: How makefiles get remade.
-* Overriding Makefiles:: How to override part of one makefile
- with another makefile.
-* Reading Makefiles:: How makefiles are parsed.
-* Secondary Expansion:: How and when secondary expansion is performed.
-
-Writing Rules
-
-* Rule Example:: An example explained.
-* Rule Syntax:: General syntax explained.
-* Prerequisite Types:: There are two types of prerequisites.
-* Wildcards:: Using wildcard characters such as `*'.
-* Directory Search:: Searching other directories for source files.
-* Phony Targets:: Using a target that is not a real file's name.
-* Force Targets:: You can use a target without a recipe
- or prerequisites to mark other targets
- as phony.
-* Empty Targets:: When only the date matters and the
- files are empty.
-* Special Targets:: Targets with special built-in meanings.
-* Multiple Targets:: When to make use of several targets in a rule.
-* Multiple Rules:: How to use several rules with the same target.
-* Static Pattern:: Static pattern rules apply to multiple targets
- and can vary the prerequisites according to
- the target name.
-* Double-Colon:: How to use a special kind of rule to allow
- several independent rules for one target.
-* Automatic Prerequisites:: How to automatically generate rules giving
- prerequisites from source files themselves.
-
-Using Wildcard Characters in File Names
-
-* Wildcard Examples:: Several examples
-* Wildcard Pitfall:: Problems to avoid.
-* Wildcard Function:: How to cause wildcard expansion where
- it does not normally take place.
-
-Searching Directories for Prerequisites
-
-* General Search:: Specifying a search path that applies
- to every prerequisite.
-* Selective Search:: Specifying a search path
- for a specified class of names.
-* Search Algorithm:: When and how search paths are applied.
-* Recipes/Search:: How to write recipes that work together
- with search paths.
-* Implicit/Search:: How search paths affect implicit rules.
-* Libraries/Search:: Directory search for link libraries.
-
-Static Pattern Rules
-
-* Static Usage:: The syntax of static pattern rules.
-* Static versus Implicit:: When are they better than implicit rules?
-
-Writing Recipes in Rules
-
-* Recipe Syntax:: Recipe syntax features and pitfalls.
-* Echoing:: How to control when recipes are echoed.
-* Execution:: How recipes are executed.
-* Parallel:: How recipes can be executed in parallel.
-* Errors:: What happens after a recipe execution error.
-* Interrupts:: What happens when a recipe is interrupted.
-* Recursion:: Invoking @code{make} from makefiles.
-* Sequences:: Defining canned recipes.
-* Empty Recipes:: Defining useful, do-nothing recipes.
-
-Recipe Syntax
-
-* Splitting Lines:: Breaking long recipe lines for readability.
-* Variables in Recipes:: Using @code{make} variables in recipes.
-
-Recipe Execution
-
-* Choosing the Shell:: How @code{make} chooses the shell used
- to run recipes.
-
-Recursive Use of @code{make}
-
-* MAKE Variable:: The special effects of using @samp{$(MAKE)}.
-* Variables/Recursion:: How to communicate variables to a sub-@code{make}.
-* Options/Recursion:: How to communicate options to a sub-@code{make}.
-* -w Option:: How the @samp{-w} or @samp{--print-directory} option
- helps debug use of recursive @code{make} commands.
-
-How to Use Variables
-
-* Reference:: How to use the value of a variable.
-* Flavors:: Variables come in two flavors.
-* Advanced:: Advanced features for referencing a variable.
-* Values:: All the ways variables get their values.
-* Setting:: How to set a variable in the makefile.
-* Appending:: How to append more text to the old value
- of a variable.
-* Override Directive:: How to set 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.
-* Target-specific:: Variable values can be defined on a per-target
- basis.
-* Pattern-specific:: Target-specific variable values can be applied
- to a group of targets that match a pattern.
-* Special Variables:: Variables with special meaning or behavior.
-
-Advanced Features for Reference to Variables
-
-* Substitution Refs:: Referencing a variable with
- substitutions on the value.
-* Computed Names:: Computing the name of the variable to refer to.
-
-Conditional Parts of Makefiles
-
-* Conditional Example:: Example of a conditional
-* Conditional Syntax:: The syntax of conditionals.
-* Testing Flags:: Conditionals that test flags.
-
-Functions for Transforming Text
-
-* Syntax of Functions:: How to write a function call.
-* Text Functions:: General-purpose text manipulation functions.
-* File Name Functions:: Functions for manipulating file names.
-* Conditional Functions:: Functions that implement conditions.
-* Foreach Function:: Repeat some text with controlled variation.
-* Call Function:: Expand a user-defined function.
-* Value Function:: Return the un-expanded value of a variable.
-* Eval Function:: Evaluate the arguments as makefile syntax.
-* Origin Function:: Find where a variable got its value.
-* Flavor Function:: Find out the flavor of a variable.
-* Shell Function:: Substitute the output of a shell command.
-* Make Control Functions:: Functions that control how make runs.
-
-How to Run @code{make}
-
-* Makefile Arguments:: How to specify which makefile to use.
-* Goals:: How to use goal arguments to specify which
- parts of the makefile to use.
-* Instead of Execution:: How to use mode flags to specify what
- kind of thing to do with the recipes
- in the makefile other than simply
- execute them.
-* Avoiding Compilation:: How to avoid recompiling certain files.
-* Overriding:: How to override a variable to specify
- an alternate compiler and other things.
-* Testing:: How to proceed past some errors, to
- test compilation.
-* Options Summary:: Summary of Options
-
-Using Implicit Rules
-
-* Using Implicit:: How to use an existing implicit rule
- to get the recipe for updating a file.
-* Catalogue of Rules:: A list of built-in implicit rules.
-* Implicit Variables:: How to change what predefined rules do.
-* Chained Rules:: How to use a chain of implicit rules.
-* Pattern Rules:: How to define new implicit rules.
-* Last Resort:: How to define a recipe for rules which
- cannot find any.
-* Suffix Rules:: The old-fashioned style of implicit rule.
-* Implicit Rule Search:: The precise algorithm for applying
- implicit rules.
-
-Defining and Redefining Pattern Rules
-
-* Pattern Intro:: An introduction to pattern rules.
-* Pattern Examples:: Examples of pattern rules.
-* Automatic Variables:: How to use automatic variables in the
- recipe of implicit rules.
-* Pattern Match:: How patterns match.
-* Match-Anything Rules:: Precautions you should take prior to
- defining rules that can match any
- target file whatever.
-* Canceling Rules:: How to override or cancel built-in rules.
-
-Using @code{make} to Update Archive Files
-
-* Archive Members:: Archive members as targets.
-* Archive Update:: The implicit rule for archive member targets.
-* Archive Pitfalls:: Dangers to watch out for when using archives.
-* Archive Suffix Rules:: You can write a special kind of suffix rule
- for updating archives.
-
-Implicit Rule for Archive Member Targets
-
-* Archive Symbols:: How to update archive symbol directories.
-
-@end detailmenu
-@end menu
-
-@node Overview, Introduction, Top, Top
-@comment node-name, next, previous, up
-@chapter Overview of @code{make}
-
-The @code{make} utility automatically determines which pieces of a large
-program need to be recompiled, and issues commands to recompile them.
-This manual describes GNU @code{make}, which was implemented by Richard
-Stallman and Roland McGrath. Development since Version 3.76 has been
-handled by Paul D. Smith.
-
-GNU @code{make} conforms to section 6.2 of @cite{IEEE Standard
-1003.2-1992} (POSIX.2).
-@cindex POSIX
-@cindex IEEE Standard 1003.2
-@cindex standards conformance
-
-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. Indeed, @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.
-
-@menu
-* Preparing:: Preparing and Running Make
-* Reading:: On Reading this Text
-* Bugs:: Problems and Bugs
-@end menu
-
-@node Preparing, Reading, Overview, Overview
-@ifnottex
-@heading Preparing and Running Make
-@end ifnottex
-
-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 provides 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 recipes recorded in the data base.
-
-You can provide command line arguments to @code{make} to control which
-files should be recompiled, or how. @xref{Running, ,How to Run
-@code{make}}.
-
-@node Reading, Bugs, Preparing, Overview
-@section How to Read This Manual
-
-If you are new to @code{make}, or are looking for a general
-introduction, read the first few sections of each chapter, skipping the
-later sections. In each chapter, the first few sections contain
-introductory or general information and the later sections contain
-specialized or technical information.
-@ifnottex
-The exception is the second chapter, @ref{Introduction, ,An
-Introduction to Makefiles}, all of which is introductory.
-@end ifnottex
-@iftex
-The exception is @ref{Introduction, ,An Introduction to Makefiles},
-all of which is introductory.
-@end iftex
-
-If you are familiar with other @code{make} programs, see @ref{Features,
-,Features of GNU @code{make}}, which lists the enhancements GNU
-@code{make} has, and @ref{Missing, ,Incompatibilities and Missing
-Features}, which explains the few things GNU @code{make} lacks that
-others have.
-
-For a quick summary, see @ref{Options Summary}, @ref{Quick Reference},
-and @ref{Special Targets}.
-
-@node Bugs, , Reading, Overview
-@section Problems and Bugs
-@cindex reporting bugs
-@cindex bugs, reporting
-@cindex problems and bugs, reporting
-
-If you have problems with GNU @code{make} or think you've found a bug,
-please report it to the developers; we cannot promise to do anything but
-we might well want to fix it.
-
-Before reporting a bug, make sure you've actually found a real bug.
-Carefully reread 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,
-including any error or warning messages. Please don't paraphrase
-these messages: it's best to cut and paste them into your report.
-When generating this small makefile, be sure to not use any non-free
-or unusual tools in your recipes: you can almost always emulate what
-such a tool would do with simple shell commands. Finally, be sure to
-explain what you expected to occur; this will help us decide whether
-the problem was really in the documentation.
-
-Once you have a precise problem you can report it in one of two ways.
-Either send electronic mail to:
-
-@example
- bug-make@@gnu.org
-@end example
-
-@noindent
-or use our Web-based project management tool, at:
-
-@example
- http://savannah.gnu.org/projects/make/
-@end example
-
-@noindent
-In addition to the information above, please be careful to include the
-version number of @code{make} you are using. You can get this
-information with the command @samp{make --version}. Be sure also to
-include the type of machine and operating system you are using. One
-way to obtain this information is by looking at the final lines of
-output from the command @samp{make --help}.
-
-@node Introduction, Makefiles, Overview, Top
-@comment node-name, next, previous, up
-@chapter An Introduction to Makefiles
-
-You need a file called a @dfn{makefile} to tell @code{make} what to do.
-Most often, the makefile tells @code{make} how to compile and link a
-program.
-@cindex makefile
-
-In this chapter, we will discuss a simple makefile that describes how to
-compile and link a text editor which consists of eight C source files
-and three header files. The makefile can also tell @code{make} how to
-run miscellaneous commands when explicitly asked (for example, to remove
-certain files as a clean-up operation). To see a more complex example
-of a makefile, see @ref{Complex Makefile}.
-
-When @code{make} recompiles the editor, each changed C source file
-must be recompiled. If a header file has changed, each C source file
-that includes the header file must be recompiled to be safe. 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.
-@cindex recompilation
-@cindex editor
-
-@menu
-* Rule Introduction:: What a rule looks like.
-* Simple Makefile:: A Simple Makefile
-* How Make Works:: How @code{make} Processes This Makefile
-* Variables Simplify:: Variables Make Makefiles Simpler
-* make Deduces:: Letting @code{make} Deduce the Recipes
-* Combine By Prerequisite:: Another Style of Makefile
-* Cleanup:: Rules for Cleaning the Directory
-@end menu
-
-@node Rule Introduction, Simple Makefile, Introduction, Introduction
-@comment node-name, next, previous, up
-@section What a Rule Looks Like
-@cindex rule, introduction to
-@cindex makefile rule parts
-@cindex parts of makefile rule
-
-A simple makefile consists of ``rules'' with the following shape:
-
-@cindex targets, introduction to
-@cindex prerequisites, introduction to
-@cindex recipes, introduction to
-@example
-@group
-@var{target} @dots{} : @var{prerequisites} @dots{}
- @var{recipe}
- @dots{}
- @dots{}
-@end group
-@end example
-
-A @dfn{target} is usually the name of a file that is generated by a
-program; examples of targets are executable or object files. A target
-can also be the name of an action to carry out, such as @samp{clean}
-(@pxref{Phony Targets}).
-
-A @dfn{prerequisite} is a file that is used as input to create the
-target. A target often depends on several files.
-
-@cindex tabs in rules
-A @dfn{recipe} is an action that @code{make} carries out.
-A recipe may have more than one command, each on its own line.
-@strong{Please note:} you need to put a tab character at the beginning of
-every command line! This is an obscurity that catches the unwary. If
-you prefer to prefix your recipes with a character other than tab,
-you can set the @code{.CMDPREFIX} variable to an alternate character
-(@pxref{Special Variables}).
-
-Usually a recipe is in a rule with prerequisites and serves to create a
-target file if any of the prerequisites change. However, the rule that
-specifies a recipe for the target need not have prerequisites. For
-example, the rule containing the delete command associated with the
-target @samp{clean} does not have prerequisites.
-
-A @dfn{rule}, then, explains how and when to remake certain files
-which are the targets of the particular rule. @code{make} carries out
-the recipe on the prerequisites to create or update the target. A
-rule can also explain how and when to carry out an action.
-@xref{Rules, , Writing Rules}.
-
-A makefile may contain other text besides rules, but a simple makefile
-need only contain rules. Rules may look somewhat more complicated
-than shown in this template, but all fit the pattern more or less.
-
-@node Simple Makefile, How Make Works, Rule Introduction, Introduction
-@section A Simple Makefile
-@cindex simple makefile
-@cindex makefile, simple
-
-Here is a straightforward makefile that describes the way an
-executable file called @code{edit} depends on eight object files
-which, in turn, depend on eight C source and three header files.
-
-In this example, all the C files include @file{defs.h}, but only those
-defining editing commands include @file{command.h}, and only low
-level files that change the editor buffer include @file{buffer.h}.
-
-@example
-@group
-edit : main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
- cc -o edit main.o kbd.o command.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
-command.o : command.c defs.h command.h
- cc -c command.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
-clean :
- rm edit main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
-@end group
-@end example
-
-@noindent
-We split each long line into two lines using backslash-newline; this is
-like using one long line, but is easier to read.
-@cindex continuation lines
-@cindex @code{\} (backslash), for continuation lines
-@cindex backslash (@code{\}), for continuation lines
-@cindex quoting newline, in makefile
-@cindex newline, quoting, in makefile
-
-To use this makefile to create the executable file called @file{edit},
-type:
-
-@example
-make
-@end example
-
-To use this makefile to delete the executable file and all the object
-files from the directory, type:
-
-@example
-make clean
-@end example
-
-In the example makefile, the targets include the executable file
-@samp{edit}, and the object files @samp{main.o} and @samp{kbd.o}. The
-prerequisites are files such as @samp{main.c} and @samp{defs.h}.
-In fact, each @samp{.o} file is both a target and a prerequisite.
-Recipes include @w{@samp{cc -c main.c}} and @w{@samp{cc -c kbd.c}}.
-
-When a target is a file, it needs to be recompiled or relinked if any
-of its prerequisites change. In addition, any prerequisites 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}.
-
-A recipe may follow each line that contains a target and
-prerequisites. These recipes say how to update the target file. A
-tab character (or whatever character is specified by the
-@code{.CMDPREFIX} variable; @pxref{Special Variables}) must come at
-the beginning of every line in the recipe to distinguish recipes from
-other lines in the makefile. (Bear in mind that @code{make} does not
-know anything about how the recipes work. It is up to you to supply
-recipes that will update the target file properly. All @code{make}
-does is execute the commands in the recipe you have specified when the
-target file needs to be updated.)@refill
-@cindex recipe
-
-The target @samp{clean} is not a file, but merely the name of an
-action. Since you normally do not want to carry out the actions in
-this rule, @samp{clean} is not a prerequisite of any other rule.
-Consequently, @code{make} never does anything with it unless you tell
-it specifically. Note that this rule not only is not a prerequisite,
-it also does not have any prerequisites, so the only purpose of the
-rule is to run the specified recipe. Targets that do not refer to
-files but are just actions are called @dfn{phony targets}.
-@xref{Phony Targets}, for information about this kind of target.
-@xref{Errors, , Errors in Recipes}, to see how to cause @code{make}
-to ignore errors from @code{rm} or any other command.
-@cindex @code{clean} target
-@cindex @code{rm} (shell command)
-
-@node How Make Works, Variables Simplify, Simple Makefile, Introduction
-@comment node-name, next, previous, up
-@section How @code{make} Processes a Makefile
-@cindex processing a makefile
-@cindex makefile, how @code{make} processes
-
-By default, @code{make} starts with the first target (not targets whose
-names start with @samp{.}). This is called the @dfn{default goal}.
-(@dfn{Goals} are the targets that @code{make} strives ultimately to
-update. You can override this behavior using the command line
-(@pxref{Goals, , Arguments to Specify the Goals}) or with the
-@code{.DEFAULT_GOAL} special variable (@pxref{Special Variables, ,
-Other Special Variables}).
-@cindex default goal
-@cindex goal, default
-@cindex goal
-
-In the simple example of the previous section, the default goal is to
-update the executable program @file{edit}; therefore, we put that rule
-first.
-
-Thus, when you give the command:
-
-@example
-make
-@end example
-
-@noindent
-@code{make} reads the makefile in the current directory and begins by
-processing the first rule. In the example, this rule is for relinking
-@file{edit}; but before @code{make} can fully process this rule, it
-must process the rules for the files that @file{edit} depends on,
-which in this case are the object files. Each of these files is
-processed according to its own rule. These rules say to update each
-@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
-prerequisites, is more recent than the object file, or if the object
-file does not exist.
-
-The other rules are processed because their targets appear as
-prerequisites of the goal. If some other rule is not depended on by the
-goal (or anything it depends on, etc.), that rule is not processed,
-unless you tell @code{make} to do so (with a command such as
-@w{@code{make clean}}).
-
-Before recompiling an object file, @code{make} considers updating its
-prerequisites, 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 @code{make} does nothing for these
-files. But @code{make} would update automatically generated C programs,
-such as those made by Bison or Yacc, by their own rules at this time.
-
-After recompiling whichever object files need it, @code{make} decides
-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} is relinked.
-@cindex relinking
-
-Thus, if we change the file @file{insert.c} and run @code{make},
-@code{make} will compile that file to update @file{insert.o}, and then
-link @file{edit}. If we change the file @file{command.h} and run
-@code{make}, @code{make} will recompile the object files @file{kbd.o},
-@file{command.o} and @file{files.o} and then link the file @file{edit}.
-
-@node Variables Simplify, make Deduces, How Make Works, Introduction
-@section Variables Make Makefiles Simpler
-@cindex variables
-@cindex simplifying with variables
-
-In our example, we had to list all the object files twice in the rule for
-@file{edit} (repeated here):
-
-@example
-@group
-edit : main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
- cc -o edit main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
-@end group
-@end example
-
-@cindex @code{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 variable. @dfn{Variables}
-allow a text string to be defined once and substituted in multiple places
-later (@pxref{Using Variables, ,How to Use Variables}).
-
-@cindex @code{OBJECTS}
-@cindex @code{objs}
-@cindex @code{OBJS}
-@cindex @code{obj}
-@cindex @code{OBJ}
-It is 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
-@group
-objects = main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
-@end group
-@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{Using Variables, ,How to Use Variables}).
-
-Here is how the complete simple makefile looks when you use a variable
-for the object files:
-
-@example
-@group
-objects = main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
-
-edit : $(objects)
- cc -o edit $(objects)
-main.o : main.c defs.h
- cc -c main.c
-kbd.o : kbd.c defs.h command.h
- cc -c kbd.c
-command.o : command.c defs.h command.h
- cc -c command.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
-clean :
- rm edit $(objects)
-@end group
-@end example
-
-@node make Deduces, Combine By Prerequisite, Variables Simplify, Introduction
-@section Letting @code{make} Deduce the Recipes
-@cindex deducing recipes (implicit rules)
-@cindex implicit rule, introduction to
-@cindex rule, implicit, introduction to
-
-It is not necessary to spell out the recipes 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 recipe @samp{cc -c main.c -o main.o} to compile @file{main.c} into
-@file{main.o}. We can therefore omit the recipes from the rules for the
-object files. @xref{Implicit Rules, ,Using Implicit Rules}.@refill
-
-When a @samp{.c} file is used automatically in this way, it is also
-automatically added to the list of prerequisites. We can therefore omit
-the @samp{.c} files from the prerequisites, provided we omit the recipe.
-
-Here is the entire example, with both of these changes, and a variable
-@code{objects} as suggested above:
-
-@example
-@group
-objects = main.o kbd.o command.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
-command.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
-
-.PHONY : clean
-clean :
- rm edit $(objects)
-@end group
-@end example
-
-@noindent
-This is how we would write the makefile in actual practice. (The
-complications associated with @samp{clean} are described elsewhere.
-See @ref{Phony Targets}, and @ref{Errors, ,Errors in Recipes}.)
-
-Because implicit rules are so convenient, they are important. You
-will see them used frequently.@refill
-
-@node Combine By Prerequisite, Cleanup, make Deduces, Introduction
-@section Another Style of Makefile
-@cindex combining rules by prerequisite
-
-When the objects of a makefile are created only by implicit rules, an
-alternative style of makefile is possible. In this style of makefile,
-you group entries by their prerequisites instead of by their targets.
-Here is what one looks like:
-
-@example
-@group
-objects = main.o kbd.o command.o display.o \
- insert.o search.o files.o utils.o
-
-edit : $(objects)
- cc -o edit $(objects)
-
-$(objects) : defs.h
-kbd.o command.o files.o : command.h
-display.o insert.o search.o files.o : buffer.h
-@end group
-@end example
-
-@noindent
-Here @file{defs.h} is given as a prerequisite of all the object files;
-@file{command.h} and @file{buffer.h} are prerequisites 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 Cleanup, , Combine By Prerequisite, Introduction
-@section Rules for Cleaning the Directory
-@cindex cleaning up
-@cindex removing, to clean up
-
-Compiling a program is not the only thing you might want to write rules
-for. Makefiles commonly tell how to do a few other things besides
-compiling a program: for example, how to delete all the object files
-and executables so that the directory is @samp{clean}.
-
-@cindex @code{clean} target
-Here is how we
-could write a @code{make} rule for cleaning our example editor:
-
-@example
-@group
-clean:
- rm edit $(objects)
-@end group
-@end example
-
-In practice, we might want to write the rule in a somewhat more
-complicated manner to handle unanticipated situations. We would do this:
-
-@example
-@group
-.PHONY : clean
-clean :
- -rm edit $(objects)
-@end group
-@end example
-
-@noindent
-This prevents @code{make} from getting confused by an actual file
-called @file{clean} and causes it to continue in spite of errors from
-@code{rm}. (See @ref{Phony Targets}, and @ref{Errors, ,Errors in
-Recipes}.)
-
-@noindent
-A rule such as this should not be placed at the beginning of the
-makefile, because we do not want it to run by default! Thus, in the
-example makefile, we want the rule for @code{edit}, which recompiles
-the editor, to remain the default goal.
-
-Since @code{clean} is not a prerequisite of @code{edit}, this rule will not
-run at all if we give the command @samp{make} with no arguments. In
-order to make the rule run, we have to type @samp{make clean}.
-@xref{Running, ,How to Run @code{make}}.
-
-@node Makefiles, Rules, Introduction, Top
-@chapter Writing Makefiles
-
-@cindex makefile, how to write
-The information that tells @code{make} how to recompile a system comes from
-reading a data base called the @dfn{makefile}.
-
-@menu
-* Makefile Contents:: What makefiles contain.
-* Makefile Names:: How to name your makefile.
-* Include:: How one makefile can use another makefile.
-* MAKEFILES Variable:: The environment can specify extra makefiles.
-* Remaking Makefiles:: How makefiles get remade.
-* Overriding Makefiles:: How to override part of one makefile
- with another makefile.
-* Reading Makefiles:: How makefiles are parsed.
-* Secondary Expansion:: How and when secondary expansion is performed.
-@end menu
-
-@node Makefile Contents, Makefile Names, Makefiles, Makefiles
-@section What Makefiles Contain
-
-Makefiles contain five kinds of things: @dfn{explicit rules},
-@dfn{implicit rules}, @dfn{variable definitions}, @dfn{directives},
-and @dfn{comments}. Rules, variables, and directives are described at
-length in later chapters.@refill
-
-@itemize @bullet
-@cindex rule, explicit, definition of
-@cindex explicit rule, definition of
-@item
-An @dfn{explicit 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 depend on, called the @dfn{prerequisites} of the target, and
-may also give a recipe to use to create or update the targets.
-@xref{Rules, ,Writing Rules}.
-
-@cindex rule, implicit, definition of
-@cindex implicit rule, definition of
-@item
-An @dfn{implicit rule} says when and how to remake a class of files
-based on their names. It describes how a target may depend on a file
-with a name similar to the target and gives a recipe to create or
-update such a target. @xref{Implicit Rules, ,Using Implicit Rules}.
-
-@cindex variable definition
-@item
-A @dfn{variable definition} is a line that specifies a text string
-value for a variable that can be substituted into the text later. The
-simple makefile example shows a variable definition for @code{objects}
-as a list of all object files (@pxref{Variables Simplify, , Variables
-Make Makefiles Simpler}).
-
-@cindex directive
-@item
-A @dfn{directive} is an instruction for @code{make} to do something
-special while reading the makefile. These include:
-
-@itemize @bullet
-@item
-Reading another makefile (@pxref{Include, ,Including Other Makefiles}).
-
-@item
-Deciding (based on the values of variables) whether to use or
-ignore a part of the makefile (@pxref{Conditionals, ,Conditional Parts of Makefiles}).
-
-@item
-Defining a variable from a verbatim string containing multiple lines
-(@pxref{Defining, ,Defining Variables Verbatim}).
-@end itemize
-
-@cindex comments, in makefile
-@cindex @code{#} (comments), in makefile
-@item
-@samp{#} in a line of a makefile starts a @dfn{comment}. It and the
-rest of the line are ignored, except that a trailing backslash not
-escaped by another backslash will continue the comment across multiple
-lines. A line containing just a comment (with perhaps spaces before
-it) is effectively blank, and is ignored. If you want a literal
-@code{#}, escape it with a backslash (e.g., @code{\#}). Comments may
-appear on any line in the makefile, although they are treated
-specially in certain situations.
-
-You cannot use comments within variable references or function calls:
-any instance of @code{#} will be treated literally (rather than as the
-start of a comment) inside a variable reference or function call.
-
-Comments within a recipe are passed to the shell, just as with any
-other recipe text. The shell decides how to interpret it: whether or
-not this is a comment is up to the shell.
-
-Within a @code{define} directive, comments are not ignored during the
-definition of the variable, but rather kept intact in the value of the
-variable. When the variable is expanded they will either be treated
-as @code{make} comments or as recipe text, depending on the context in
-which the variable is evaluated.
-@end itemize
-
-@node Makefile Names, Include, Makefile Contents, Makefiles
-@section What Name to Give Your Makefile
-@cindex makefile name
-@cindex name of makefile
-@cindex default makefile name
-@cindex file name of makefile
-
-@c following paragraph rewritten to avoid overfull hbox
-By default, when @code{make} looks for the makefile, it tries the
-following names, in order: @file{GNUmakefile}, @file{makefile}
-and @file{Makefile}.@refill
-@findex Makefile
-@findex GNUmakefile
-@findex makefile
-
-@cindex @code{README}
-Normally you should call your makefile either @file{makefile} or
-@file{Makefile}. (We recommend @file{Makefile} because it appears
-prominently near the beginning of a directory listing, right near other
-important files such as @file{README}.) The first name checked,
-@file{GNUmakefile}, is not recommended for most makefiles. You should
-use this name if you have a makefile that is specific to GNU
-@code{make}, and will not be understood by other versions of
-@code{make}. Other @code{make} programs look for @file{makefile} and
-@file{Makefile}, but not @file{GNUmakefile}.
-
-If @code{make} finds none of these 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. @xref{Implicit Rules, ,Using Implicit Rules}.
-
-@cindex @code{-f}
-@cindex @code{--file}
-@cindex @code{--makefile}
-If you want to use a nonstandard name for your makefile, you can specify
-the makefile name with the @samp{-f} or @samp{--file} option. The
-arguments @w{@samp{-f @var{name}}} or @w{@samp{--file=@var{name}}} tell
-@code{make} to read the file @var{name} as the makefile. If you use
-more than one @samp{-f} or @samp{--file} option, you can specify several
-makefiles. All the makefiles are effectively concatenated in the order
-specified. The default makefile names @file{GNUmakefile},
-@file{makefile} and @file{Makefile} are not checked automatically if you
-specify @samp{-f} or @samp{--file}.@refill
-@cindex specifying makefile name
-@cindex makefile name, how to specify
-@cindex name of makefile, how to specify
-@cindex file name of makefile, how to specify
-
-@node Include, MAKEFILES Variable, Makefile Names, Makefiles
-@section Including Other Makefiles
-@cindex including other makefiles
-@cindex makefile, including
-
-@findex include
-The @code{include} directive tells @code{make} to suspend reading the
-current makefile and read one or more other makefiles before continuing.
-The directive is a line in the makefile that looks like this:
-
-@example
-include @var{filenames}@dots{}
-@end example
-
-@noindent
-@var{filenames} can contain shell file name patterns. If
-@var{filenames} is empty, nothing is included and no error is printed.
-@cindex shell file name pattern (in @code{include})
-@cindex shell wildcards (in @code{include})
-@cindex wildcard, in @code{include}
-
-Extra spaces are allowed and ignored at the beginning of the line, but
-the first character must not be a tab (or the value of
-@code{.CMDPREFIX})---if the line begins with a tab, it will be
-considered a recipe line. Whitespace is required between
-@code{include} and the file names, and between file names; 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. If
-the file names contain any variable or function references, they are
-expanded. @xref{Using Variables, ,How to Use Variables}.
-
-For example, if you have three @file{.mk} files, @file{a.mk},
-@file{b.mk}, and @file{c.mk}, and @code{$(bar)} expands to
-@code{bish bash}, then the following expression
-
-@example
-include foo *.mk $(bar)
-@end example
-
-is equivalent to
-
-@example
-include foo a.mk b.mk c.mk bish bash
-@end example
-
-When @code{make} processes an @code{include} directive, it suspends
-reading of the containing makefile and reads from each listed file in
-turn. When that is finished, @code{make} resumes reading the
-makefile in which the directive appears.
-
-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, ,Setting Variables}) or pattern rules
-(@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}).
-
-Another such occasion is when you want to generate prerequisites from
-source files automatically; the prerequisites can be put in a file that
-is included by the main makefile. This practice is generally cleaner
-than that of somehow appending the prerequisites to the end of the main
-makefile as has been traditionally done with other versions of
-@code{make}. @xref{Automatic Prerequisites}.
-@cindex prerequisites, automatic generation
-@cindex automatic generation of prerequisites
-@cindex generating prerequisites automatically
-
-@cindex @code{-I}
-@cindex @code{--include-dir}
-@cindex included makefiles, default directories
-@cindex default directories for included makefiles
-@findex /usr/gnu/include
-@findex /usr/local/include
-@findex /usr/include
-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} or
-@samp{--include-dir} option are searched
-(@pxref{Options Summary, ,Summary of Options}).
-Then the following directories (if they exist)
-are searched, in this order:
-@file{@var{prefix}/include} (normally @file{/usr/local/include}
-@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if
-@var{prefix} has been defined to be the root of the DJGPP tree
-hierarchy.})
-@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 an immediately fatal error;
-processing of the makefile containing the @code{include} continues.
-Once it has finished reading makefiles, @code{make} will try to remake
-any that are out of date or don't exist.
-@xref{Remaking Makefiles, ,How Makefiles Are Remade}.
-Only after it has tried to find a way to remake a makefile and failed,
-will @code{make} diagnose the missing makefile as a fatal error.
-
-If you want @code{make} to simply ignore a makefile which does not exist
-and cannot be remade, with no error message, use the @w{@code{-include}}
-directive instead of @code{include}, like this:
-
-@example
--include @var{filenames}@dots{}
-@end example
-
-This acts like @code{include} in every way except that there is no
-error (not even a warning) if any of the @var{filenames} do not exist.
-For compatibility with some other @code{make} implementations,
-@code{sinclude} is another name for @w{@code{-include}}.
-
-@node MAKEFILES Variable, Remaking Makefiles, Include, Makefiles
-@section The Variable @code{MAKEFILES}
-@cindex makefile, and @code{MAKEFILES} variable
-@cindex including (@code{MAKEFILES} variable)
-
-@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 (@pxref{Include, ,Including Other Makefiles}). In addition, the
-default goal is never taken from one of these makefiles and it is not an
-error if the files listed in @code{MAKEFILES} are not found.@refill
-
-@cindex recursion, and @code{MAKEFILES} variable
-The main use of @code{MAKEFILES} is in communication between recursive
-invocations of @code{make} (@pxref{Recursion, ,Recursive Use of
-@code{make}}). It usually is not 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 (@pxref{Directory Search}).
-
-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. @xref{Include, , Including Other Makefiles}.
-
-@node Remaking Makefiles, Overriding Makefiles, MAKEFILES Variable, Makefiles
-@section How Makefiles Are Remade
-
-@cindex updating makefiles
-@cindex remaking makefiles
-@cindex makefile, remaking of
-Sometimes makefiles can be remade from other files, such as RCS or SCCS
-files. If a makefile can be remade from other files, you probably want
-@code{make} to get an up-to-date version of the makefile to read in.
-
-To this end, after reading in all makefiles, @code{make} will consider
-each as a goal target and attempt to update it. If a makefile has a
-rule which says how to update it (found either in that very makefile or
-in another one) or if an implicit rule applies to it (@pxref{Implicit
-Rules, ,Using Implicit Rules}), it will be updated if necessary. After
-all makefiles have been checked, if any have actually been changed,
-@code{make} starts with a clean slate and reads all the makefiles over
-again. (It will also attempt to update each of them over again, but
-normally this will not change them again, since they are already up to
-date.)@refill
-
-If you know that one or more of your makefiles cannot be remade and
-you want to keep @code{make} from performing an implicit rule search
-on them, perhaps for efficiency reasons, you can use any normal method
-of preventing implicit rule lookup to do so. For example, you can
-write an explicit rule with the makefile as the target, and an empty
-recipe (@pxref{Empty Recipes, ,Using Empty Recipes}).
-
-If the makefiles specify a double-colon rule to remake a file with
-a recipe but no prerequisites, that file will always be remade
-(@pxref{Double-Colon}). In the case of makefiles, a makefile that has a
-double-colon rule with a recipe but no prerequisites will be remade every
-time @code{make} is run, and then again after @code{make} starts over
-and reads the makefiles in again. This would cause an infinite loop:
-@code{make} would constantly remake the makefile, and never do anything
-else. So, to avoid this, @code{make} will @strong{not} attempt to
-remake makefiles which are specified as targets of a double-colon rule
-with a recipe but no prerequisites.@refill
-
-If you do not specify any makefiles to be read with @samp{-f} or
-@samp{--file} options, @code{make} will try the default makefile names;
-@pxref{Makefile Names, ,What Name to Give Your Makefile}. Unlike
-makefiles explicitly requested with @samp{-f} or @samp{--file} options,
-@code{make} is not certain that these makefiles should exist. However,
-if a default makefile does not exist but can be created by running
-@code{make} rules, you probably want the rules to be run so that the
-makefile can be used.
-
-Therefore, if none of the default makefiles exists, @code{make} will try
-to make each of them in the same order in which they are searched for
-(@pxref{Makefile Names, ,What Name to Give Your Makefile})
-until it succeeds in making one, or it runs out of names to try. Note
-that it is not an error if @code{make} cannot find or make any makefile;
-a makefile is not always necessary.@refill
-
-When you use the @samp{-t} or @samp{--touch} option
-(@pxref{Instead of Execution, ,Instead of Executing the Recipe}),
-you would not want to use an out-of-date makefile to decide which
-targets to touch. So the @samp{-t} option has no effect on updating
-makefiles; they are really updated even if @samp{-t} is specified.
-Likewise, @samp{-q} (or @samp{--question}) and @samp{-n} (or
-@samp{--just-print}) do not prevent updating of makefiles, because an
-out-of-date makefile would result in the wrong output for other targets.
-Thus, @samp{make -f mfile -n foo} will update @file{mfile}, read it in,
-and then print the recipe to update @file{foo} and its prerequisites
-without running it. The recipe printed for @file{foo} will be the one
-specified in the updated contents of @file{mfile}.
-
-However, on occasion you might actually wish to prevent updating of even
-the makefiles. You can do this by specifying the makefiles as goals in
-the command line as well as specifying them as makefiles. When the
-makefile name is specified explicitly as a goal, the options @samp{-t}
-and so on do apply to them.
-
-Thus, @samp{make -f mfile -n mfile foo} would read the makefile
-@file{mfile}, print the recipe needed to update it without actually
-running it, and then print the recipe needed to update @file{foo}
-without running that. The recipe for @file{foo} will be the one
-specified by the existing contents of @file{mfile}.
-
-@node Overriding Makefiles, Reading Makefiles, Remaking Makefiles, Makefiles
-@section Overriding Part of Another Makefile
-
-@cindex overriding makefiles
-@cindex makefile, overriding
-Sometimes it is useful to have a makefile that is mostly just like
-another makefile. You can often use the @samp{include} directive to
-include one in the other, and add more targets or variable definitions.
-However, it is illegal for two makefiles to give different recipes for
-the same target. But there is another way.
-
-@cindex match-anything rule, used to override
-In the containing makefile (the one that wants to include the other),
-you can use a match-anything pattern rule to say that to remake any
-target that cannot be made from the information in the containing
-makefile, @code{make} should look in another makefile.
-@xref{Pattern Rules}, for more information on pattern rules.
-
-For example, if you have a makefile called @file{Makefile} that says how
-to make the target @samp{foo} (and other targets), you can write a
-makefile called @file{GNUmakefile} that contains:
-
-@example
-foo:
- frobnicate > foo
-
-%: force
- @@$(MAKE) -f Makefile $@@
-force: ;
-@end example
-
-If you say @samp{make foo}, @code{make} will find @file{GNUmakefile},
-read it, and see that to make @file{foo}, it needs to run the recipe
-@samp{frobnicate > foo}. If you say @samp{make bar}, @code{make} will
-find no way to make @file{bar} in @file{GNUmakefile}, so it will use the
-recipe from the pattern rule: @samp{make -f Makefile bar}. If
-@file{Makefile} provides a rule for updating @file{bar}, @code{make}
-will apply the rule. And likewise for any other target that
-@file{GNUmakefile} does not say how to make.
-
-The way this works is that the pattern rule has a pattern of just
-@samp{%}, so it matches any target whatever. The rule specifies a
-prerequisite @file{force}, to guarantee that the recipe will be run even
-if the target file already exists. We give the @file{force} target an
-empty recipe to prevent @code{make} from searching for an implicit rule to
-build it---otherwise it would apply the same match-anything rule to
-@file{force} itself and create a prerequisite loop!
-
-@node Reading Makefiles, Secondary Expansion, Overriding Makefiles, Makefiles
-@section How @code{make} Reads a Makefile
-@cindex reading makefiles
-@cindex makefile, parsing
-
-GNU @code{make} does its work in two distinct phases. During the first
-phase it reads all the makefiles, included makefiles, etc. and
-internalizes all the variables and their values, implicit and explicit
-rules, and constructs a dependency graph of all the targets and their
-prerequisites. During the second phase, @code{make} uses these internal
-structures to determine what targets will need to be rebuilt and to
-invoke the rules necessary to do so.
-
-It's important to understand this two-phase approach because it has a
-direct impact on how variable and function expansion happens; this is
-often a source of some confusion when writing makefiles. Here we will
-present a summary of the phases in which expansion happens for different
-constructs within the makefile. We say that expansion is
-@dfn{immediate} if it happens during the first phase: in this case
-@code{make} will expand any variables or functions in that section of a
-construct as the makefile is parsed. We say that expansion is
-@dfn{deferred} if expansion is not performed immediately. Expansion of
-a deferred construct is not performed until either the construct appears
-later in an immediate context, or until the second phase.
-
-You may not be familiar with some of these constructs yet. You can
-reference this section as you become familiar with them, in later
-chapters.
-
-@subheading Variable Assignment
-@cindex +=, expansion
-@cindex =, expansion
-@cindex ?=, expansion
-@cindex +=, expansion
-@cindex define, expansion
-
-Variable definitions are parsed as follows:
-
-@example
-@var{immediate} = @var{deferred}
-@var{immediate} ?= @var{deferred}
-@var{immediate} := @var{immediate}
-@var{immediate} += @var{deferred} or @var{immediate}
-
-define @var{immediate}
- @var{deferred}
-endef
-@end example
-
-For the append operator, @samp{+=}, the right-hand side is considered
-immediate if the variable was previously set as a simple variable
-(@samp{:=}), and deferred otherwise.
-
-@subheading Conditional Directives
-@cindex ifdef, expansion
-@cindex ifeq, expansion
-@cindex ifndef, expansion
-@cindex ifneq, expansion
-
-Conditional directives are parsed immediately. This means, for
-example, that automatic variables cannot be used in conditional
-directives, as automatic variables are not set until the recipe for
-that rule is invoked. If you need to use automatic variables in a
-conditional directive you @emph{must} move the condition into the
-recipe and use shell conditional syntax instead.
-
-@subheading Rule Definition
-@cindex target, expansion
-@cindex prerequisite, expansion
-@cindex implicit rule, expansion
-@cindex pattern rule, expansion
-@cindex explicit rule, expansion
-
-A rule is always expanded the same way, regardless of the form:
-
-@example
-@var{immediate} : @var{immediate} ; @var{deferred}
- @var{deferred}
-@end example
-
-That is, the target and prerequisite sections are expanded immediately,
-and the recipe used to construct the target is always deferred. This
-general rule is true for explicit rules, pattern rules, suffix rules,
-static pattern rules, and simple prerequisite definitions.
-
-@node Secondary Expansion, , Reading Makefiles, Makefiles
-@section Secondary Expansion
-@cindex secondary expansion
-@cindex expansion, secondary
-
-@findex .SECONDEXPANSION
-In the previous section we learned that GNU @code{make} works in two
-distinct phases: a read-in phase and a target-update phase
-(@pxref{Reading Makefiles, , How @code{make} Reads a Makefile}). GNU
-make also has the ability to enable a @emph{second expansion} of the
-prerequisites (only) for some or all targets defined in the makefile.
-In order for this second expansion to occur, the special target
-@code{.SECONDEXPANSION} must be defined before the first prerequisite
-list that makes use of this feature.
-
-If that special target is defined then in between the two phases
-mentioned above, right at the end of the read-in phase, all the
-prerequisites of the targets defined after the special target are
-expanded a @emph{second time}. In most circumstances this secondary
-expansion will have no effect, since all variable and function
-references will have been expanded during the initial parsing of the
-makefiles. In order to take advantage of the secondary expansion
-phase of the parser, then, it's necessary to @emph{escape} the
-variable or function reference in the makefile. In this case the
-first expansion merely un-escapes the reference but doesn't expand it,
-and expansion is left to the secondary expansion phase. For example,
-consider this makefile:
-
-@example
-.SECONDEXPANSION:
-ONEVAR = onefile
-TWOVAR = twofile
-myfile: $(ONEVAR) $$(TWOVAR)
-@end example
-
-After the first expansion phase the prerequisites list of the
-@file{myfile} target will be @code{onefile} and @code{$(TWOVAR)}; the
-first (unescaped) variable reference to @var{ONEVAR} is expanded,
-while the second (escaped) variable reference is simply unescaped,
-without being recognized as a variable reference. Now during the
-secondary expansion the first word is expanded again but since it
-contains no variable or function references it remains the static
-value @file{onefile}, while the second word is now a normal reference
-to the variable @var{TWOVAR}, which is expanded to the value
-@file{twofile}. The final result is that there are two prerequisites,
-@file{onefile} and @file{twofile}.
-
-Obviously, this is not a very interesting case since the same result
-could more easily have been achieved simply by having both variables
-appear, unescaped, in the prerequisites list. One difference becomes
-apparent if the variables are reset; consider this example:
-
-@example
-.SECONDEXPANSION:
-AVAR = top
-onefile: $(AVAR)
-twofile: $$(AVAR)
-AVAR = bottom
-@end example
-
-Here the prerequisite of @file{onefile} will be expanded immediately,
-and resolve to the value @file{top}, while the prerequisite of
-@file{twofile} will not be full expanded until the secondary expansion
-and yield a value of @file{bottom}.
-
-This is marginally more exciting, but the true power of this feature
-only becomes apparent when you discover that secondary expansions
-always take place within the scope of the automatic variables for that
-target. This means that you can use variables such as @code{$@@},
-@code{$*}, etc. during the second expansion and they will have their
-expected values, just as in the recipe. All you have to do is defer
-the expansion by escaping the @code{$}. Also, secondary expansion
-occurs for both explicit and implicit (pattern) rules. Knowing this,
-the possible uses for this feature increase dramatically. For
-example:
-
-@example
-.SECONDEXPANSION:
-main_OBJS := main.o try.o test.o
-lib_OBJS := lib.o api.o
-
-main lib: $$($$@@_OBJS)
-@end example
-
-Here, after the initial expansion the prerequisites of both the
-@file{main} and @file{lib} targets will be @code{$($@@_OBJS)}. During
-the secondary expansion, the @code{$@@} variable is set to the name of
-the target and so the expansion for the @file{main} target will yield
-@code{$(main_OBJS)}, or @code{main.o try.o test.o}, while the
-secondary expansion for the @file{lib} target will yield
-@code{$(lib_OBJS)}, or @code{lib.o api.o}.
-
-You can also mix in functions here, as long as they are properly escaped:
-
-@example
-main_SRCS := main.c try.c test.c
-lib_SRCS := lib.c api.c
-
-.SECONDEXPANSION:
-main lib: $$(patsubst %.c,%.o,$$($$@@_SRCS))
-@end example
-
-This version allows users to specify source files rather than object
-files, but gives the same resulting prerequisites list as the previous
-example.
-
-Evaluation of automatic variables during the secondary expansion
-phase, especially of the target name variable @code{$$@@}, behaves
-similarly to evaluation within recipes. However, there are some
-subtle differences and ``corner cases'' which come into play for the
-different types of rule definitions that @code{make} understands. The
-subtleties of using the different automatic variables are described
-below.
-
-@subheading Secondary Expansion of Explicit Rules
-@cindex secondary expansion and explicit rules
-@cindex explicit rules, secondary expansion of
-
-During the secondary expansion of explicit rules, @code{$$@@} and
-@code{$$%} evaluate, respectively, to the file name of the target and,
-when the target is an archive member, the target member name. The
-@code{$$<} variable evaluates to the first prerequisite in the first
-rule for this target. @code{$$^} and @code{$$+} evaluate to the list
-of all prerequisites of rules @emph{that have already appeared} for
-the same target (@code{$$+} with repetitions and @code{$$^}
-without). The following example will help illustrate these behaviors:
-
-@example
-.SECONDEXPANSION:
-
-foo: foo.1 bar.1 $$< $$^ $$+ # line #1
-
-foo: foo.2 bar.2 $$< $$^ $$+ # line #2
-
-foo: foo.3 bar.3 $$< $$^ $$+ # line #3
-@end example
-
-In the first prerequisite list, all three variables (@code{$$<},
-@code{$$^}, and @code{$$+}) expand to the empty string. In the
-second, they will have values @code{foo.1}, @code{foo.1 bar.1}, and
-@code{foo.1 bar.1} respectively. In the third they will have values
-@code{foo.1}, @code{foo.1 bar.1 foo.2 bar.2}, and @code{foo.1 bar.1
-foo.2 bar.2 foo.1 foo.1 bar.1 foo.1 bar.1} respectively.
-
-Rules undergo secondary expansion in makefile order, except that
-the rule with the recipe is always evaluated last.
-
-The variables @code{$$?} and @code{$$*} are not available and expand
-to the empty string.
-
-@subheading Secondary Expansion of Static Pattern Rules
-@cindex secondary expansion and static pattern rules
-@cindex static pattern rules, secondary expansion of
-
-Rules for secondary expansion of static pattern rules are identical to
-those for explicit rules, above, with one exception: for static
-pattern rules the @code{$$*} variable is set to the pattern stem. As
-with explicit rules, @code{$$?} is not available and expands to the
-empty string.
-
-@subheading Secondary Expansion of Implicit Rules
-@cindex secondary expansion and implicit rules
-@cindex implicit rules, secondary expansion of
-
-As @code{make} searches for an implicit rule, it substitutes the stem
-and then performs secondary expansion for every rule with a matching
-target pattern. The value of the automatic variables is derived in
-the same fashion as for static pattern rules. As an example:
-
-@example
-.SECONDEXPANSION:
-
-foo: bar
-
-foo foz: fo%: bo%
-
-%oo: $$< $$^ $$+ $$*
-@end example
-
-When the implicit rule is tried for target @file{foo}, @code{$$<}
-expands to @file{bar}, @code{$$^} expands to @file{bar boo},
-@code{$$+} also expands to @file{bar boo}, and @code{$$*} expands to
-@file{f}.
-
-Note that the directory prefix (D), as described in @ref{Implicit Rule
-Search, ,Implicit Rule Search Algorithm}, is appended (after
-expansion) to all the patterns in the prerequisites list. As an
-example:
-
-@example
-.SECONDEXPANSION:
-
-/tmp/foo.o:
-
-%.o: $$(addsuffix /%.c,foo bar) foo.h
-@end example
-
-The prerequisite list after the secondary expansion and directory
-prefix reconstruction will be @file{/tmp/foo/foo.c /tmp/var/bar/foo.c
-foo.h}. If you are not interested in this reconstruction, you can use
-@code{$$*} instead of @code{%} in the prerequisites list.
-
-@node Rules, Recipes, Makefiles, Top
-@chapter Writing Rules
-@cindex writing rules
-@cindex rule, how to write
-@cindex target
-@cindex prerequisite
-
-A @dfn{rule} appears in the makefile and says when and how to remake
-certain files, called the rule's @dfn{targets} (most often only one per rule).
-It lists the other files that are the @dfn{prerequisites} of the target, and
-the @dfn{recipe} to use to create or update the target.
-
-@cindex default goal
-@cindex goal, default
-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 is the target of the first
-rule in the first makefile. If the first rule has multiple targets,
-only the first target is taken as the default. There are two
-exceptions: a target starting with a period is not a default unless it
-contains one or more slashes, @samp{/}, as well; and, a target that
-defines a pattern rule has no effect on the default goal.
-(@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.)
-
-Therefore, we usually write the makefile so that the first rule is the
-one for compiling the entire program or all the programs described by
-the makefile (often with a target called @samp{all}).
-@xref{Goals, ,Arguments to Specify the Goals}.
-
-@menu
-* Rule Example:: An example explained.
-* Rule Syntax:: General syntax explained.
-* Prerequisite Types:: There are two types of prerequisites.
-* Wildcards:: Using wildcard characters such as `*'.
-* Directory Search:: Searching other directories for source files.
-* Phony Targets:: Using a target that is not a real file's name.
-* Force Targets:: You can use a target without recipes
- or prerequisites to mark other targets
- as phony.
-* Empty Targets:: When only the date matters and the
- files are empty.
-* Special Targets:: Targets with special built-in meanings.
-* Multiple Targets:: When to make use of several targets in a rule.
-* Multiple Rules:: How to use several rules with the same target.
-* Static Pattern:: Static pattern rules apply to multiple targets
- and can vary the prerequisites according to
- the target name.
-* Double-Colon:: How to use a special kind of rule to allow
- several independent rules for one target.
-* Automatic Prerequisites:: How to automatically generate rules giving
- prerequisites from source files themselves.
-@end menu
-
-@ifnottex
-@node Rule Example, Rule Syntax, Rules, Rules
-@section 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 prerequisites are @file{foo.c} and
-@file{defs.h}. It has one command in the recipe: @samp{cc -c -g foo.c}.
-The recipe starts with a tab to identify it as a recipe.
-
-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 recipe 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 prerequisites.
-@end itemize
-@end ifnottex
-
-@node Rule Syntax, Prerequisite Types, Rule Example, Rules
-@section Rule Syntax
-
-@cindex rule syntax
-@cindex syntax of rules
-In general, a rule looks like this:
-
-@example
-@var{targets} : @var{prerequisites}
- @var{recipe}
- @dots{}
-@end example
-
-@noindent
-or like this:
-
-@example
-@var{targets} : @var{prerequisites} ; @var{recipe}
- @var{recipe}
- @dots{}
-@end example
-
-@cindex targets
-@cindex rule targets
-The @var{targets} are file names, separated by spaces. Wildcard
-characters may be used (@pxref{Wildcards, ,Using Wildcard Characters
-in File Names}) and a name of the form @file{@var{a}(@var{m})}
-represents member @var{m} in archive file @var{a}
-(@pxref{Archive Members, ,Archive Members as Targets}).
-Usually there is only one
-target per rule, but occasionally there is a reason to have more
-(@pxref{Multiple Targets, , Multiple Targets in a Rule}).@refill
-
-@cindex recipes
-@cindex tab character (in commands)
-The @var{recipe} lines start with a tab character (or the first
-character in the value of the @code{.CMDPREFIX} variable;
-@pxref{Special Variables}). The first recipe line may appear on the line
-after the prerequisites, with a tab character, or may appear on the
-same line, with a semicolon. Either way, the effect is the same.
-There are other differences in the syntax of recipes.
-@xref{Recipes, ,Writing Recipes in Rules}.
-
-@cindex dollar sign (@code{$}), in rules
-@cindex @code{$}, in rules
-@cindex rules, and @code{$}
-Because dollar signs are used to start @code{make} variable
-references, if you really want a dollar sign in a target or
-prerequisite you must write two of them, @samp{$$} (@pxref{Using
-Variables, ,How to Use Variables}). If you have enabled secondary
-expansion (@pxref{Secondary Expansion}) and you want a literal dollar
-sign in the prerequisites list, you must actually write @emph{four}
-dollar signs (@samp{$$$$}).
-
-You may split a long line by inserting a backslash followed by a
-newline, but this is not required, as @code{make} places no limit on
-the length of a line in a makefile.
-
-A rule tells @code{make} two things: when the targets are out of date,
-and how to update them when necessary.
-
-@cindex prerequisites
-@cindex rule prerequisites
-The criterion for being out of date is specified in terms of the
-@var{prerequisites}, which consist of file names separated by spaces.
-(Wildcards and archive members (@pxref{Archives}) are allowed here too.)
-A target is out of date if it does not exist or if it is older than any
-of the prerequisites (by comparison of last-modification times). The
-idea is that the contents of the target file are computed based on
-information in the prerequisites, so if any of the prerequisites changes,
-the contents of the existing target file are no longer necessarily
-valid.
-
-How to update is specified by a @var{recipe}. This is one or more
-lines to be executed by the shell (normally @samp{sh}), but with some
-extra features (@pxref{Recipes, ,Writing Recipes in Rules}).
-
-@node Prerequisite Types, Wildcards, Rule Syntax, Rules
-@comment node-name, next, previous, up
-@section Types of Prerequisites
-@cindex prerequisite types
-@cindex types of prerequisites
-
-@cindex prerequisites, normal
-@cindex normal prerequisites
-@cindex prerequisites, order-only
-@cindex order-only prerequisites
-There are actually two different types of prerequisites understood by
-GNU @code{make}: normal prerequisites such as described in the
-previous section, and @dfn{order-only} prerequisites. A normal
-prerequisite makes two statements: first, it imposes an order of
-execution of recipes: any recipes necessary to build any of a
-target's prerequisites will be fully executed before any recipe
-necessary to build the target. Second, it imposes a dependency
-relationship: if any prerequisite is newer than the target, then the
-target is considered out-of-date and must be rebuilt.
-
-Normally, this is exactly what you want: if a target's prerequisite is
-updated, then the target should also be updated.
-
-Occasionally, however, you have a situation where you want to impose a
-specific ordering on the rules to be invoked @emph{without} forcing
-the target to be updated if one of those rules is executed. In that
-case, you want to define @dfn{order-only} prerequisites. Order-only
-prerequisites can be specified by placing a pipe symbol (@code{|})
-in the prerequisites list: any prerequisites to the left of the pipe
-symbol are normal; any prerequisites to the right are order-only:
-
-@example
-@var{targets} : @var{normal-prerequisites} | @var{order-only-prerequisites}
-@end example
-
-The normal prerequisites section may of course be empty. Also, you
-may still declare multiple lines of prerequisites for the same target:
-they are appended appropriately (normal prerequisites are appended to
-the list of normal prerequisites; order-only prerequisites are
-appended to the list of order-only prerequisites). Note that if you
-declare the same file to be both a normal and an order-only
-prerequisite, the normal prerequisite takes precedence (since they
-have a strict superset of the behavior of an order-only prerequisite).
-
-Consider an example where your targets are to be placed in a separate
-directory, and that directory might not exist before @code{make} is
-run. In this situation, you want the directory to be created before
-any targets are placed into it but, because the timestamps on
-directories change whenever a file is added, removed, or renamed, we
-certainly don't want to rebuild all the targets whenever the
-directory's timestamp changes. One way to manage this is with
-order-only prerequisites: make the directory an order-only
-prerequisite on all the targets:
-
-@example
-OBJDIR := objdir
-OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
-
-$(OBJDIR)/%.o : %.c
- $(COMPILE.c) $(OUTPUT_OPTION) $<
-
-all: $(OBJS)
-
-$(OBJS): | $(OBJDIR)
-
-$(OBJDIR):
- mkdir $(OBJDIR)
-@end example
-
-Now the rule to create the @file{objdir} directory will be run, if
-needed, before any @samp{.o} is built, but no @samp{.o} will be built
-because the @file{objdir} directory timestamp changed.
-
-@node Wildcards, Directory Search, Prerequisite Types, Rules
-@section Using Wildcard Characters in File Names
-@cindex wildcard
-@cindex file name with wildcards
-@cindex globbing (wildcards)
-
-@cindex @code{*} (wildcard character)
-@cindex @code{?} (wildcard character)
-@cindex @code{[@dots{}]} (wildcard characters)
-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
-
-@cindex @code{~} (tilde)
-@cindex tilde (@code{~})
-@cindex home directory
-The character @samp{~} at the beginning of a file name also has special
-significance. If alone, or followed by a slash, it represents your home
-directory. For example @file{~/bin} expands to @file{/home/you/bin}.
-If the @samp{~} is followed by a word, the string represents the home
-directory of the user named by that word. For example @file{~john/bin}
-expands to @file{/home/john/bin}. On systems which don't have a home
-directory for each user (such as MS-DOS or MS-Windows), this
-functionality can be simulated by setting the environment variable
-@var{HOME}.@refill
-
-Wildcard expansion is performed by @code{make} automatically in
-targets and in prerequisites. In recipes, the shell is responsible
-for wildcard expansion. 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
-* Wildcard Examples:: Several examples
-* Wildcard Pitfall:: Problems to avoid.
-* Wildcard Function:: How to cause wildcard expansion where
- it does not normally take place.
-@end menu
-
-@node Wildcard Examples, Wildcard Pitfall, Wildcards, Wildcards
-@subsection Wildcard Examples
-
-Wildcards can be used in the recipe of a rule, where they are expanded
-by the shell. For example, here is a rule to delete all the object files:
-
-@example
-@group
-clean:
- rm -f *.o
-@end group
-@end example
-@cindex @code{rm} (shell command)
-
-Wildcards are also useful in the prerequisites 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
-
-@cindex @code{print} target
-@cindex @code{lpr} (shell command)
-@cindex @code{touch} (shell command)
-@noindent
-This rule uses @file{print} as an empty target file; see @ref{Empty
-Targets, ,Empty Target Files to Record Events}. (The automatic variable
-@samp{$?} is used to print only those files that have changed; see
-@ref{Automatic Variables}.)@refill
-
-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,
-prerequisite, or recipe, wildcard expansion will take place at that time.
-To set @code{objects} to the expansion, instead use:
-
-@example
-objects := $(wildcard *.o)
-@end example
-
-@noindent
-@xref{Wildcard Function}.
-
-@node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards
-@subsection Pitfalls of Using Wildcards
-@cindex wildcard pitfalls
-@cindex pitfalls of wildcards
-@cindex mistakes with wildcards
-@cindex errors with wildcards
-@cindex problems with 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 prerequisite of @file{foo} and will be recompiled if
-necessary.
-
-But what if you delete all the @samp{.o} files? When a wildcard matches
-no files, it is left as it is, so then @file{foo} will depend on the
-oddly-named file @file{*.o}. Since no such file is likely to exist,
-@code{make} will give you an error saying it cannot figure out how to
-make @file{*.o}. This is not what you want!
-
-Actually it is possible to obtain the desired result with wildcard
-expansion, but you need more sophisticated techniques, including the
-@code{wildcard} function and string substitution.
-@ifnottex
-@xref{Wildcard Function, ,The Function @code{wildcard}}.
-@end ifnottex
-@iftex
-These are described in the following section.
-@end iftex
-
-@cindex wildcards and MS-DOS/MS-Windows backslashes
-@cindex backslashes in pathnames and wildcard expansion
-
-Microsoft operating systems (MS-DOS and MS-Windows) use backslashes to
-separate directories in pathnames, like so:
-
-@example
- c:\foo\bar\baz.c
-@end example
-
-This is equivalent to the Unix-style @file{c:/foo/bar/baz.c} (the
-@file{c:} part is the so-called drive letter). When @code{make} runs on
-these systems, it supports backslashes as well as the Unix-style forward
-slashes in pathnames. However, this support does @emph{not} include the
-wildcard expansion, where backslash is a quote character. Therefore,
-you @emph{must} use Unix-style slashes in these cases.
-
-
-@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}@dots{})
-@end example
-
-@noindent
-This string, used anywhere in a makefile, is replaced by a
-space-separated list of names of existing files that match one of the
-given file name patterns. If no existing file name matches a pattern,
-then that pattern is omitted from the output of the @code{wildcard}
-function. Note that this is different from how unmatched wildcards
-behave in rules, where they are used verbatim rather than ignored
-(@pxref{Wildcard Pitfall}).
-
-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
-replacing the @samp{.c} suffix with @samp{.o} in the result, like this:
-
-@example
-$(patsubst %.c,%.o,$(wildcard *.c))
-@end example
-
-@noindent
-(Here we have used another function, @code{patsubst}.
-@xref{Text Functions, ,Functions for String Substitution and Analysis}.)@refill
-
-Thus, a makefile to compile all C source files in the directory and then
-link them together could be written as follows:
-
-@example
-objects := $(patsubst %.c,%.o,$(wildcard *.c))
-
-foo : $(objects)
- cc -o foo $(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.
-@xref{Flavors, ,The Two Flavors of Variables}, for an explanation of
-@samp{:=}, which is a variant of @samp{=}.)
-
-@node Directory Search, Phony Targets, Wildcards, Rules
-@section Searching Directories for Prerequisites
-@vindex VPATH
-@findex vpath
-@cindex vpath
-@cindex search path for prerequisites (@code{VPATH})
-@cindex directory search (@code{VPATH})
-
-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 prerequisite. When you redistribute the files
-among directories, you do not need to change the individual rules,
-just the search paths.
-
-@menu
-* General Search:: Specifying a search path that applies
- to every prerequisite.
-* Selective Search:: Specifying a search path
- for a specified class of names.
-* Search Algorithm:: When and how search paths are applied.
-* Recipes/Search:: How to write recipes 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 Prerequisites
-@vindex VPATH
-
-The value of the @code{make} variable @code{VPATH} specifies a list of
-directories that @code{make} should search. Most often, the
-directories are expected to contain prerequisite files that are not in the
-current directory; however, @code{make} uses @code{VPATH} as a search
-list for both prerequisites and targets of rules.
-
-Thus, if a file that is listed as a target or prerequisite does not exist
-in the current directory, @code{make} searches the directories listed in
-@code{VPATH} for a file with that name. If a file is found in one of
-them, that file may become the prerequisite (see below). Rules may then
-specify the names of files in the prerequisite list as if they all
-existed in the current directory. @xref{Recipes/Search, ,Writing Recipes with Directory Search}.
-
-In the @code{VPATH} variable, directory names are separated by colons or
-blanks. The order in which directories are listed is the order followed
-by @code{make} in its search. (On MS-DOS and MS-Windows, semi-colons
-are used as separators of directory names in @code{VPATH}, since the
-colon can be used in the pathname itself, after the drive letter.)
-
-For example,
-
-@example
-VPATH = src:../headers
-@end example
-
-@noindent
-specifies a path containing two directories, @file{src} and
-@file{../headers}, which @code{make} searches in that order.
-
-With this value of @code{VPATH}, the following rule,
-
-@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, Search Algorithm, General Search, Directory Search
-@subsection The @code{vpath} Directive
-@findex vpath
-
-Similar to the @code{VPATH} variable, but more selective, is the
-@code{vpath} directive (note lower case), which allows you to specify a
-search path for a particular class of file names: those that match a
-particular pattern. Thus you can supply certain search directories for
-one class of file names and other directories (or none) for other file
-names.
-
-There are three forms of the @code{vpath} directive:
-
-@table @code
-@item vpath @var{pattern} @var{directories}
-Specify the search path @var{directories} for file names that match
-@var{pattern}.
-
-The search path, @var{directories}, is a list of directories to be
-searched, separated by colons (semi-colons on MS-DOS and MS-Windows) or
-blanks, just like the search path used in the @code{VPATH} variable.
-
-@item vpath @var{pattern}
-Clear out the search path associated with @var{pattern}.
-
-@c Extra blank line makes sure this gets two lines.
-@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 file name of a prerequisite that is being searched
-for, the @samp{%} character matching any sequence of zero or more
-characters (as in pattern rules; @pxref{Pattern Rules, ,Defining and
-Redefining Pattern Rules}). For example, @code{%.h} matches files that
-end in @code{.h}. (If there is no @samp{%}, the pattern must match the
-prerequisite exactly, which is not useful very often.)
-
-@cindex @code{%}, quoting in @code{vpath}
-@cindex @code{%}, quoting with @code{\} (backslash)
-@cindex @code{\} (backslash), to quote @code{%}
-@cindex backslash (@code{\}), to quote @code{%}
-@cindex quoting @code{%}, in @code{vpath}
-@samp{%} characters in a @code{vpath} directive's pattern can be quoted
-with preceding backslashes (@samp{\}). Backslashes that would otherwise
-quote @samp{%} characters can be quoted with more backslashes.
-Backslashes that quote @samp{%} characters or other backslashes are
-removed from the pattern before it is compared to file names. Backslashes
-that are not in danger of quoting @samp{%} characters go unmolested.@refill
-
-When a prerequisite fails to exist in the current directory, if the
-@var{pattern} in a @code{vpath} directive matches the name of the
-prerequisite file, then the @var{directories} in that directive are searched
-just like (and before) the directories in the @code{VPATH} variable.
-
-For example,
-
-@example
-vpath %.h ../headers
-@end example
-
-@noindent
-tells @code{make} to look for any prerequisite whose name ends in @file{.h}
-in the directory @file{../headers} if the file is not found in the current
-directory.
-
-If several @code{vpath} patterns match the prerequisite file's name, then
-@code{make} processes each matching @code{vpath} directive one by one,
-searching all the directories mentioned in each directive. @code{make}
-handles multiple @code{vpath} directives in the order in which they
-appear in the makefile; multiple directives with the same pattern are
-independent of each other.
-
-@need 750
-Thus,
-
-@example
-@group
-vpath %.c foo
-vpath % blish
-vpath %.c bar
-@end group
-@end example
-
-@noindent
-will look for a file ending in @samp{.c} in @file{foo}, then
-@file{blish}, then @file{bar}, while
-
-@example
-@group
-vpath %.c foo:bar
-vpath % blish
-@end group
-@end example
-
-@noindent
-will look for a file ending in @samp{.c} in @file{foo}, then
-@file{bar}, then @file{blish}.
-
-@node Search Algorithm, Recipes/Search, Selective Search, Directory Search
-@subsection How Directory Searches are Performed
-@cindex algorithm for directory search
-@cindex directory search algorithm
-
-When a prerequisite is found through directory search, regardless of type
-(general or selective), the pathname located may not be the one that
-@code{make} actually provides you in the prerequisite list. Sometimes
-the path discovered through directory search is thrown away.
-
-The algorithm @code{make} uses to decide whether to keep or abandon a
-path found via directory search is as follows:
-
-@enumerate
-@item
-If a target file does not exist at the path specified in the makefile,
-directory search is performed.
-
-@item
-If the directory search is successful, that path is kept and this file
-is tentatively stored as the target.
-
-@item
-All prerequisites of this target are examined using this same method.
-
-@item
-After processing the prerequisites, the target may or may not need to be
-rebuilt:
-
-@enumerate a
-@item
-If the target does @emph{not} need to be rebuilt, the path to the file
-found during directory search is used for any prerequisite lists which
-contain this target. In short, if @code{make} doesn't need to rebuild
-the target then you use the path found via directory search.
-
-@item
-If the target @emph{does} need to be rebuilt (is out-of-date), the
-pathname found during directory search is @emph{thrown away}, and the
-target is rebuilt using the file name specified in the makefile. In
-short, if @code{make} must rebuild, then the target is rebuilt locally,
-not in the directory found via directory search.
-@end enumerate
-@end enumerate
-
-This algorithm may seem complex, but in practice it is quite often
-exactly what you want.
-
-@cindex traditional directory search (GPATH)
-@cindex directory search, traditional (GPATH)
-Other versions of @code{make} use a simpler algorithm: if the file does
-not exist, and it is found via directory search, then that pathname is
-always used whether or not the target needs to be built. Thus, if the
-target is rebuilt it is created at the pathname discovered during
-directory search.
-
-@vindex GPATH
-If, in fact, this is the behavior you want for some or all of your
-directories, you can use the @code{GPATH} variable to indicate this to
-@code{make}.
-
-@code{GPATH} has the same syntax and format as @code{VPATH} (that is, a
-space- or colon-delimited list of pathnames). If an out-of-date target
-is found by directory search in a directory that also appears in
-@code{GPATH}, then that pathname is not thrown away. The target is
-rebuilt using the expanded path.
-
-@node Recipes/Search, Implicit/Search, Search Algorithm, Directory Search
-@subsection Writing Recipes with Directory Search
-@cindex recipes, and directory search
-@cindex directory search (@code{VPATH}), and recipes
-
-When a prerequisite is found in another directory through directory search,
-this cannot change the recipe of the rule; they will execute as written.
-Therefore, you must write the recipe with care so that it will look for
-the prerequisite in the directory where @code{make} finds it.
-
-This is done with the @dfn{automatic variables} such as @samp{$^}
-(@pxref{Automatic Variables}).
-For instance, the value of @samp{$^} is a
-list of all the prerequisites of the rule, including the names of
-the directories in which they were found, and the value of
-@samp{$@@} is the target. Thus:@refill
-
-@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 rules; we use it here for consistency so it will
-affect all C compilations uniformly;
-@pxref{Implicit Variables, ,Variables Used by Implicit Rules}.)
-
-Often the prerequisites include header files as well, which you do not
-want to mention in the recipe. The automatic variable @samp{$<} is
-just the first prerequisite:
-
-@example
-VPATH = src:../headers
-foo.o : foo.c defs.h hack.h
- cc -c $(CFLAGS) $< -o $@@
-@end example
-
-@node Implicit/Search, Libraries/Search, Recipes/Search, Directory Search
-@subsection Directory Search and Implicit Rules
-@cindex @code{VPATH}, and implicit rules
-@cindex directory search (@code{VPATH}), and implicit rules
-@cindex search path for prerequisites (@code{VPATH}), and implicit rules
-@cindex implicit rule, and directory search
-@cindex implicit rule, and @code{VPATH}
-@cindex rule, implicit, and directory search
-@cindex rule, implicit, and @code{VPATH}
-
-The search through the directories specified in @code{VPATH} or with
-@code{vpath} also happens during consideration of implicit rules
-(@pxref{Implicit Rules, ,Using Implicit Rules}).
-
-For example, when a file @file{foo.o} has no explicit rule, @code{make}
-considers implicit rules, such as the built-in rule 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 applied.
-
-The recipes of 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
-@cindex link libraries, and directory search
-@cindex libraries for linking, directory search
-@cindex directory search (@code{VPATH}), and link libraries
-@cindex @code{VPATH}, and link libraries
-@cindex search path for prerequisites (@code{VPATH}), and link libraries
-@cindex @code{-l} (library search)
-@cindex link libraries, patterns matching
-@cindex @code{.LIBPATTERNS}, and link libraries
-@vindex .LIBPATTERNS
-
-Directory search applies in a special way to libraries used with the
-linker. This special feature comes into play when you write a prerequisite
-whose name is of the form @samp{-l@var{name}}. (You can tell something
-strange is going on here because the prerequisite is normally the name of a
-file, and the @emph{file name} of a library generally looks like
-@file{lib@var{name}.a}, not like @samp{-l@var{name}}.)@refill
-
-When a prerequisite's name has the form @samp{-l@var{name}}, @code{make}
-handles it specially by searching for the file @file{lib@var{name}.so} in
-the current directory, in directories specified by matching @code{vpath}
-search paths and the @code{VPATH} search path, and then in the
-directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib}
-(normally @file{/usr/local/lib}, but MS-DOS/MS-Windows versions of
-@code{make} behave as if @var{prefix} is defined to be the root of the
-DJGPP installation tree).
-
-If that file is not found, then the file @file{lib@var{name}.a} is
-searched for, in the same directories as above.
-
-For example, if there is a @file{/usr/lib/libcurses.a} library on your
-system (and no @file{/usr/lib/libcurses.so} file), then
-
-@example
-@group
-foo : foo.c -lcurses
- cc $^ -o $@@
-@end group
-@end example
-
-@noindent
-would cause the command @samp{cc foo.c /usr/lib/libcurses.a -o foo} to
-be executed when @file{foo} is older than @file{foo.c} or than
-@file{/usr/lib/libcurses.a}.@refill
-
-Although the default set of files to be searched for is
-@file{lib@var{name}.so} and @file{lib@var{name}.a}, this is customizable
-via the @code{.LIBPATTERNS} variable. Each word in the value of this
-variable is a pattern string. When a prerequisite like
-@samp{-l@var{name}} is seen, @code{make} will replace the percent in
-each pattern in the list with @var{name} and perform the above directory
-searches using that library filename. If no library is found, the next
-word in the list will be used.
-
-The default value for @code{.LIBPATTERNS} is @samp{lib%.so lib%.a},
-which provides the default behavior described above.
-
-You can turn off link library expansion completely by setting this
-variable to an empty value.
-
-@node Phony Targets, Force Targets, Directory Search, Rules
-@section Phony Targets
-@cindex phony targets
-@cindex targets, phony
-@cindex targets without a file
-
-A phony target is one that is not really the name of a file; rather it
-is just a name for a recipe to be executed when you make an explicit
-request. There are two reasons to use a phony target: to avoid a
-conflict with a file of the same name, and to improve performance.
-
-If you write a rule whose recipe will not create the target file, the
-recipe will be executed every time the target comes up for remaking.
-Here is an example:
-
-@example
-@group
-clean:
- rm *.o temp
-@end group
-@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}.
-@cindex @code{rm} (shell command)
-
-@findex .PHONY
-The phony target will cease to work if anything ever does create a file
-named @file{clean} in this directory. Since it has no prerequisites, the
-file @file{clean} would inevitably be considered up to date, and its
-recipe 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, ,Special Built-in Target Names}) as follows:
-
-@example
-.PHONY : clean
-@end example
-
-@noindent
-Once this is done, @samp{make clean} will run the recipe regardless of
-whether there is a file named @file{clean}.
-
-Since it knows that phony targets do not name actual files that could be
-remade from other files, @code{make} skips the implicit rule search for
-phony targets (@pxref{Implicit Rules}). This is why declaring a target
-phony is good for performance, even if you are not worried about the
-actual file existing.
-
-Thus, you first write the line that states that @code{clean} is a
-phony target, then you write the rule, like this:
-
-@example
-@group
-.PHONY: clean
-clean:
- rm *.o temp
-@end group
-@end example
-
-Another example of the usefulness of phony targets is in conjunction
-with recursive invocations of @code{make} (for more information, see
-@ref{Recursion, ,Recursive Use of @code{make}}). In this case the
-makefile will often contain a variable which lists a number of
-subdirectories to be built. One way to handle this is with one rule
-whose recipe is a shell loop over the subdirectories, like this:
-
-@example
-@group
-SUBDIRS = foo bar baz
-
-subdirs:
- for dir in $(SUBDIRS); do \
- $(MAKE) -C $$dir; \
- done
-@end group
-@end example
-
-There are problems with this method, however. First, any error
-detected in a submake is ignored by this rule, so it will continue
-to build the rest of the directories even when one fails. This can be
-overcome by adding shell commands to note the error and exit, but then
-it will do so even if @code{make} is invoked with the @code{-k}
-option, which is unfortunate. Second, and perhaps more importantly,
-you cannot take advantage of @code{make}'s ability to build targets in
-parallel (@pxref{Parallel, ,Parallel Execution}), since there is only
-one rule.
-
-By declaring the subdirectories as phony targets (you must do this as
-the subdirectory obviously always exists; otherwise it won't be built)
-you can remove these problems:
-
-@example
-@group
-SUBDIRS = foo bar baz
-
-.PHONY: subdirs $(SUBDIRS)
-
-subdirs: $(SUBDIRS)
-
-$(SUBDIRS):
- $(MAKE) -C $@@
-
-foo: baz
-@end group
-@end example
-
-Here we've also declared that the @file{foo} subdirectory cannot be
-built until after the @file{baz} subdirectory is complete; this kind of
-relationship declaration is particularly important when attempting
-parallel builds.
-
-A phony target should not be a prerequisite of a real target file; if it
-is, its recipe will be run every time @code{make} goes to update that
-file. As long as a phony target is never a prerequisite of a real
-target, the phony target recipe will be executed only when the phony
-target is a specified goal (@pxref{Goals, ,Arguments to Specify the
-Goals}).
-
-Phony targets can have prerequisites. 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 prerequisites, 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 just @samp{make} to remake all three programs, or
-specify as arguments the ones to remake (as in @samp{make prog1
-prog3}). Phoniness is not inherited: the prerequisites of a phony
-target are not themselves phony, unless explicitly declared to be so.
-
-When one phony target is a prerequisite 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
-.PHONY: cleanall cleanobj cleandiff
-
-cleanall : cleanobj cleandiff
- rm program
-
-cleanobj :
- rm *.o
-
-cleandiff :
- rm *.diff
-@end example
-
-@node Force Targets, Empty Targets, Phony Targets, Rules
-@section Rules without Recipes or Prerequisites
-@cindex force targets
-@cindex targets, force
-@cindex @code{FORCE}
-@cindex rule, no recipe or prerequisites
-
-If a rule has no prerequisites or recipe, and the target of the rule
-is a nonexistent file, then @code{make} imagines this target to have
-been updated whenever its rule is run. This implies that all targets
-depending on this one will always have their recipe run.
-
-An example will illustrate this:
-
-@example
-@group
-clean: FORCE
- rm $(objects)
-FORCE:
-@end group
-@end example
-
-Here the target @samp{FORCE} satisfies the special conditions, so the
-target @file{clean} that depends on it is forced to run its recipe.
-There is nothing special about the name @samp{FORCE}, but that is one
-name commonly used this way.
-
-As you can see, using @samp{FORCE} this way has the same results as using
-@samp{.PHONY: clean}.
-
-Using @samp{.PHONY} is more explicit and more efficient. However,
-other versions of @code{make} do not support @samp{.PHONY}; thus
-@samp{FORCE} appears in many makefiles. @xref{Phony Targets}.
-
-@node Empty Targets, Special Targets, Force Targets, Rules
-@section Empty Target Files to Record Events
-@cindex empty targets
-@cindex targets, empty
-@cindex recording events with empty targets
-
-The @dfn{empty target} is a variant of the phony target; it is used to hold
-recipes 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 recipe was last executed. It
-does so because one of the commands in the recipe is a @code{touch}
-command to update the target file.
-
-The empty target file should have some prerequisites (otherwise it
-doesn't make sense). When you ask to remake the empty target, the
-recipe is executed if any prerequisite is more recent than the target;
-in other words, if a prerequisite 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
-@cindex @code{print} target
-@cindex @code{lpr} (shell command)
-@cindex @code{touch} (shell command)
-
-@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 Variables}).
-
-@node Special Targets, Multiple Targets, Empty Targets, Rules
-@section Special Built-in Target Names
-@cindex special targets
-@cindex built-in special targets
-@cindex targets, built-in special
-
-Certain names have special meanings if they appear as targets.
-
-@table @code
-@findex .PHONY
-@item .PHONY
-
-The prerequisites 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 recipe unconditionally, regardless of
-whether a file with that name exists or what its last-modification
-time is. @xref{Phony Targets, ,Phony Targets}.
-
-@findex .SUFFIXES
-@item .SUFFIXES
-
-The prerequisites of the special target @code{.SUFFIXES} are the list
-of suffixes to be used in checking for suffix rules.
-@xref{Suffix Rules, , Old-Fashioned Suffix Rules}.
-
-@findex .DEFAULT
-@item .DEFAULT
-
-The recipe specified for @code{.DEFAULT} is used for any target for
-which no rules are found (either explicit rules or implicit rules).
-@xref{Last Resort}. If a @code{.DEFAULT} recipe is specified, every
-file mentioned as a prerequisite, but not as a target in a rule, will have
-that recipe executed on its behalf. @xref{Implicit Rule Search,
-,Implicit Rule Search Algorithm}.
-
-@findex .PRECIOUS
-@item .PRECIOUS
-@cindex precious targets
-@cindex preserving with @code{.PRECIOUS}
-
-The targets which @code{.PRECIOUS} depends on are given the following
-special treatment: if @code{make} is killed or interrupted during the
-execution of their recipes, the target is not deleted.
-@xref{Interrupts, ,Interrupting or Killing @code{make}}. Also, if the
-target is an intermediate file, it will not be deleted after it is no
-longer needed, as is normally done. @xref{Chained Rules, ,Chains of
-Implicit Rules}. In this latter respect it overlaps with the
-@code{.SECONDARY} special target.
-
-You can also list the target pattern of an implicit rule (such as
-@samp{%.o}) as a prerequisite file of the special target @code{.PRECIOUS}
-to preserve intermediate files created by rules whose target patterns
-match that file's name.
-
-@findex .INTERMEDIATE
-@item .INTERMEDIATE
-@cindex intermediate targets, explicit
-
-The targets which @code{.INTERMEDIATE} depends on are treated as
-intermediate files. @xref{Chained Rules, ,Chains of Implicit Rules}.
-@code{.INTERMEDIATE} with no prerequisites has no effect.
-
-@findex .SECONDARY
-@item .SECONDARY
-@cindex secondary targets
-@cindex preserving with @code{.SECONDARY}
-
-The targets which @code{.SECONDARY} depends on are treated as
-intermediate files, except that they are never automatically deleted.
-@xref{Chained Rules, ,Chains of Implicit Rules}.
-
-@code{.SECONDARY} with no prerequisites causes all targets to be treated
-as secondary (i.e., no target is removed because it is considered
-intermediate).
-
-@findex .SECONDEXPANSION
-@item .SECONDEXPANSION
-
-If @code{.SECONDEXPANSION} is mentioned as a target anywhere in the
-makefile, then all prerequisite lists defined @emph{after} it appears
-will be expanded a second time after all makefiles have been read in.
-@xref{Secondary Expansion, ,Secondary Expansion}.
-
-@findex .DELETE_ON_ERROR
-@item .DELETE_ON_ERROR
-@cindex removing targets on failure
-
-If @code{.DELETE_ON_ERROR} is mentioned as a target anywhere in the
-makefile, then @code{make} will delete the target of a rule if it has
-changed and its recipe exits with a nonzero exit status, just as it
-does when it receives a signal. @xref{Errors, ,Errors in Recipes}.
-
-@findex .IGNORE
-@item .IGNORE
-
-If you specify prerequisites for @code{.IGNORE}, then @code{make} will
-ignore errors in execution of the recipe for those particular files.
-The recipe for @code{.IGNORE} (if any) is ignored.
-
-If mentioned as a target with no prerequisites, @code{.IGNORE} says to
-ignore errors in execution of recipes for all files. This usage of
-@samp{.IGNORE} is supported only for historical compatibility. Since
-this affects every recipe in the makefile, it is not very useful; we
-recommend you use the more selective ways to ignore errors in specific
-recipes. @xref{Errors, ,Errors in Recipes}.
-
-@findex .LOW_RESOLUTION_TIME
-@item .LOW_RESOLUTION_TIME
-
-If you specify prerequisites for @code{.LOW_RESOLUTION_TIME},
-@command{make} assumes that these files are created by commands that
-generate low resolution time stamps. The recipe for the
-@code{.LOW_RESOLUTION_TIME} target are ignored.
-
-The high resolution file time stamps of many modern file systems
-lessen the chance of @command{make} incorrectly concluding that a file
-is up to date. Unfortunately, some hosts do not provide a way to set a
-high resolution file time stamp, so commands like @samp{cp -p} that
-explicitly set a file's time stamp must discard its subsecond part.
-If a file is created by such a command, you should list it as a
-prerequisite of @code{.LOW_RESOLUTION_TIME} so that @command{make}
-does not mistakenly conclude that the file is out of date. For
-example:
-
-@example
-@group
-.LOW_RESOLUTION_TIME: dst
-dst: src
- cp -p src dst
-@end group
-@end example
-
-Since @samp{cp -p} discards the subsecond part of @file{src}'s time
-stamp, @file{dst} is typically slightly older than @file{src} even when
-it is up to date. The @code{.LOW_RESOLUTION_TIME} line causes
-@command{make} to consider @file{dst} to be up to date if its time stamp
-is at the start of the same second that @file{src}'s time stamp is in.
-
-Due to a limitation of the archive format, archive member time stamps
-are always low resolution. You need not list archive members as
-prerequisites of @code{.LOW_RESOLUTION_TIME}, as @command{make} does this
-automatically.
-
-@findex .SILENT
-@item .SILENT
-
-If you specify prerequisites for @code{.SILENT}, then @code{make} will
-not print the recipe used to remake those particular files before
-executing them. The recipe for @code{.SILENT} is ignored.
-
-If mentioned as a target with no prerequisites, @code{.SILENT} says not
-to print any recipes before executing them. This usage of
-@samp{.SILENT} is supported only for historical compatibility. We
-recommend you use the more selective ways to silence specific recipes.
-@xref{Echoing, ,Recipe Echoing}. If you want to silence all recipes
-for a particular run of @code{make}, use the @samp{-s} or
-@w{@samp{--silent}} option (@pxref{Options Summary}).
-
-@findex .EXPORT_ALL_VARIABLES
-@item .EXPORT_ALL_VARIABLES
-
-Simply by being mentioned as a target, this tells @code{make} to
-export all variables to child processes by default.
-@xref{Variables/Recursion, ,Communicating Variables to a
-Sub-@code{make}}.
-
-@findex .NOTPARALLEL
-@item .NOTPARALLEL
-@cindex parallel execution, overriding
-
-If @code{.NOTPARALLEL} is mentioned as a target, then this invocation
-of @code{make} will be run serially, even if the @samp{-j} option is
-given. Any recursively invoked @code{make} command will still run
-recipes in parallel (unless its makefile also contains this target).
-Any prerequisites on this target are ignored.
-@end table
-
-Any defined implicit rule suffix also counts as a special target if it
-appears as a target, and so does the concatenation of two suffixes, such
-as @samp{.c.o}. These 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, ,Old-Fashioned Suffix Rules}.
-
-@node Multiple Targets, Multiple Rules, Special Targets, Rules
-@section Multiple Targets in a Rule
-@cindex multiple targets
-@cindex several targets in a rule
-@cindex targets, multiple
-@cindex rule, with multiple targets
-
-A rule with multiple targets is equivalent to writing many rules, each with
-one target, and all identical aside from that. The same recipe applies to
-all the targets, but its effect may vary because you can substitute the
-actual target name into the recipe using @samp{$@@}. The rule contributes
-the same prerequisites to all the targets also.
-
-This is useful in two cases.
-
-@itemize @bullet
-@item
-You want just prerequisites, no recipe. For example:
-
-@example
-kbd.o command.o files.o: command.h
-@end example
-
-@noindent
-gives an additional prerequisite to each of the three object files
-mentioned.
-
-@item
-Similar recipes work for all the targets. The recipes 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 Variables}). For example:
-
-@example
-@group
-bigoutput littleoutput : text.g
- generate text.g -$(subst output,,$@@) > $@@
-@end group
-@end example
-@findex subst
-
-@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}.
-@xref{Text Functions, ,Functions for String Substitution and Analysis},
-for an explanation of the @code{subst} function.
-@end itemize
-
-Suppose you would like to vary the prerequisites according to the
-target, much as the variable @samp{$@@} allows you to vary the recipe.
-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,
-,Static Pattern Rules}.
-
-@node Multiple Rules, Static Pattern, Multiple Targets, Rules
-@section Multiple Rules for One Target
-@cindex multiple rules for one target
-@cindex several rules for one target
-@cindex rule, multiple for one target
-@cindex target, multiple rules for one
-
-One file can be the target of several rules. All the prerequisites
-mentioned in all the rules are merged into one list of prerequisites for
-the target. If the target is older than any prerequisite from any rule,
-the recipe is executed.
-
-There can only be one recipe to be executed for a file. If more than
-one rule gives a recipe for the same file, @code{make} uses the last
-one given and prints an error message. (As a special case, if the
-file's name begins with a dot, no error message is printed. This odd
-behavior is only for compatibility with other implementations of
-@code{make}@dots{} you should avoid using it). Occasionally it is
-useful to have the same target invoke multiple recipes which are
-defined in different parts of your makefile; you can use
-@dfn{double-colon rules} (@pxref{Double-Colon}) for this.
-
-An extra rule with just prerequisites can be used to give a few extra
-prerequisites to many files at once. For example, makefiles often
-have a variable, such as @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 the following:
-
-@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
-specify how to make the object files, making it a convenient form to use if
-you wish to add the additional prerequisite intermittently.
-
-Another wrinkle is that the additional prerequisites could be
-specified with a variable that you set with a command line argument to
-@code{make} (@pxref{Overriding, ,Overriding Variables}). For example,
-
-@example
-@group
-extradeps=
-$(objects) : $(extradeps)
-@end group
-@end example
-
-@noindent
-means that the command @samp{make extradeps=foo.h} will consider
-@file{foo.h} as a prerequisite of each object file, but plain @samp{make}
-will not.
-
-If none of the explicit rules for a target has a recipe, then @code{make}
-searches for an applicable implicit rule to find one
-@pxref{Implicit Rules, ,Using Implicit Rules}).
-
-@node Static Pattern, Double-Colon, Multiple Rules, Rules
-@section Static Pattern Rules
-@cindex static pattern rule
-@cindex rule, static pattern
-@cindex pattern rules, static (not implicit)
-@cindex varying prerequisites
-@cindex prerequisites, varying (static pattern)
-
-@dfn{Static pattern rules} are rules which specify multiple targets and
-construct the prerequisite names for each target based on the target name.
-They are more general than ordinary rules with multiple targets because the
-targets do not have to have identical prerequisites. Their prerequisites must
-be @emph{analogous}, but not necessarily @emph{identical}.
-
-@menu
-* Static Usage:: The syntax of static pattern rules.
-* Static versus Implicit:: When are they better than implicit rules?
-@end menu
-
-@node Static Usage, Static versus Implicit, Static Pattern, Static Pattern
-@subsection Syntax of Static Pattern Rules
-@cindex static pattern rule, syntax of
-@cindex pattern rules, static, syntax of
-
-Here is the syntax of a static pattern rule:
-
-@example
-@var{targets} @dots{}: @var{target-pattern}: @var{prereq-patterns} @dots{}
- @var{recipe}
- @dots{}
-@end example
-
-@noindent
-The @var{targets} list specifies the targets that the rule applies to.
-The targets can contain wildcard characters, just like the targets of
-ordinary rules (@pxref{Wildcards, ,Using Wildcard Characters in File
-Names}).
-
-@cindex target pattern, static (not implicit)
-@cindex stem
-The @var{target-pattern} and @var{prereq-patterns} say how to compute the
-prerequisites 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{prereq-patterns}
-to make the prerequisite names (one from each @var{prereq-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} do not match that pattern.@refill
-
-@cindex prerequisite pattern, static (not implicit)
-The prerequisite names for each target are made by substituting the stem
-for the @samp{%} in each prerequisite pattern. For example, if one
-prerequisite pattern is @file{%.c}, then substitution of the stem
-@samp{foo} gives the prerequisite name @file{foo.c}. It is legitimate
-to write a prerequisite pattern that does not contain @samp{%}; then this
-prerequisite is the same for all targets.
-
-@cindex @code{%}, quoting in static pattern
-@cindex @code{%}, quoting with @code{\} (backslash)
-@cindex @code{\} (backslash), to quote @code{%}
-@cindex backslash (@code{\}), to quote @code{%}
-@cindex quoting @code{%}, in static pattern
-@samp{%} characters in pattern rules can be quoted with preceding
-backslashes (@samp{\}). Backslashes that would otherwise quote @samp{%}
-characters can be quoted with more backslashes. Backslashes that quote
-@samp{%} characters or other backslashes are removed from the pattern
-before it is compared to file names or has a stem substituted into it.
-Backslashes that are not in danger of quoting @samp{%} characters go
-unmolested. For example, the pattern @file{the\%weird\\%pattern\\} has
-@samp{the%weird\} preceding the operative @samp{%} character, and
-@samp{pattern\\} following it. The final two backslashes are left alone
-because they cannot affect any @samp{%} character.@refill
-
-Here is an example, which compiles each of @file{foo.o} and @file{bar.o}
-from the corresponding @file{.c} file:
-
-@example
-@group
-objects = foo.o bar.o
-
-all: $(objects)
-
-$(objects): %.o: %.c
- $(CC) -c $(CFLAGS) $< -o $@@
-@end group
-@end example
-
-@noindent
-Here @samp{$<} is the automatic variable that holds the name of the
-prerequisite and @samp{$@@} is the automatic variable that holds the name
-of the target; see @ref{Automatic Variables}.
-
-Each target specified must match the target pattern; a warning is issued
-for each target 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 file names (@pxref{Text Functions, ,Functions for String Substitution and Analysis}):
-
-@example
-files = foo.elc bar.o lose.o
-
-$(filter %.o,$(files)): %.o: %.c
- $(CC) -c $(CFLAGS) $< -o $@@
-$(filter %.elc,$(files)): %.elc: %.el
- emacs -f batch-byte-compile $<
-@end example
-
-@noindent
-In this example the result of @samp{$(filter %.o,$(files))} is
-@file{bar.o lose.o}, and the first static pattern rule causes each of
-these object files to be updated by compiling the corresponding C source
-file. The result of @w{@samp{$(filter %.elc,$(files))}} is
-@file{foo.elc}, so that file is made from @file{foo.el}.@refill
-
-Another example shows how to use @code{$*} in static pattern rules:
-@vindex $*@r{, and static pattern}
-
-@example
-@group
-bigoutput littleoutput : %output : text.g
- generate text.g -$* > $@@
-@end group
-@end example
-
-@noindent
-When the @code{generate} command is run, @code{$*} will expand to the
-stem, either @samp{big} or @samp{little}.
-
-@node Static versus Implicit, , Static Usage, Static Pattern
-@subsection Static Pattern Rules versus Implicit Rules
-@cindex rule, static pattern versus implicit
-@cindex static pattern rule, versus implicit
-
-A static pattern rule has much in common with an implicit rule defined as a
-pattern rule (@pxref{Pattern Rules, ,Defining and Redefining Pattern Rules}).
-Both have a pattern for the target and patterns for constructing the
-names of prerequisites. 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 recipe otherwise
-specified, and only when the prerequisites 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 recipes, 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 Double-Colon, Automatic Prerequisites, Static Pattern, Rules
-@section Double-Colon Rules
-@cindex double-colon rules
-@cindex rule, double-colon (@code{::})
-@cindex multiple rules for one target (@code{::})
-@cindex @code{::} rules (double-colon)
-
-@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 recipe
-is executed if the target is older than any prerequisites of that rule.
-If there are no prerequisites for that rule, its recipe is always
-executed (even if the target already exists). This can result in
-executing none, any, or all of the double-colon rules.
-
-Double-colon rules with the same target are in fact completely separate
-from one another. Each double-colon rule is processed individually, just
-as rules with different targets are processed.
-
-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 recipes would not matter.
-
-Double-colon rules are somewhat obscure and not often very useful; they
-provide a mechanism for cases in which the method used to update a target
-differs depending on which prerequisite files caused the update, and such
-cases are rare.
-
-Each double-colon rule should specify a recipe; if it does not, an
-implicit rule will be used if one applies.
-@xref{Implicit Rules, ,Using Implicit Rules}.
-
-@node Automatic Prerequisites, , Double-Colon, Rules
-@section Generating Prerequisites Automatically
-@cindex prerequisites, automatic generation
-@cindex automatic generation of prerequisites
-@cindex generating prerequisites automatically
-
-In the makefile for a program, many of the rules you need to write often
-say only that some object file depends on some header
-file. For example, if @file{main.c} uses @file{defs.h} via an
-@code{#include}, you would write:
-
-@example
-main.o: defs.h
-@end example
-
-@noindent
-You need this rule so that @code{make} knows that it must remake
-@file{main.o} whenever @file{defs.h} changes. You can see that for a
-large program you would have to write dozens of such rules in your
-makefile. And, you must always be very careful to update the makefile
-every time you add or remove an @code{#include}.
-@cindex @code{#include}
-
-@cindex @code{-M} (to compiler)
-To avoid this hassle, most modern C compilers can write these rules for
-you, by looking at the @code{#include} lines in the source files.
-Usually this is done with the @samp{-M} option to the compiler.
-For example, the command:
-
-@example
-cc -M main.c
-@end example
-
-@noindent
-generates the output:
-
-@example
-main.o : main.c defs.h
-@end example
-
-@noindent
-Thus you no longer have to write all those rules yourself.
-The compiler will do it for you.
-
-Note that such a prerequisite constitutes mentioning @file{main.o} in a
-makefile, so it can never be considered an intermediate file by implicit
-rule search. This means that @code{make} won't ever remove the file
-after using it; @pxref{Chained Rules, ,Chains of Implicit Rules}.
-
-@cindex @code{make depend}
-With old @code{make} programs, it was traditional practice to use this
-compiler feature to generate prerequisites on demand with a command like
-@samp{make depend}. That command would create a file @file{depend}
-containing all the automatically-generated prerequisites; then the
-makefile could use @code{include} to read them in (@pxref{Include}).
-
-In GNU @code{make}, the feature of remaking makefiles makes this
-practice obsolete---you need never tell @code{make} explicitly to
-regenerate the prerequisites, because it always regenerates any makefile
-that is out of date. @xref{Remaking Makefiles}.
-
-The practice we recommend for automatic prerequisite generation is to have
-one makefile corresponding to each source file. For each source file
-@file{@var{name}.c} there is a makefile @file{@var{name}.d} which lists
-what files the object file @file{@var{name}.o} depends on. That way
-only the source files that have changed need to be rescanned to produce
-the new prerequisites.
-
-Here is the pattern rule to generate a file of prerequisites (i.e., a makefile)
-called @file{@var{name}.d} from a C source file called @file{@var{name}.c}:
-
-@smallexample
-@group
-%.d: %.c
- @@set -e; rm -f $@@; \
- $(CC) -M $(CPPFLAGS) $< > $@@.$$$$; \
- sed 's,\($*\)\.o[ :]*,\1.o $@@ : ,g' < $@@.$$$$ > $@@; \
- rm -f $@@.$$$$
-@end group
-@end smallexample
-
-@noindent
-@xref{Pattern Rules}, for information on defining pattern rules. The
-@samp{-e} flag to the shell causes it to exit immediately if the
-@code{$(CC)} command (or any other command) fails (exits with a
-nonzero status).
-@cindex @code{-e} (shell flag)
-
-@cindex @code{-MM} (to GNU compiler)
-With the GNU C compiler, you may wish to use the @samp{-MM} flag instead
-of @samp{-M}. This omits prerequisites on system header files.
-@xref{Preprocessor Options, , Options Controlling the Preprocessor,
-gcc.info, Using GNU CC}, for details.
-
-@cindex @code{sed} (shell command)
-The purpose of the @code{sed} command is to translate (for example):
-
-@example
-main.o : main.c defs.h
-@end example
-
-@noindent
-into:
-
-@example
-main.o main.d : main.c defs.h
-@end example
-
-@noindent
-@cindex @code{.d}
-This makes each @samp{.d} file depend on all the source and header files
-that the corresponding @samp{.o} file depends on. @code{make} then
-knows it must regenerate the prerequisites whenever any of the source or
-header files changes.
-
-Once you've defined the rule to remake the @samp{.d} files,
-you then use the @code{include} directive to read them all in.
-@xref{Include}. For example:
-
-@example
-@group
-sources = foo.c bar.c
-
-include $(sources:.c=.d)
-@end group
-@end example
-
-@noindent
-(This example uses a substitution variable reference to translate the
-list of source files @samp{foo.c bar.c} into a list of prerequisite
-makefiles, @samp{foo.d bar.d}. @xref{Substitution Refs}, for full
-information on substitution references.) Since the @samp{.d} files are
-makefiles like any others, @code{make} will remake them as necessary
-with no further work from you. @xref{Remaking Makefiles}.
-
-Note that the @samp{.d} files contain target definitions; you should
-be sure to place the @code{include} directive @emph{after} the first,
-default goal in your makefiles or run the risk of having a random
-object file become the default goal.
-@xref{How Make Works}.
-
-@node Recipes, Using Variables, Rules, Top
-@chapter Writing Recipes in Rules
-@cindex recipes
-@cindex recipes, how to write
-@cindex writing recipes
-
-The recipe of a rule consists of one or more shell command lines to
-be executed, one at a time, in the order they appear. Typically, the
-result of executing these commands is that the target of the rule is
-brought up to date.
-
-Users use many different shell programs, but recipes in makefiles are
-always interpreted by @file{/bin/sh} unless the makefile specifies
-otherwise. @xref{Execution, ,Command Execution}.
-
-@menu
-* Recipe Syntax:: Recipe syntax features and pitfalls.
-* Echoing:: How to control when recipes are echoed.
-* Execution:: How recipes are executed.
-* Parallel:: How recipes can be executed in parallel.
-* Errors:: What happens after a recipe execution error.
-* Interrupts:: What happens when a recipe is interrupted.
-* Recursion:: Invoking @code{make} from makefiles.
-* Sequences:: Defining canned recipes.
-* Empty Recipes:: Defining useful, do-nothing recipes.
-@end menu
-
-@node Recipe Syntax, Echoing, Recipes, Recipes
-@section Recipe Syntax
-@cindex recipe syntax
-@cindex syntax of recipe
-
-Makefiles have the unusual property that there are really two distinct
-syntaxes in one file. Most of the makefile uses @code{make} syntax
-(@pxref{Makefiles, ,Writing Makefiles}). However, recipes are meant
-to be interpreted by the shell and so they are written using shell
-syntax. The @code{make} program does not try to understand shell
-syntax: it performs only a very few specific translations on the
-content of the recipe before handing it to the shell.
-
-Each line in the recipe must start with a tab (or the first character
-in the value of the @code{.CMDPREFIX} variable; @pxref{Special
-Variables}), except that the first recipe line may be attached to the
-target-and-prerequisites line with a semicolon in between. @emph{Any}
-line in the makefile that begins with a tab and appears in a ``rule
-context'' (that is, after a rule has been started until another rule
-or variable definition) will be considered part of a recipe for that
-rule. Blank lines and lines of just comments may appear among the
-recipe lines; they are ignored.
-
-Some consequences of these rules include:
-
-@itemize @bullet
-@item
-A blank line that begins with a tab is not blank: it's an empty
-recipe (@pxref{Empty Recipes}).
-
-@cindex comments, in recipes
-@cindex recipes, comments in
-@cindex @code{#} (comments), in recipes
-@item
-A comment in a recipe is not a @code{make} comment; it will be
-passed to the shell as-is. Whether the shell treats it as a comment
-or not depends on your shell.
-
-@item
-A variable definition in a ``rule context'' which is indented by a tab
-as the first character on the line, will be considered part of a
-recipe, not a @code{make} variable definition, and passed to the
-shell.
-
-@item
-A conditional expression (@code{ifdef}, @code{ifeq},
-etc. @pxref{Conditional Syntax, ,Syntax of Conditionals}) in a ``rule
-context'' which is indented by a tab as the first character on the
-line, will be considered part of a recipe and be passed to the shell.
-
-@end itemize
-
-@menu
-* Splitting Lines:: Breaking long recipe lines for readability.
-* Variables in Recipes:: Using @code{make} variables in recipes.
-@end menu
-
-@node Splitting Lines, Variables in Recipes, Recipe Syntax, Recipe Syntax
-@subsection Splitting Recipe Lines
-@cindex recipes, splitting
-@cindex splitting recipes
-@cindex recipes, backslash (@code{\}) in
-@cindex recipes, quoting newlines in
-@cindex backslash (@code{\}), in recipes
-@cindex @code{\} (backslash), in recipes
-@cindex quoting newline, in recipes
-@cindex newline, quoting, in recipes
-
-One of the few ways in which @code{make} does interpret recipes is
-checking for a backslash just before the newline. As in normal
-makefile syntax, a single logical recipe line can be split into
-multiple physical lines in the makefile by placing a backslash before
-each newline. A sequence of lines like this is considered a single
-recipe line, and one instance of the shell will be invoked to run it.
-
-However, in contrast to how they are treated in other places in a
-makefile, backslash-newline pairs are @emph{not} removed from the
-recipe. Both the backslash and the newline characters are preserved
-and passed to the shell. How the backslash-newline is interpreted
-depends on your shell. If the first character of the next line after
-the backslash-newline is the recipe prefix character (a tab by
-default; @pxref{Special Variables}), then that character (and only
-that character) is removed. Whitespace is never added to the recipe.
-
-For example, the recipe for the all target in this makefile:
-
-@example
-@group
-all :
- @@echo no\
-space
- @@echo no\
- space
- @@echo one \
- space
- @@echo one\
- space
-@end group
-@end example
-
-@noindent
-consists of four separate shell commands where the output is:
-
-@example
-@group
-nospace
-nospace
-one space
-one space
-@end group
-@end example
-
-As a more complex example, this makefile:
-
-@example
-@group
-all : ; @@echo 'hello \
- world' ; echo "hello \
- world"
-@end group
-@end example
-
-@noindent
-will invoke one shell with a command of:
-
-@example
-@group
-echo 'hello \
-world' ; echo "hello \
- world"
-@end group
-@end example
-
-@noindent
-which, according to shell quoting rules, will yield the following output:
-
-@example
-@group
-hello \
-world
-hello world
-@end group
-@end example
-
-@noindent
-Notice how the backslash/newline pair was removed inside the string
-quoted with double quotes (@code{"@dots{}"}), but not from the string
-quoted with single quotes (@code{'@dots{}'}). This is the way the
-default shell (@file{/bin/sh}) handles backslash/newline pairs. If
-you specify a different shell in your makefiles it may treat them
-differently.
-
-Sometimes you want to split a long line inside of single quotes, but
-you don't want the backslash-newline to appear in the quoted content.
-This is often the case when passing scripts to languages such as Perl,
-where extraneous backslashes inside the script can change its meaning
-or even be a syntax error. One simple way of handling this is to
-place the quoted string, or even the entire command, into a
-@code{make} variable then use the variable in the recipe. In this
-situation the newline quoting rules for makefiles will be used, and
-the backslash-newline will be removed. If we rewrite our example
-above using this method:
-
-@example
-@group
-HELLO = 'hello \
-world'
-
-all : ; @@echo $(HELLO)
-@end group
-@end example
-
-@noindent
-we will get output like this:
-
-@example
-@group
-hello world
-@end group
-@end example
-
-If you like, you can also use target-specific variables
-(@pxref{Target-specific, ,Target-specific Variable Values}) to obtain
-a tighter correspondence between the variable and the recipe that
-uses it.
-
-@node Variables in Recipes, , Splitting Lines, Recipe Syntax
-@subsection Using Variables in Recipes
-@cindex variable references in recipes
-@cindex recipes, using variables in
-
-The other way in which @code{make} processes recipes is by expanding
-any variable references in them (@pxref{Reference,Basics of Variable
-References}). This occurs after make has finished reading all the
-makefiles and the target is determined to be out of date; so, the
-recipes for targets which are not rebuilt are never expanded.
-
-Variable and function references in recipes have identical syntax and
-semantics to references elsewhere in the makefile. They also have the
-same quoting rules: if you want a dollar sign to appear in your
-recipe, you must double it (@samp{$$}). For shells like the default
-shell, that use dollar signs to introduce variables, it's important to
-keep clear in your mind whether the variable you want to reference is
-a @code{make} variable (use a single dollar sign) or a shell variable
-(use two dollar signs). For example:
-
-@example
-@group
-LIST = one two three
-all:
- for i in $(LIST); do \
- echo $$i; \
- done
-@end group
-@end example
-
-@noindent
-results in the following command being passed to the shell:
-
-@example
-@group
-for i in one two three; do \
- echo $i; \
-done
-@end group
-@end example
-
-@noindent
-which generates the expected result:
-
-@example
-@group
-one
-two
-three
-@end group
-@end example
-
-@node Echoing, Execution, Recipe Syntax, Recipes
-@section Recipe Echoing
-@cindex echoing of recipes
-@cindex silent operation
-@cindex @code{@@} (in recipes)
-@cindex recipes, echoing
-@cindex printing of recipes
-
-Normally @code{make} prints each line of the recipe before it is
-executed. We call this @dfn{echoing} because it gives the appearance
-that you are typing the lines yourself.
-
-When a line starts with @samp{@@}, the echoing of that line is suppressed.
-The @samp{@@} is discarded before the line 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 to indicate progress through
-the makefile:
-
-@example
-@@echo About to make distribution files
-@end example
-
-@cindex @code{-n}
-@cindex @code{--just-print}
-@cindex @code{--dry-run}
-@cindex @code{--recon}
-When @code{make} is given the flag @samp{-n} or @samp{--just-print}
-it only echoes recipes, it won't execute them. @xref{Options Summary,
-,Summary of Options}. In this case and only this case, even the
-recipe lines starting with @samp{@@} are printed. This flag is useful for
-finding out which recipes @code{make} thinks are necessary without
-actually doing them.
-
-@cindex @code{-s}
-@cindex @code{--silent}
-@cindex @code{--quiet}
-@findex .SILENT
-The @samp{-s} or @samp{--silent}
-flag to @code{make} prevents all echoing, as if all recipes
-started with @samp{@@}. A rule in the makefile for the special target
-@code{.SILENT} without prerequisites has the same effect
-(@pxref{Special Targets, ,Special Built-in Target Names}).
-@code{.SILENT} is essentially obsolete since @samp{@@} is more flexible.@refill
-
-@node Execution, Parallel, Echoing, Recipes
-@section Recipe Execution
-@cindex recipe, execution
-@cindex execution, of recipes
-@vindex @code{SHELL} @r{(recipe execution)}
-
-When it is time to execute recipes to update a target, they are
-executed by invoking a new subshell for each line of the recipe. (In
-practice, @code{make} may take shortcuts that do not affect the
-results.)
-
-@cindex @code{cd} (shell command)
-@cindex shell variables, setting in recipes
-@cindex recipes setting shell variables
-@strong{Please note:} this implies that setting shell variables and
-invoking shell commands such as @code{cd} that set a context local to
-each process will not affect the following lines in the recipe.@footnote{On
-MS-DOS, the value of current working directory is @strong{global}, so
-changing it @emph{will} affect the following recipe lines on those
-systems.} If you want to use @code{cd} to affect the next statement,
-put both statements in a single recipe line. Then @code{make} will
-invoke one shell to run the entire line, and the shell will execute
-the statements in sequence. For example:
-
-@example
-foo : bar/lose
- cd $(@@D) && gobble $(@@F) > ../$@@
-@end example
-
-@noindent
-Here we use the shell AND operator (@code{&&}) so that if the
-@code{cd} command fails, the script will fail without trying to invoke
-the @code{gobble} command in the wrong directory, which could cause
-problems (in this case it would certainly cause @file{../foo} to be
-truncated, at least).
-
-@menu
-* Choosing the Shell:: How @code{make} chooses the shell used
- to run recipes.
-@end menu
-
-@node Choosing the Shell, , Execution, Execution
-@subsection Choosing the Shell
-@cindex shell, choosing the
-@cindex @code{SHELL}, value of
-
-@vindex SHELL
-The program used as the shell is taken from the variable @code{SHELL}.
-If this variable is not set in your makefile, the program
-@file{/bin/sh} is used as the shell.
-
-@cindex environment, @code{SHELL} in
-Unlike most variables, the variable @code{SHELL} is never set from the
-environment. This is because the @code{SHELL} environment variable 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, ,Variables from the
-Environment}.
-
-Furthermore, when you do set @code{SHELL} in your makefile that value
-is @emph{not} exported in the environment to recipe lines that
-@code{make} invokes. Instead, the value inherited from the user's
-environment, if any, is exported. You can override this behavior by
-explicitly exporting @code{SHELL} (@pxref{Variables/Recursion,
-,Communicating Variables to a Sub-@code{make}}), forcing it to be
-passed in the environment to recipe lines.
-
-@vindex @code{MAKESHELL} @r{(MS-DOS alternative to @code{SHELL})}
-However, on MS-DOS and MS-Windows the value of @code{SHELL} in the
-environment @strong{is} used, since on those systems most users do not
-set this variable, and therefore it is most likely set specifically to
-be used by @code{make}. On MS-DOS, if the setting of @code{SHELL} is
-not suitable for @code{make}, you can set the variable
-@code{MAKESHELL} to the shell that @code{make} should use; if set it
-will be used as the shell instead of the value of @code{SHELL}.
-
-@subsubheading Choosing a Shell in DOS and Windows
-@cindex shell, in DOS and Windows
-@cindex DOS, choosing a shell in
-@cindex Windows, choosing a shell in
-
-Choosing a shell in MS-DOS and MS-Windows is much more complex than on
-other systems.
-
-@vindex COMSPEC
-On MS-DOS, if @code{SHELL} is not set, the value of the variable
-@code{COMSPEC} (which is always set) is used instead.
-
-@cindex @code{SHELL}, MS-DOS specifics
-The processing of lines that set the variable @code{SHELL} in Makefiles
-is different on MS-DOS. The stock shell, @file{command.com}, is
-ridiculously limited in its functionality and many users of @code{make}
-tend to install a replacement shell. Therefore, on MS-DOS, @code{make}
-examines the value of @code{SHELL}, and changes its behavior based on
-whether it points to a Unix-style or DOS-style shell. This allows
-reasonable functionality even if @code{SHELL} points to
-@file{command.com}.
-
-If @code{SHELL} points to a Unix-style shell, @code{make} on MS-DOS
-additionally checks whether that shell can indeed be found; if not, it
-ignores the line that sets @code{SHELL}. In MS-DOS, GNU @code{make}
-searches for the shell in the following places:
-
-@enumerate
-@item
-In the precise place pointed to by the value of @code{SHELL}. For
-example, if the makefile specifies @samp{SHELL = /bin/sh}, @code{make}
-will look in the directory @file{/bin} on the current drive.
-
-@item
-In the current directory.
-
-@item
-In each of the directories in the @code{PATH} variable, in order.
-
-@end enumerate
-
-In every directory it examines, @code{make} will first look for the
-specific file (@file{sh} in the example above). If this is not found,
-it will also look in that directory for that file with one of the known
-extensions which identify executable files. For example @file{.exe},
-@file{.com}, @file{.bat}, @file{.btm}, @file{.sh}, and some others.
-
-If any of these attempts is successful, the value of @code{SHELL} will
-be set to the full pathname of the shell as found. However, if none of
-these is found, the value of @code{SHELL} will not be changed, and thus
-the line that sets it will be effectively ignored. This is so
-@code{make} will only support features specific to a Unix-style shell if
-such a shell is actually installed on the system where @code{make} runs.
-
-Note that this extended search for the shell is limited to the cases
-where @code{SHELL} is set from the Makefile; if it is set in the
-environment or command line, you are expected to set it to the full
-pathname of the shell, exactly as things are on Unix.
-
-The effect of the above DOS-specific processing is that a Makefile that
-contains @samp{SHELL = /bin/sh} (as many Unix makefiles do), will work
-on MS-DOS unaltered if you have e.g.@: @file{sh.exe} installed in some
-directory along your @code{PATH}.
-
-@node Parallel, Errors, Execution, Recipes
-@section Parallel Execution
-@cindex recipes, execution in parallel
-@cindex parallel execution
-@cindex execution, in parallel
-@cindex job slots
-@cindex @code{-j}
-@cindex @code{--jobs}
-
-GNU @code{make} knows how to execute several recipes at once.
-Normally, @code{make} will execute only one recipe at a time, waiting
-for it to finish before executing the next. However, the @samp{-j} or
-@samp{--jobs} option tells @code{make} to execute many recipes
-simultaneously. You can inhibit parallelism in a particular makefile
-with the @code{.NOTPARALLEL} pseudo-target (@pxref{Special
-Targets,Special Built-in Target Names}).@refill
-
-On MS-DOS, the @samp{-j} option has no effect, since that system doesn't
-support multi-processing.
-
-If the @samp{-j} option is followed by an integer, this is the number of
-recipes to execute at once; this is called the number of @dfn{job slots}.
-If there is nothing looking like an integer after the @samp{-j} option,
-there is no limit on the number of job slots. The default number of job
-slots is one, which means serial execution (one thing at a time).
-
-One unpleasant consequence of running several recipes simultaneously is
-that output generated by the recipes appears whenever each recipe
-sends it, so messages from different recipes may be interspersed.
-
-Another problem is that two processes cannot both take input from the
-same device; so to make sure that only one recipe tries to take input
-from the terminal at once, @code{make} will invalidate the standard
-input streams of all but one running recipe. This means that
-attempting to read from standard input will usually be a fatal error (a
-@samp{Broken pipe} signal) for most child processes if there are
-several.
-@cindex broken pipe
-@cindex standard input
-
-It is unpredictable which recipe will have a valid standard input stream
-(which will come from the terminal, or wherever you redirect the standard
-input of @code{make}). The first recipe run will always get it first, and
-the first recipe started after that one finishes will get it next, and so
-on.
-
-We will change how this aspect of @code{make} works if we find a better
-alternative. In the mean time, you should not rely on any recipe using
-standard input at all if you are using the parallel execution feature; but
-if you are not using this feature, then standard input works normally in
-all recipes.
-
-Finally, handling recursive @code{make} invocations raises issues. For
-more information on this, see
-@ref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}.
-
-If a recipe fails (is killed by a signal or exits with a nonzero
-status), and errors are not ignored for that recipe
-(@pxref{Errors, ,Errors in Recipes}),
-the remaining recipe lines to remake the same target will not be run.
-If a recipe fails and the @samp{-k} or @samp{--keep-going}
-option was not given
-(@pxref{Options Summary, ,Summary of Options}),
-@code{make} aborts execution. If make
-terminates for any reason (including a signal) with child processes
-running, it waits for them to finish before actually exiting.@refill
-
-@cindex load average
-@cindex limiting jobs based on load
-@cindex jobs, limiting based on load
-@cindex @code{-l} (load average)
-@cindex @code{--max-load}
-@cindex @code{--load-average}
-When the system is heavily loaded, you will probably want to run fewer jobs
-than when it is lightly loaded. You can use the @samp{-l} option to tell
-@code{make} to limit the number of jobs to run at once, based on the load
-average. The @samp{-l} or @samp{--max-load}
-option is followed by a floating-point number. For
-example,
-
-@example
--l 2.5
-@end example
-
-@noindent
-will not let @code{make} start more than one job if the load average is
-above 2.5. The @samp{-l} option with no following number removes the
-load limit, if one was given with a previous @samp{-l} option.@refill
-
-More precisely, when @code{make} goes to start up a job, and it already has
-at least one job running, it checks the current load average; if it is not
-lower than the limit given with @samp{-l}, @code{make} waits until the load
-average goes below that limit, or until all the other jobs finish.
-
-By default, there is no load limit.
-
-@node Errors, Interrupts, Parallel, Recipes
-@section Errors in Recipes
-@cindex errors (in recipes)
-@cindex recipes, errors in
-@cindex exit status (errors)
-
-After each shell invocation returns, @code{make} looks at its exit
-status. If the shell completed successfully (the exit status is
-zero), the next line in the recipe is executed in a new shell; after
-the last line is finished, 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 the failure of a certain recipe line does not indicate a problem.
-For example, you may use the @code{mkdir} command to ensure 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 @code{-} (in recipes)
-To ignore errors in a recipe line, write a @samp{-} at the beginning
-of the line's text (after the initial tab). The @samp{-} is discarded
-before the line is passed to the shell for execution.
-
-For example,
-
-@example
-@group
-clean:
- -rm -f *.o
-@end group
-@end example
-@cindex @code{rm} (shell command)
-
-@noindent
-This causes @code{make} to continue even if @code{rm} is unable to
-remove a file.
-
-@cindex @code{-i}
-@cindex @code{--ignore-errors}
-@findex .IGNORE
-When you run @code{make} with the @samp{-i} or @samp{--ignore-errors}
-flag, errors are ignored in all recipes of all rules. A rule in the
-makefile for the special target @code{.IGNORE} has the same effect, if
-there are no prerequisites. These ways of ignoring errors are obsolete
-because @samp{-} is more flexible.
-
-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,
-except that it prints out a message that tells you the status code
-the shell exited with, and says that the error has been ignored.
-
-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
-recipes will be executed for these targets, since their preconditions
-have not been achieved.
-
-
-@cindex @code{-k}
-@cindex @code{--keep-going}
-Normally @code{make} gives up immediately in this circumstance, returning a
-nonzero status. However, if the @samp{-k} or @samp{--keep-going}
-flag is specified, @code{make}
-continues to consider the other prerequisites 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 Summary, ,Summary of 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. The @samp{-k} option says
-that the real purpose is to test as many of the changes made in the
-program as possible, perhaps to find several independent problems so
-that you can correct them all before the next attempt to compile. This
-is why Emacs' @code{compile} command passes the @samp{-k} flag by
-default.
-@cindex Emacs (@code{M-x compile})
-
-@findex .DELETE_ON_ERROR
-@cindex deletion of target files
-@cindex removal of target files
-@cindex target, deleting on error
-Usually when a recipe line fails, if it has changed the target file at all,
-the file is corrupted and cannot be used---or at least it is not
-completely updated. Yet the file's time stamp says that it is now up to
-date, so the next time @code{make} runs, it will not try to update that
-file. The situation is just the same as when the shell is killed by a
-signal; @pxref{Interrupts}. So generally the right thing to do is to
-delete the target file if the recipe fails after beginning to change
-the file. @code{make} will do this if @code{.DELETE_ON_ERROR} appears
-as a target. This is almost always what you want @code{make} to do, but
-it is not historical practice; so for compatibility, you must explicitly
-request it.
-
-@node Interrupts, Recursion, Errors, Recipes
-@section Interrupting or Killing @code{make}
-@cindex interrupt
-@cindex signal
-@cindex deletion of target files
-@cindex removal of target files
-@cindex target, deleting on interrupt
-@cindex killing (interruption)
-
-If @code{make} gets a fatal signal while a shell is executing, it may
-delete the target file that the recipe was supposed to update. This is
-done if the target file's last-modification time 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. Why is this? Suppose you type
-@kbd{Ctrl-c} while a compiler is running, and it has begun to write an
-object file @file{foo.o}. The @kbd{Ctrl-c} kills the compiler, resulting
-in an incomplete file whose last-modification time is newer than the source
-file @file{foo.c}. But @code{make} also receives the @kbd{Ctrl-c} signal
-and deletes this incomplete file. If @code{make} did not do this, the next
-invocation of @code{make} would think that @file{foo.o} did not require
-updating---resulting in a strange error message from the linker when it
-tries to link an object file half of which is missing.
-
-@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 prerequisites 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
-modification-time (its contents do not matter), or must exist at all
-times to prevent other sorts of trouble.
-
-@node Recursion, Sequences, Interrupts, Recipes
-@section Recursive Use of @code{make}
-@cindex recursion
-@cindex subdirectories, recursion for
-
-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 Summary, ,Summary of Options}):
-
-@example
-subsystem:
- $(MAKE) -C subdir
-@end example
-@cindex @code{-C}
-@cindex @code{--directory}
-
-You can write recursive @code{make} commands just by copying this example,
-but there are many things to know about how they work and why, and about
-how the sub-@code{make} relates to the top-level @code{make}. You may
-also find it useful to declare targets that invoke recursive
-@code{make} commands as @samp{.PHONY} (for more discussion on when
-this is useful, see @ref{Phony Targets}).
-
-@vindex @code{CURDIR}
-For your convenience, when GNU @code{make} starts (after it has
-processed any @code{-C} options) it sets the variable @code{CURDIR} to
-the pathname of the current working directory. This value is never
-touched by @code{make} again: in particular note that if you include
-files from other directories the value of @code{CURDIR} does not
-change. The value has the same precedence it would have if it were
-set in the makefile (by default, an environment variable @code{CURDIR}
-will not override this value). Note that setting this variable has no
-impact on the operation of @code{make} (it does not cause @code{make}
-to change its working directory, for example).
-
-@menu
-* MAKE Variable:: The special effects of using @samp{$(MAKE)}.
-* Variables/Recursion:: How to communicate variables to a sub-@code{make}.
-* Options/Recursion:: How to communicate options to a sub-@code{make}.
-* -w Option:: How the @samp{-w} or @samp{--print-directory} option
- helps debug use of recursive @code{make} commands.
-@end menu
-
-@node MAKE Variable, Variables/Recursion, Recursion, Recursion
-@subsection How the @code{MAKE} Variable Works
-@vindex MAKE
-@cindex recursion, and @code{MAKE} variable
-
-Recursive @code{make} commands should always use the variable @code{MAKE},
-not the explicit command name @samp{make}, as shown here:
-
-@example
-@group
-subsystem:
- cd subdir && $(MAKE)
-@end group
-@end example
-
-The value of this variable is the file name with which @code{make} was
-invoked. If this file name was @file{/bin/make}, then the recipe 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.
-@cindex @code{cd} (shell command)
-
-@cindex +, and recipes
-As a special feature, using the variable @code{MAKE} in the recipe of
-a rule alters the effects of the @samp{-t} (@samp{--touch}), @samp{-n}
-(@samp{--just-print}), or @samp{-q} (@w{@samp{--question}}) option.
-Using the @code{MAKE} variable has the same effect as using a @samp{+}
-character at the beginning of the recipe line. @xref{Instead of
-Execution, ,Instead of Executing the Recipes}. This special feature
-is only enabled if the @code{MAKE} variable appears directly in the
-recipe: it does not apply if the @code{MAKE} variable is referenced
-through expansion of another variable. In the latter case you must
-use the @samp{+} token to get these special effects.@refill
-
-Consider the command @samp{make -t} in the above example. (The
-@samp{-t} option marks targets as up to date without actually running
-any recipes; see @ref{Instead of Execution}.) Following the usual
-definition of @samp{-t}, a @samp{make -t} command in the example would
-create a file named @file{subsystem} and do nothing else. What you
-really want it to do is run @samp{@w{cd subdir &&} @w{make -t}}; but
-that would require executing the recipe, and @samp{-t} says not to
-execute recipes.@refill
-@cindex @code{-t}, and recursion
-@cindex recursion, and @code{-t}
-@cindex @code{--touch}, and recursion
-
-The special feature makes this do what you want: whenever a recipe
-line of a rule contains the variable @code{MAKE}, the flags @samp{-t},
-@samp{-n} and @samp{-q} do not apply to that line. Recipe lines
-containing @code{MAKE} are executed normally despite the presence of a
-flag that causes most recipes not to be run. The usual
-@code{MAKEFLAGS} mechanism passes the flags to the sub-@code{make}
-(@pxref{Options/Recursion, ,Communicating Options to a
-Sub-@code{make}}), so your request to touch the files, or print the
-recipes, is propagated to the subsystem.@refill
-
-@node Variables/Recursion, Options/Recursion, MAKE Variable, Recursion
-@subsection Communicating Variables to a Sub-@code{make}
-@cindex sub-@code{make}
-@cindex environment, and recursion
-@cindex exporting variables
-@cindex variables, environment
-@cindex variables, exporting
-@cindex recursion, and environment
-@cindex recursion, and variables
-
-Variable values of the top-level @code{make} can be passed to the
-sub-@code{make} through the environment by explicit request. These
-variables are defined in the sub-@code{make} as defaults, but do not
-override what is specified in the makefile used by the sub-@code{make}
-makefile unless you use the @samp{-e} switch (@pxref{Options Summary,
-,Summary of Options}).@refill
-
-To pass down, or @dfn{export}, a variable, @code{make} adds the
-variable and its value to the environment for running each line of the
-recipe. The sub-@code{make}, in turn, uses the environment to
-initialize its table of variable values. @xref{Environment,
-,Variables from the Environment}.
-
-Except by explicit request, @code{make} exports a variable only if it
-is either defined in the environment initially or set on the command
-line, and if its name consists only of letters, numbers, and underscores.
-Some shells cannot cope with environment variable names consisting of
-characters other than letters, numbers, and underscores.
-
-@cindex SHELL, exported value
-The value of the @code{make} variable @code{SHELL} is not exported.
-Instead, the value of the @code{SHELL} variable from the invoking
-environment is passed to the sub-@code{make}. You can force
-@code{make} to export its value for @code{SHELL} by using the
-@code{export} directive, described below. @xref{Choosing the Shell}.
-
-The special variable @code{MAKEFLAGS} is always exported (unless you
-unexport it). @code{MAKEFILES} is exported if you set it to anything.
-
-@code{make} automatically passes down variable values that were defined
-on the command line, by putting them in the @code{MAKEFLAGS} variable.
-@iftex
-See the next section.
-@end iftex
-@ifnottex
-@xref{Options/Recursion}.
-@end ifnottex
-
-Variables are @emph{not} normally passed down if they were created by
-default by @code{make} (@pxref{Implicit Variables, ,Variables Used by
-Implicit Rules}). The sub-@code{make} will define these for
-itself.@refill
-
-@findex export
-If you want to export specific variables to a sub-@code{make}, use the
-@code{export} directive, like this:
-
-@example
-export @var{variable} @dots{}
-@end example
-
-@noindent
-@findex unexport
-If you want to @emph{prevent} a variable from being exported, use the
-@code{unexport} directive, like this:
-
-@example
-unexport @var{variable} @dots{}
-@end example
-
-@noindent
-In both of these forms, the arguments to @code{export} and
-@code{unexport} are expanded, and so could be variables or functions
-which expand to a (list of) variable names to be (un)exported.
-
-As a convenience, you can define a variable and export it at the same
-time by doing:
-
-@example
-export @var{variable} = value
-@end example
-
-@noindent
-has the same result as:
-
-@example
-@var{variable} = value
-export @var{variable}
-@end example
-
-@noindent
-and
-
-@example
-export @var{variable} := value
-@end example
-
-@noindent
-has the same result as:
-
-@example
-@var{variable} := value
-export @var{variable}
-@end example
-
-Likewise,
-
-@example
-export @var{variable} += value
-@end example
-
-@noindent
-is just like:
-
-@example
-@var{variable} += value
-export @var{variable}
-@end example
-
-@noindent
-@xref{Appending, ,Appending More Text to Variables}.
-
-You may notice that the @code{export} and @code{unexport} directives
-work in @code{make} in the same way they work in the shell, @code{sh}.
-
-If you want all variables to be exported by default, you can use
-@code{export} by itself:
-
-@example
-export
-@end example
-
-@noindent
-This tells @code{make} that variables which are not explicitly mentioned
-in an @code{export} or @code{unexport} directive should be exported.
-Any variable given in an @code{unexport} directive will still @emph{not}
-be exported. If you use @code{export} by itself to export variables by
-default, variables whose names contain characters other than
-alphanumerics and underscores will not be exported unless specifically
-mentioned in an @code{export} directive.@refill
-
-@findex .EXPORT_ALL_VARIABLES
-The behavior elicited by an @code{export} directive by itself was the
-default in older versions of GNU @code{make}. If your makefiles depend
-on this behavior and you want to be compatible with old versions of
-@code{make}, you can write a rule for the special target
-@code{.EXPORT_ALL_VARIABLES} instead of using the @code{export} directive.
-This will be ignored by old @code{make}s, while the @code{export}
-directive will cause a syntax error.@refill
-@cindex compatibility in exporting
-
-Likewise, you can use @code{unexport} by itself to tell @code{make}
-@emph{not} to export variables by default. Since this is the default
-behavior, you would only need to do this if @code{export} had been used
-by itself earlier (in an included makefile, perhaps). You
-@strong{cannot} use @code{export} and @code{unexport} by themselves to
-have variables exported for some recipes and not for others. The last
-@code{export} or @code{unexport} directive that appears by itself
-determines the behavior for the entire run of @code{make}.@refill
-
-@vindex MAKELEVEL
-@cindex recursion, level of
-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 recipe.@refill
-
-The main use of @code{MAKELEVEL} is to test it in a conditional
-directive (@pxref{Conditionals, ,Conditional Parts of Makefiles}); this
-way you can write a makefile that behaves one way if run recursively and
-another way if run directly by you.@refill
-
-@vindex MAKEFILES
-You can use the variable @code{MAKEFILES} to cause all sub-@code{make}
-commands to use additional makefiles. The value of @code{MAKEFILES} is
-a whitespace-separated list of file names. This variable, if defined in
-the outer-level makefile, is passed down through the environment; then
-it serves as a list of extra makefiles for the sub-@code{make} to read
-before the usual or specified ones. @xref{MAKEFILES Variable, ,The
-Variable @code{MAKEFILES}}.@refill
-
-@node Options/Recursion, -w Option, Variables/Recursion, Recursion
-@subsection Communicating Options to a Sub-@code{make}
-@cindex options, and recursion
-@cindex recursion, and options
-
-@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 @w{@samp{make -ks}} then
-@code{MAKEFLAGS} gets the value @samp{ks}.@refill
-
-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 Summary, ,Summary of Options}.
-
-@cindex command line variable definitions, and recursion
-@cindex variables, command line, and recursion
-@cindex recursion, and command line variable definitions
-Likewise variables defined on the command line are passed to the
-sub-@code{make} through @code{MAKEFLAGS}. Words in the value of
-@code{MAKEFLAGS} that contain @samp{=}, @code{make} treats as variable
-definitions just as if they appeared on the command line.
-@xref{Overriding, ,Overriding Variables}.
-
-@cindex @code{-C}, and recursion
-@cindex @code{-f}, and recursion
-@cindex @code{-o}, and recursion
-@cindex @code{-W}, and recursion
-@cindex @code{--directory}, and recursion
-@cindex @code{--file}, and recursion
-@cindex @code{--old-file}, and recursion
-@cindex @code{--assume-old}, and recursion
-@cindex @code{--assume-new}, and recursion
-@cindex @code{--new-file}, and recursion
-@cindex recursion, and @code{-C}
-@cindex recursion, and @code{-f}
-@cindex recursion, and @code{-o}
-@cindex recursion, and @code{-W}
-The options @samp{-C}, @samp{-f}, @samp{-o}, and @samp{-W} are not put
-into @code{MAKEFLAGS}; these options are not passed down.@refill
-
-@cindex @code{-j}, and recursion
-@cindex @code{--jobs}, and recursion
-@cindex recursion, and @code{-j}
-@cindex job slots, and recursion
-The @samp{-j} option is a special case (@pxref{Parallel, ,Parallel Execution}).
-If you set it to some numeric value @samp{N} and your operating system
-supports it (most any UNIX system will; others typically won't), the
-parent @code{make} and all the sub-@code{make}s will communicate to
-ensure that there are only @samp{N} jobs running at the same time
-between them all. Note that any job that is marked recursive
-(@pxref{Instead of Execution, ,Instead of Executing the Recipes})
-doesn't count against the total jobs (otherwise we could get @samp{N}
-sub-@code{make}s running and have no slots left over for any real work!)
-
-If your operating system doesn't support the above communication, then
-@samp{-j 1} is always put into @code{MAKEFLAGS} instead of the value you
-specified. This is because if the @w{@samp{-j}} option were passed down
-to sub-@code{make}s, you would get many more jobs running in parallel
-than you asked for. If you give @samp{-j} with no numeric argument,
-meaning to run as many jobs as possible in parallel, this is passed
-down, since multiple infinities are no more than one.@refill
-
-If you do not want to pass the other flags down, you must change the
-value of @code{MAKEFLAGS}, like this:
-
-@example
-subsystem:
- cd subdir && $(MAKE) MAKEFLAGS=
-@end example
-
-@vindex MAKEOVERRIDES
-The command line variable definitions really appear in the variable
-@code{MAKEOVERRIDES}, and @code{MAKEFLAGS} contains a reference to this
-variable. If you do want to pass flags down normally, but don't want to
-pass down the command line variable definitions, you can reset
-@code{MAKEOVERRIDES} to empty, like this:
-
-@example
-MAKEOVERRIDES =
-@end example
-
-@noindent
-@cindex Arg list too long
-@cindex E2BIG
-This is not usually useful to do. However, some systems have a small
-fixed limit on the size of the environment, and putting so much
-information into the value of @code{MAKEFLAGS} can exceed it. If you
-see the error message @samp{Arg list too long}, this may be the problem.
-@findex .POSIX
-@cindex POSIX.2
-(For strict compliance with POSIX.2, changing @code{MAKEOVERRIDES} does
-not affect @code{MAKEFLAGS} if the special target @samp{.POSIX} appears
-in the makefile. You probably do not care about this.)
-
-@vindex MFLAGS
-A similar variable @code{MFLAGS} exists also, for historical
-compatibility. It has the same value as @code{MAKEFLAGS} except that it
-does not contain the command line variable definitions, and it always
-begins with a hyphen unless it is empty (@code{MAKEFLAGS} begins with a
-hyphen only when it begins with an option that has no single-letter
-version, such as @samp{--warn-undefined-variables}). @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. If you want your
-makefiles to be compatible with old @code{make} programs, use this
-technique; it will work fine with more modern @code{make} versions too.
-
-@cindex setting options from environment
-@cindex options, setting from environment
-@cindex setting options in makefiles
-@cindex options, setting in makefiles
-The @code{MAKEFLAGS} variable can also be useful if you want to have
-certain options, such as @samp{-k} (@pxref{Options Summary, ,Summary of
-Options}), set each time you run @code{make}. You simply put a value for
-@code{MAKEFLAGS} in your environment. You can also set @code{MAKEFLAGS} in
-a makefile, to specify additional flags that should also be in effect for
-that makefile. (Note that you cannot use @code{MFLAGS} this way. That
-variable is set only for compatibility; @code{make} does not interpret a
-value you set for it in any way.)
-
-When @code{make} interprets the value of @code{MAKEFLAGS} (either from the
-environment or from a makefile), it first prepends a hyphen if the value
-does not already begin with one. Then it chops the value into words
-separated by blanks, and parses these words as if they were options given
-on the command line (except that @samp{-C}, @samp{-f}, @samp{-h},
-@samp{-o}, @samp{-W}, and their long-named versions are ignored; and there
-is no error for an invalid option).
-
-If you do put @code{MAKEFLAGS} in your environment, you should be sure not
-to include any options that will drastically affect the actions of
-@code{make} and undermine the purpose of makefiles and of @code{make}
-itself. For instance, the @samp{-t}, @samp{-n}, and @samp{-q} options, if
-put in one of these variables, could have disastrous consequences and would
-certainly have at least surprising and probably annoying effects.@refill
-
-@node -w Option, , Options/Recursion, Recursion
-@subsection The @samp{--print-directory} Option
-@cindex directories, printing them
-@cindex printing directories
-@cindex recursion, and printing directories
-
-If you use several levels of recursive @code{make} invocations, the
-@samp{-w} or @w{@samp{--print-directory}} option can make the output a
-lot easier to understand by showing each directory as @code{make}
-starts processing it and as @code{make} finishes processing it. For
-example, if @samp{make -w} is run in the directory @file{/u/gnu/make},
-@code{make} will print a line of the form:@refill
-
-@example
-make: Entering directory `/u/gnu/make'.
-@end example
-
-@noindent
-before doing anything else, and a line of the form:
-
-@example
-make: Leaving directory `/u/gnu/make'.
-@end example
-
-@noindent
-when processing is completed.
-
-@cindex @code{-C}, and @code{-w}
-@cindex @code{--directory}, and @code{--print-directory}
-@cindex recursion, and @code{-w}
-@cindex @code{-w}, and @code{-C}
-@cindex @code{-w}, and recursion
-@cindex @code{--print-directory}, and @code{--directory}
-@cindex @code{--print-directory}, and recursion
-@cindex @code{--no-print-directory}
-@cindex @code{--print-directory}, disabling
-@cindex @code{-w}, disabling
-Normally, you do not need to specify this option because @samp{make}
-does it for you: @samp{-w} is turned on automatically when you use the
-@samp{-C} option, and in sub-@code{make}s. @code{make} will not
-automatically turn on @samp{-w} if you also use @samp{-s}, which says to
-be silent, or if you use @samp{--no-print-directory} to explicitly
-disable it.
-
-@node Sequences, Empty Recipes, Recursion, Recipes
-@section Defining Canned Recipes
-@cindex canned recipes
-@cindex recipes, canned
-@cindex sequences of commands
-@cindex commands, sequences of
-
-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 recipes 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 recipes:
-
-@example
-define run-yacc
-yacc $(firstword $^)
-mv y.tab.c $@@
-endef
-@end example
-@cindex @code{yacc}
-
-@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, ,Defining Variables Verbatim},
-for a complete explanation of @code{define}.
-
-The first command in this example runs Yacc on the first prerequisite 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 recipe of a
-rule. You can substitute it like any other variable
-(@pxref{Reference, ,Basics of Variable References}).
-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 be 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
-(@pxref{Implicit Rules, ,Using Implicit Rules}).
-
-@cindex @@, and @code{define}
-@cindex -, and @code{define}
-@cindex +, and @code{define}
-In recipe execution, each line of a canned sequence is treated just as
-if the line appeared on its own in the rule, preceded by a tab. In
-particular, @code{make} invokes a separate subshell for each line. You
-can use the special prefix characters that affect command lines
-(@samp{@@}, @samp{-}, and @samp{+}) on each line of a canned sequence.
-@xref{Recipes, ,Writing Recipes in Rules}.
-For example, using this canned sequence:
-
-@example
-define frobnicate
-@@echo "frobnicating target $@@"
-frob-step-1 $< -o $@@-step-1
-frob-step-2 $@@-step-1 -o $@@
-endef
-@end example
-
-@noindent
-@code{make} will not echo the first line, the @code{echo} command.
-But it @emph{will} echo the following two recipe lines.
-
-On the other hand, prefix characters on the recipe line that refers to
-a canned sequence apply to every line in the sequence. So the rule:
-
-@example
-frob.out: frob.in
- @@$(frobnicate)
-@end example
-
-@noindent
-does not echo @emph{any} recipe lines.
-(@xref{Echoing, ,Recipe Echoing}, for a full explanation of @samp{@@}.)
-
-@node Empty Recipes, , Sequences, Recipes
-@section Using Empty Recipes
-@cindex empty recipes
-@cindex recipes, empty
-
-It is sometimes useful to define recipes which do nothing. This is done
-simply by giving a recipe that consists of nothing but whitespace. For
-example:
-
-@example
-target: ;
-@end example
-
-@noindent
-defines an empty recipe for @file{target}. You could also use a line
-beginning with a recipe prefix character to define an empty recipe,
-but this would be confusing because such a line looks empty.
-
-@findex .DEFAULT@r{, and empty recipes}
-You may be wondering why you would want to define a recipe that
-does nothing. The only reason this is useful is to prevent a target
-from getting implicit recipes (from implicit rules or the
-@code{.DEFAULT} special target; @pxref{Implicit Rules} and
-@pxref{Last Resort, ,Defining Last-Resort Default Rules}).@refill
-
-@c !!! another reason is for canonical stamp files:
-@ignore
-@example
-foo: stamp-foo ;
-stamp-foo: foo.in
- create foo frm foo.in
- touch $@
-@end example
-@end ignore
-
-You may be inclined to define empty recipes for targets that are
-not actual files, but only exist so that their prerequisites can be
-remade. However, this is not the best way to do that, because the
-prerequisites may not be remade properly if the target file actually does exist.
-@xref{Phony Targets, ,Phony Targets}, for a better way to do this.
-
-@node Using Variables, Conditionals, Recipes, 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 in a makefile to represent a string
-of text, called the variable's @dfn{value}. These values are
-substituted by explicit request into targets, prerequisites, recipes,
-and other parts of the makefile. (In some other versions of @code{make},
-variables are called @dfn{macros}.)
-@cindex macro
-
-Variables and functions in all parts of a makefile are expanded when
-read, except for in recipes, the right-hand sides of variable
-definitions using @samp{=}, and the bodies of variable definitions
-using the @code{define} directive.@refill
-
-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 of characters not containing @samp{:},
-@samp{#}, @samp{=}, or leading or trailing whitespace. However,
-variable names containing characters other than letters, numbers, and
-underscores should be avoided, as they may be given special meanings in the
-future, and with some shells they cannot be passed through the environment to a
-sub-@code{make}
-(@pxref{Variables/Recursion, ,Communicating Variables to a Sub-@code{make}}).
-
-Variable names are case-sensitive. The names @samp{foo}, @samp{FOO},
-and @samp{Foo} all refer to different variables.
-
-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, ,Overriding Variables}).
-
-A few variables have names that are a single punctuation character or
-just a few characters. These are the @dfn{automatic variables}, and
-they have particular specialized uses. @xref{Automatic Variables}.
-
-@menu
-* Reference:: How to use the value of a variable.
-* Flavors:: Variables come in two flavors.
-* Advanced:: Advanced features for referencing a variable.
-* Values:: All the ways variables get their values.
-* Setting:: How to set a variable in the makefile.
-* Appending:: How to append more text to the old value
- of a variable.
-* Override Directive:: How to set 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.
-* Target-specific:: Variable values can be defined on a per-target
- basis.
-* Pattern-specific:: Target-specific variable values can be applied
- to a group of targets that match a pattern.
-* Special Variables:: Variables with special meaning or behavior.
-@end menu
-
-@node Reference, Flavors, Using Variables, Using Variables
-@section Basics of Variable References
-@cindex variables, how to reference
-@cindex reference to variables
-@cindex @code{$}, in variable reference
-@cindex dollar sign (@code{$}), in variable reference
-
-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 recipe.
-
-Variable references can be used in any context: targets, prerequisites,
-recipes, most directives, and new variable values. Here is an
-example of a common case, where a variable holds the names of all the
-object files in a program:
-
-@example
-@group
-objects = program.o foo.o utils.o
-program : $(objects)
- cc -o program $(objects)
-
-$(objects) : defs.h
-@end group
-@end example
-
-Variable references work by strict textual substitution. Thus, the rule
-
-@example
-@group
-foo = c
-prog.o : prog.$(foo)
- $(foo)$(foo) -$(foo) prog.$(foo)
-@end group
-@end example
-
-@noindent
-could be used to compile a C program @file{prog.c}. Since spaces before
-the variable value are ignored in variable assignments, the value of
-@code{foo} is precisely @samp{c}. (Don't actually write your makefiles
-this way!)
-
-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 in
-the case of the automatic variables (@pxref{Automatic Variables}).
-
-@node Flavors, Advanced, Reference, Using Variables
-@section The Two Flavors of Variables
-@cindex flavors of variables
-@cindex recursive variable expansion
-@cindex variables, flavors
-@cindex recursively expanded variables
-@cindex variables, recursively expanded
-
-There are two ways that a variable in GNU @code{make} can have a value;
-we call them the two @dfn{flavors} of variables. The two flavors are
-distinguished in how they are defined and in what they do when expanded.
-
-@cindex =
-The first flavor of variable is a @dfn{recursively expanded} variable.
-Variables of this sort are defined by lines using @samp{=}
-(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive
-(@pxref{Defining, ,Defining Variables Verbatim}). 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
-called @dfn{recursive expansion}.@refill
-
-For example,
-
-@example
-foo = $(bar)
-bar = $(ugh)
-ugh = Huh?
-
-all:;echo $(foo)
-@end example
-
-@noindent
-will echo @samp{Huh?}: @samp{$(foo)} expands to @samp{$(bar)} which
-expands to @samp{$(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 recipe,
-it will expand to @samp{-Ifoo -Ibar -O}. A major disadvantage is that you
-cannot 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.)
-@cindex loops in variable expansion
-@cindex variables, loops in expansion
-
-Another disadvantage is that any functions
-(@pxref{Functions, ,Functions for Transforming Text})
-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} and @code{shell} functions to give unpredictable results
-because you cannot easily control when they are called, or even how many
-times.
-
-To avoid all the problems and inconveniences of recursively expanded
-variables, there is another flavor: simply expanded variables.
-
-@cindex simply expanded variables
-@cindex variables, simply expanded
-@cindex :=
-@dfn{Simply expanded variables} are defined by lines using @samp{:=}
-(@pxref{Setting, ,Setting Variables}).
-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 text that 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.
-
-Here is a somewhat more complicated example, illustrating the use of
-@samp{:=} in conjunction with the @code{shell} function.
-(@xref{Shell Function, , The @code{shell} Function}.) This example
-also shows use of the variable @code{MAKELEVEL}, which is changed
-when it is passed down from level to level.
-(@xref{Variables/Recursion, , Communicating Variables to a
-Sub-@code{make}}, for information about @code{MAKELEVEL}.)
-
-@vindex MAKELEVEL
-@vindex MAKE
-@example
-@group
-ifeq (0,$@{MAKELEVEL@})
-whoami := $(shell whoami)
-host-type := $(shell arch)
-MAKE := $@{MAKE@} host-type=$@{host-type@} whoami=$@{whoami@}
-endif
-@end group
-@end example
-
-@noindent
-An advantage of this use of @samp{:=} is that a typical
-`descend into a directory' recipe then looks like this:
-
-@example
-@group
-$@{subdirs@}:
- $@{MAKE@} -C $@@ all
-@end group
-@end example
-
-Simply expanded variables generally make complicated makefile programming
-more predictable because they work like variables in most programming
-languages. They allow you to redefine a variable using its own value (or
-its value processed in some way by one of the expansion functions) and to
-use the expansion functions much more efficiently
-(@pxref{Functions, ,Functions for Transforming Text}).
-
-@cindex spaces, in variable values
-@cindex whitespace, in variable values
-@cindex variables, spaces in values
-You can also use them to introduce controlled leading whitespace into
-variable values. Leading whitespace characters are discarded from your
-input before substitution of variable references and function calls;
-this means you can include leading spaces in a variable value by
-protecting them with variable references, like this:
-
-@example
-nullstring :=
-space := $(nullstring) # end of the line
-@end example
-
-@noindent
-Here the value of the variable @code{space} is precisely one space. The
-comment @w{@samp{# end of the line}} is included here just for clarity.
-Since trailing space characters are @emph{not} stripped from variable
-values, just a space at the end of the line would have the same effect
-(but be rather hard to read). If you put whitespace at the end of a
-variable value, it is a good idea to put a comment like that at the end
-of the line to make your intent clear. Conversely, if you do @emph{not}
-want any whitespace characters at the end of your variable value, you
-must remember not to put a random comment on the end of the line after
-some whitespace, such as this:
-
-@example
-dir := /foo/bar # directory to put the frobs in
-@end example
-
-@noindent
-Here the value of the variable @code{dir} is @w{@samp{/foo/bar }}
-(with four trailing spaces), which was probably not the intention.
-(Imagine something like @w{@samp{$(dir)/file}} with this definition!)
-
-@cindex conditional variable assignment
-@cindex variables, conditional assignment
-@cindex ?=
-There is another assignment operator for variables, @samp{?=}. This
-is called a conditional variable assignment operator, because it only
-has an effect if the variable is not yet defined. This statement:
-
-@example
-FOO ?= bar
-@end example
-
-@noindent
-is exactly equivalent to this
-(@pxref{Origin Function, ,The @code{origin} Function}):
-
-@example
-ifeq ($(origin FOO), undefined)
- FOO = bar
-endif
-@end example
-
-Note that a variable set to an empty value is still defined, so
-@samp{?=} will not set that variable.
-
-@node Advanced, Values, Flavors, Using Variables
-@section Advanced Features for Reference to Variables
-@cindex reference to variables
-
-This section describes some advanced features you can use to reference
-variables in more flexible ways.
-
-@menu
-* Substitution Refs:: Referencing a variable with
- substitutions on the value.
-* Computed Names:: Computing the name of the variable to refer to.
-@end menu
-
-@node Substitution Refs, Computed Names, Advanced, Advanced
-@subsection Substitution References
-@cindex modified variable reference
-@cindex substitution variable reference
-@cindex variables, modified reference
-@cindex variables, substitution reference
-
-@cindex variables, substituting suffix in
-@cindex suffix, substituting in variables
-A @dfn{substitution reference} substitutes the value of a variable with
-alterations that you specify. It has the form
-@samp{$(@var{var}:@var{a}=@var{b})} (or
-@samp{$@{@var{var}:@var{a}=@var{b}@}}) and its meaning is to take the value
-of the variable @var{var}, replace every @var{a} at the end of a word with
-@var{b} in that value, and substitute the resulting string.
-
-When we say ``at the end of a word'', we mean that @var{a} must appear
-either followed by whitespace or at the end of the value in order to be
-replaced; other occurrences of @var{a} in the value are unaltered. 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, ,Setting Variables}.
-
-A substitution reference is actually an abbreviation for use of the
-@code{patsubst} expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}). We provide
-substitution references as well as @code{patsubst} for compatibility with
-other implementations of @code{make}.
-
-@findex patsubst
-Another type of substitution reference lets you use the full power of
-the @code{patsubst} function. It has the same form
-@samp{$(@var{var}:@var{a}=@var{b})} described above, except that now
-@var{a} must contain a single @samp{%} character. This case is
-equivalent to @samp{$(patsubst @var{a},@var{b},$(@var{var}))}.
-@xref{Text Functions, ,Functions for String Substitution and Analysis},
-for a description of the @code{patsubst} function.@refill
-
-@example
-@group
-@exdent For example:
-
-foo := a.o b.o c.o
-bar := $(foo:%.o=%.c)
-@end group
-@end example
-
-@noindent
-sets @samp{bar} to @samp{a.c b.c c.c}.
-
-@node Computed Names, , Substitution Refs, Advanced
-@subsection Computed Variable Names
-@cindex nested variable reference
-@cindex computed variable name
-@cindex variables, computed names
-@cindex variables, nested references
-@cindex variables, @samp{$} in name
-@cindex @code{$}, in variable name
-@cindex dollar sign (@code{$}), in variable name
-
-Computed variable names are a complicated concept needed only for
-sophisticated makefile programming. For most purposes you need not
-consider them, except to know that making a variable with a dollar sign
-in its name might have strange results. However, if you are the type
-that wants to understand everything, or you are actually interested in
-what they do, read on.
-
-Variables may be referenced inside the name of a variable. This is
-called a @dfn{computed variable name} or a @dfn{nested variable
-reference}. For example,
-
-@example
-x = y
-y = z
-a := $($(x))
-@end example
-
-@noindent
-defines @code{a} as @samp{z}: the @samp{$(x)} inside @samp{$($(x))} expands
-to @samp{y}, so @samp{$($(x))} expands to @samp{$(y)} which in turn expands
-to @samp{z}. Here the name of the variable to reference is not stated
-explicitly; it is computed by expansion of @samp{$(x)}. The reference
-@samp{$(x)} here is nested within the outer variable reference.
-
-The previous example shows two levels of nesting, but any number of levels
-is possible. For example, here are three levels:
-
-@example
-x = y
-y = z
-z = u
-a := $($($(x)))
-@end example
-
-@noindent
-Here the innermost @samp{$(x)} expands to @samp{y}, so @samp{$($(x))}
-expands to @samp{$(y)} which in turn expands to @samp{z}; now we have
-@samp{$(z)}, which becomes @samp{u}.
-
-References to recursively-expanded variables within a variable name are
-reexpanded in the usual fashion. For example:
-
-@example
-x = $(y)
-y = z
-z = Hello
-a := $($(x))
-@end example
-
-@noindent
-defines @code{a} as @samp{Hello}: @samp{$($(x))} becomes @samp{$($(y))}
-which becomes @samp{$(z)} which becomes @samp{Hello}.
-
-Nested variable references can also contain modified references and
-function invocations (@pxref{Functions, ,Functions for Transforming Text}),
-just like any other reference.
-For example, using the @code{subst} function
-(@pxref{Text Functions, ,Functions for String Substitution and Analysis}):
-
-@example
-@group
-x = variable1
-variable2 := Hello
-y = $(subst 1,2,$(x))
-z = y
-a := $($($(z)))
-@end group
-@end example
-
-@noindent
-eventually defines @code{a} as @samp{Hello}. It is doubtful that anyone
-would ever want to write a nested reference as convoluted as this one, but
-it works: @samp{$($($(z)))} expands to @samp{$($(y))} which becomes
-@samp{$($(subst 1,2,$(x)))}. This gets the value @samp{variable1} from
-@code{x} and changes it by substitution to @samp{variable2}, so that the
-entire string becomes @samp{$(variable2)}, a simple variable reference
-whose value is @samp{Hello}.@refill
-
-A computed variable name need not consist entirely of a single variable
-reference. It can contain several variable references, as well as some
-invariant text. For example,
-
-@example
-@group
-a_dirs := dira dirb
-1_dirs := dir1 dir2
-@end group
-
-@group
-a_files := filea fileb
-1_files := file1 file2
-@end group
-
-@group
-ifeq "$(use_a)" "yes"
-a1 := a
-else
-a1 := 1
-endif
-@end group
-
-@group
-ifeq "$(use_dirs)" "yes"
-df := dirs
-else
-df := files
-endif
-
-dirs := $($(a1)_$(df))
-@end group
-@end example
-
-@noindent
-will give @code{dirs} the same value as @code{a_dirs}, @code{1_dirs},
-@code{a_files} or @code{1_files} depending on the settings of @code{use_a}
-and @code{use_dirs}.@refill
-
-Computed variable names can also be used in substitution references:
-
-@example
-@group
-a_objects := a.o b.o c.o
-1_objects := 1.o 2.o 3.o
-
-sources := $($(a1)_objects:.o=.c)
-@end group
-@end example
-
-@noindent
-defines @code{sources} as either @samp{a.c b.c c.c} or @samp{1.c 2.c 3.c},
-depending on the value of @code{a1}.
-
-The only restriction on this sort of use of nested variable references
-is that they cannot specify part of the name of a function to be called.
-This is because the test for a recognized function name is done before
-the expansion of nested references. For example,
-
-@example
-@group
-ifdef do_sort
-func := sort
-else
-func := strip
-endif
-@end group
-
-@group
-bar := a d b g q c
-@end group
-
-@group
-foo := $($(func) $(bar))
-@end group
-@end example
-
-@noindent
-attempts to give @samp{foo} the value of the variable @samp{sort a d b g
-q c} or @samp{strip a d b g q c}, rather than giving @samp{a d b g q c}
-as the argument to either the @code{sort} or the @code{strip} function.
-This restriction could be removed in the future if that change is shown
-to be a good idea.
-
-You can also use computed variable names in the left-hand side of a
-variable assignment, or in a @code{define} directive, as in:
-
-@example
-dir = foo
-$(dir)_sources := $(wildcard $(dir)/*.c)
-define $(dir)_print
-lpr $($(dir)_sources)
-endef
-@end example
-
-@noindent
-This example defines the variables @samp{dir}, @samp{foo_sources}, and
-@samp{foo_print}.
-
-Note that @dfn{nested variable references} are quite different from
-@dfn{recursively expanded variables}
-(@pxref{Flavors, ,The Two Flavors of Variables}), though both are
-used together in complex ways when doing makefile programming.@refill
-
-@node Values, Setting, Advanced, Using Variables
-@section How Variables Get Their Values
-@cindex variables, how they get their values
-@cindex value, how a variable gets it
-
-Variables can get values in several different ways:
-
-@itemize @bullet
-@item
-You can specify an overriding value when you run @code{make}.
-@xref{Overriding, ,Overriding Variables}.
-
-@item
-You can specify a value in the makefile, either
-with an assignment (@pxref{Setting, ,Setting Variables}) or with a
-verbatim definition (@pxref{Defining, ,Defining Variables Verbatim}).@refill
-
-@item
-Variables in the environment become @code{make} variables.
-@xref{Environment, ,Variables from the Environment}.
-
-@item
-Several @dfn{automatic} variables are given new values for each rule.
-Each of these has a single conventional use.
-@xref{Automatic Variables}.
-
-@item
-Several variables have constant initial values.
-@xref{Implicit Variables, ,Variables Used by Implicit Rules}.
-@end itemize
-
-@node Setting, Appending, Values, Using Variables
-@section Setting Variables
-@cindex setting variables
-@cindex variables, setting
-@cindex =
-@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}. Whitespace around the variable
-name and immediately after the @samp{=} is ignored.
-
-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, ,The Two Flavors of Variables}.
-
-The variable name may contain function and variable references, which
-are expanded when the line is read to find the actual variable name to use.
-
-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 you can set them in the usual ways
-(@pxref{Implicit Variables, ,Variables Used by Implicit Rules}).
-Several special variables are set
-automatically to a new value for each rule; these are called the
-@dfn{automatic} variables (@pxref{Automatic Variables}).
-
-If you'd like a variable to be set to a value only if it's not already
-set, then you can use the shorthand operator @samp{?=} instead of
-@samp{=}. These two settings of the variable @samp{FOO} are identical
-(@pxref{Origin Function, ,The @code{origin} Function}):
-
-@example
-FOO ?= bar
-@end example
-
-@noindent
-and
-
-@example
-ifeq ($(origin FOO), undefined)
-FOO = bar
-endif
-@end example
-
-@node Appending, Override Directive, Setting, Using Variables
-@section Appending More Text to Variables
-@cindex +=
-@cindex appending to variables
-@cindex variables, appending to
-
-Often it is useful to add more text to the value of a variable already defined.
-You do this with a line containing @samp{+=}, like this:
-
-@example
-objects += another.o
-@end example
-
-@noindent
-This takes the value of the variable @code{objects}, and adds the text
-@samp{another.o} to it (preceded by a single space). Thus:
-
-@example
-objects = main.o foo.o bar.o utils.o
-objects += another.o
-@end example
-
-@noindent
-sets @code{objects} to @samp{main.o foo.o bar.o utils.o another.o}.
-
-Using @samp{+=} is similar to:
-
-@example
-objects = main.o foo.o bar.o utils.o
-objects := $(objects) another.o
-@end example
-
-@noindent
-but differs in ways that become important when you use more complex values.
-
-When the variable in question has not been defined before, @samp{+=}
-acts just like normal @samp{=}: it defines a recursively-expanded
-variable. However, when there @emph{is} a previous definition, exactly
-what @samp{+=} does depends on what flavor of variable you defined
-originally. @xref{Flavors, ,The Two Flavors of Variables}, for an
-explanation of the two flavors of variables.
-
-When you add to a variable's value with @samp{+=}, @code{make} acts
-essentially as if you had included the extra text in the initial
-definition of the variable. If you defined it first with @samp{:=},
-making it a simply-expanded variable, @samp{+=} adds to that
-simply-expanded definition, and expands the new text before appending it
-to the old value just as @samp{:=} does
-(see @ref{Setting, ,Setting Variables}, for a full explanation of @samp{:=}).
-In fact,
-
-@example
-variable := value
-variable += more
-@end example
-
-@noindent
-is exactly equivalent to:
-
-@noindent
-@example
-variable := value
-variable := $(variable) more
-@end example
-
-On the other hand, when you use @samp{+=} with a variable that you defined
-first to be recursively-expanded using plain @samp{=}, @code{make} does
-something a bit different. Recall that when you define a
-recursively-expanded variable, @code{make} does not expand the value you set
-for variable and function references immediately. Instead it stores the text
-verbatim, and saves these variable and function references to be expanded
-later, when you refer to the new variable (@pxref{Flavors, ,The Two Flavors
-of Variables}). When you use @samp{+=} on a recursively-expanded variable,
-it is this unexpanded text to which @code{make} appends the new text you
-specify.
-
-@example
-@group
-variable = value
-variable += more
-@end group
-@end example
-
-@noindent
-is roughly equivalent to:
-
-@example
-@group
-temp = value
-variable = $(temp) more
-@end group
-@end example
-
-@noindent
-except that of course it never defines a variable called @code{temp}.
-The importance of this comes when the variable's old value contains
-variable references. Take this common example:
-
-@example
-CFLAGS = $(includes) -O
-@dots{}
-CFLAGS += -pg # enable profiling
-@end example
-
-@noindent
-The first line defines the @code{CFLAGS} variable with a reference to another
-variable, @code{includes}. (@code{CFLAGS} is used by the rules for C
-compilation; @pxref{Catalogue of Rules, ,Catalogue of Implicit Rules}.)
-Using @samp{=} for the definition makes @code{CFLAGS} a recursively-expanded
-variable, meaning @w{@samp{$(includes) -O}} is @emph{not} expanded when
-@code{make} processes the definition of @code{CFLAGS}. Thus, @code{includes}
-need not be defined yet for its value to take effect. It only has to be
-defined before any reference to @code{CFLAGS}. If we tried to append to the
-value of @code{CFLAGS} without using @samp{+=}, we might do it like this:
-
-@example
-CFLAGS := $(CFLAGS) -pg # enable profiling
-@end example
-
-@noindent
-This is pretty close, but not quite what we want. Using @samp{:=}
-redefines @code{CFLAGS} as a simply-expanded variable; this means
-@code{make} expands the text @w{@samp{$(CFLAGS) -pg}} before setting the
-variable. If @code{includes} is not yet defined, we get @w{@samp{ -O
--pg}}, and a later definition of @code{includes} will have no effect.
-Conversely, by using @samp{+=} we set @code{CFLAGS} to the
-@emph{unexpanded} value @w{@samp{$(includes) -O -pg}}. Thus we preserve
-the reference to @code{includes}, so if that variable gets defined at
-any later point, a reference like @samp{$(CFLAGS)} still uses its
-value.
-
-@node Override Directive, Defining, Appending, Using Variables
-@section The @code{override} Directive
-@findex override
-@cindex overriding with @code{override}
-@cindex variables, overriding
-
-If a variable has been set with a command argument
-(@pxref{Overriding, ,Overriding Variables}),
-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:@refill
-
-@example
-override @var{variable} = @var{value}
-@end example
-
-@noindent
-or
-
-@example
-override @var{variable} := @var{value}
-@end example
-
-To append more text to a variable defined on the command line, use:
-
-@example
-override @var{variable} += @var{more text}
-@end example
-
-@noindent
-@xref{Appending, ,Appending More Text to Variables}.
-
-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 += -g
-@end example
-
-You can also use @code{override} directives with @code{define} directives.
-This is done as you might expect:
-
-@example
-override define foo
-bar
-endef
-@end example
-
-@noindent
-@iftex
-See the next section for information about @code{define}.
-@end iftex
-@ifnottex
-@xref{Defining, ,Defining Variables Verbatim}.
-@end ifnottex
-
-@node Defining, Environment, Override Directive, Using Variables
-@section Defining Variables Verbatim
-@findex define
-@findex endef
-@cindex verbatim variable definition
-@cindex defining variables verbatim
-@cindex variables, defining verbatim
-
-Another way to set the value of a variable is to use the @code{define}
-directive. This directive has an unusual syntax which allows newline
-characters to be included in the value, which is convenient for defining
-both canned sequences of commands
-(@pxref{Sequences, ,Defining Canned Command Sequences}), and also
-sections of makefile syntax to use with @code{eval} (@pxref{Eval Function}).
-
-The @code{define} directive is followed on the same line by 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 @samp{=}: it creates a recursively-expanded variable
-(@pxref{Flavors, ,The Two Flavors of Variables}).
-The variable name may contain function and variable references, which
-are expanded when the directive is read to find the actual variable name
-to use.
-
-You may nest @code{define} directives: @code{make} will keep track of
-nested directives and report an error if they are not all properly
-closed with @code{endef}. Note that lines beginning with the recipe
-prefix character are considered part of a recipe, so any @code{define}
-or @code{endef} strings appearing on such a line will not be
-considered @code{make} operators.
-
-@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
-
-@need 800
-When used in a recipe, the previous example is functionally equivalent
-to this:
-
-@example
-two-lines = echo foo; echo $(bar)
-@end example
-
-@noindent
-since two commands separated by semicolon behave much like two separate
-shell commands. However, note that using two separate lines means
-@code{make} will invoke the shell twice, running an independent subshell
-for each line. @xref{Execution, ,Recipe Execution}.
-
-If you want variable definitions made with @code{define} to take
-precedence over command-line variable definitions, you can use the
-@code{override} directive together with @code{define}:
-
-@example
-override define two-lines
-foo
-$(bar)
-endef
-@end example
-
-@noindent
-@xref{Override Directive, ,The @code{override} Directive}.
-
-@node Environment, Target-specific, Defining, Using Variables
-@section Variables from the Environment
-
-@cindex variables, environment
-@cindex environment
-Variables in @code{make} can come from the environment in 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. However, 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 Summary, ,Summary of
-Options}. But this is not recommended practice.)
-
-Thus, 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. (Note
-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} runs a recipe, variables defined in the
-makefile are placed into the environment of each shell. This allows
-you to pass values to sub-@code{make} invocations (@pxref{Recursion,
-,Recursive Use of @code{make}}). By default, only variables that came
-from the environment or the command line are passed to recursive
-invocations. You can use the @code{export} directive to pass other
-variables. @xref{Variables/Recursion, , Communicating Variables to a
-Sub-@code{make}}, for full details.
-
-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.
-
-@cindex SHELL, import from environment
-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} handles the
-@code{SHELL} environment variable in a special way; see @ref{Choosing
-the Shell}.@refill
-
-@node Target-specific, Pattern-specific, Environment, Using Variables
-@section Target-specific Variable Values
-@cindex target-specific variables
-@cindex variables, target-specific
-
-Variable values in @code{make} are usually global; that is, they are the
-same regardless of where they are evaluated (unless they're reset, of
-course). One exception to that is automatic variables
-(@pxref{Automatic Variables}).
-
-The other exception is @dfn{target-specific variable values}. This
-feature allows you to define different values for the same variable,
-based on the target that @code{make} is currently building. As with
-automatic variables, these values are only available within the context
-of a target's recipe (and in other target-specific assignments).
-
-Set a target-specific variable value like this:
-
-@example
-@var{target} @dots{} : @var{variable-assignment}
-@end example
-
-@noindent
-or like this:
-
-@example
-@var{target} @dots{} : override @var{variable-assignment}
-@end example
-
-@noindent
-or like this:
-
-@example
-@var{target} @dots{} : export @var{variable-assignment}
-@end example
-
-Multiple @var{target} values create a target-specific variable value for
-each member of the target list individually.
-
-The @var{variable-assignment} can be any valid form of assignment;
-recursive (@samp{=}), static (@samp{:=}), appending (@samp{+=}), or
-conditional (@samp{?=}). All variables that appear within the
-@var{variable-assignment} are evaluated within the context of the
-target: thus, any previously-defined target-specific variable values
-will be in effect. Note that this variable is actually distinct from
-any ``global'' value: the two variables do not have to have the same
-flavor (recursive vs.@: static).
-
-Target-specific variables have the same priority as any other makefile
-variable. Variables provided on the command line (and in the
-environment if the @samp{-e} option is in force) will take precedence.
-Specifying the @code{override} directive will allow the target-specific
-variable value to be preferred.
-
-There is one more special feature of target-specific variables: when
-you define a target-specific variable that variable value is also in
-effect for all prerequisites of this target, and all their
-prerequisites, etc.@: (unless those prerequisites override that variable
-with their own target-specific variable value). So, for example, a
-statement like this:
-
-@example
-prog : CFLAGS = -g
-prog : prog.o foo.o bar.o
-@end example
-
-@noindent
-will set @code{CFLAGS} to @samp{-g} in the recipe for @file{prog}, but
-it will also set @code{CFLAGS} to @samp{-g} in the recipes that create
-@file{prog.o}, @file{foo.o}, and @file{bar.o}, and any recipes which
-create their prerequisites.
-
-Be aware that a given prerequisite will only be built once per
-invocation of make, at most. If the same file is a prerequisite of
-multiple targets, and each of those targets has a different value for
-the same target-specific variable, then the first target to be built
-will cause that prerequisite to be built and the prerequisite will
-inherit the target-specific value from the first target. It will
-ignore the target-specific values from any other targets.
-
-@node Pattern-specific, Special Variables, Target-specific, Using Variables
-@section Pattern-specific Variable Values
-@cindex pattern-specific variables
-@cindex variables, pattern-specific
-
-In addition to target-specific variable values
-(@pxref{Target-specific, ,Target-specific Variable Values}), GNU
-@code{make} supports pattern-specific variable values. In this form,
-the variable is defined for any target that matches the pattern
-specified. If a target matches more than one pattern, all the
-matching pattern-specific variables are interpreted in the order in
-which they were defined in the makefile, and collected together into
-one set. Variables defined in this way are searched after any
-target-specific variables defined explicitly for that target, and
-before target-specific variables defined for the parent target.
-
-Set a pattern-specific variable value like this:
-
-@example
-@var{pattern} @dots{} : @var{variable-assignment}
-@end example
-
-@noindent
-or like this:
-
-@example
-@var{pattern} @dots{} : override @var{variable-assignment}
-@end example
-
-@noindent
-where @var{pattern} is a %-pattern. As with target-specific variable
-values, multiple @var{pattern} values create a pattern-specific variable
-value for each pattern individually. The @var{variable-assignment} can
-be any valid form of assignment. Any command line variable setting will
-take precedence, unless @code{override} is specified.
-
-For example:
-
-@example
-%.o : CFLAGS = -O
-@end example
-
-@noindent
-will assign @code{CFLAGS} the value of @samp{-O} for all targets
-matching the pattern @code{%.o}.
-
-@node Special Variables, , Pattern-specific, Using Variables
-@comment node-name, next, previous, up
-@section Other Special Variables
-@cindex makefiles, and special variables
-@cindex special variables
-
-GNU @code{make} supports some variables that have special properties.
-
-@table @code
-
-@vindex MAKEFILE_LIST @r{(list of parsed makefiles)}
-@cindex makefiles, and @code{MAKEFILE_LIST} variable
-@cindex including (@code{MAKEFILE_LIST} variable)
-@item MAKEFILE_LIST
-Contains the name of each makefile that is parsed by @code{make}, in
-the order in which it was parsed. The name is appended just
-before @code{make} begins to parse the makefile. Thus, if the first
-thing a makefile does is examine the last word in this variable, it
-will be the name of the current makefile. Once the current makefile
-has used @code{include}, however, the last word will be the
-just-included makefile.
-
-If a makefile named @code{Makefile} has this content:
-
-@example
-@group
-name1 := $(lastword $(MAKEFILE_LIST))
-
-include inc.mk
-
-name2 := $(lastword $(MAKEFILE_LIST))
-
-all:
- @@echo name1 = $(name1)
- @@echo name2 = $(name2)
-@end group
-@end example
-
-@noindent
-then you would expect to see this output:
-
-@example
-@group
-name1 = Makefile
-name2 = inc.mk
-@end group
-@end example
-
-@vindex .DEFAULT_GOAL @r{(define default goal)}
-@item .DEFAULT_GOAL
-Sets the default goal to be used if no targets were specified on the
-command line (@pxref{Goals, , Arguments to Specify the Goals}). The
-@code{.DEFAULT_GOAL} variable allows you to discover the current
-default goal, restart the default goal selection algorithm by clearing
-its value, or to explicitly set the default goal. The following
-example illustrates these cases:
-
-@example
-@group
-# Query the default goal.
-ifeq ($(.DEFAULT_GOAL),)
- $(warning no default goal is set)
-endif
-
-.PHONY: foo
-foo: ; @@echo $@@
-
-$(warning default goal is $(.DEFAULT_GOAL))
-
-# Reset the default goal.
-.DEFAULT_GOAL :=
-
-.PHONY: bar
-bar: ; @@echo $@@
-
-$(warning default goal is $(.DEFAULT_GOAL))
-
-# Set our own.
-.DEFAULT_GOAL := foo
-@end group
-@end example
-
-This makefile prints:
-
-@example
-@group
-no default goal is set
-default goal is foo
-default goal is bar
-foo
-@end group
-@end example
-
-Note that assigning more than one target name to @code{.DEFAULT_GOAL} is
-illegal and will result in an error.
-
-@vindex MAKE_RESTARTS @r{(number of times @code{make} has restarted)}
-@item MAKE_RESTARTS
-This variable is set only if this instance of @code{make} has
-restarted (@pxref{Remaking Makefiles, , How Makefiles Are Remade}): it
-will contain the number of times this instance has restarted. Note
-this is not the same as recursion (counted by the @code{MAKELEVEL}
-variable). You should not set, modify, or export this variable.
-
-@vindex .CMDPREFIX @r{(change the recipe prefix character)}
-@item .CMDPREFIX
-The first character of the value of this variable is used as the
-character make assumes is introducing a recipe line. If the variable
-is empty (as it is by default) that character is the standard tab
-character. For example, this is a valid makefile:
-
-@example
-@group
-.CMDPREFIX = >
-all:
-> @@echo Hello, world
-@end group
-@end example
-
-The value of @code{.CMDPREFIX} can be changed multiple times; once set
-it stays in effect for all rules parsed until it is modified.
-
-@vindex .VARIABLES @r{(list of variables)}
-@item .VARIABLES
-Expands to a list of the @emph{names} of all global variables defined
-so far. This includes variables which have empty values, as well as
-built-in variables (@pxref{Implicit Variables, , Variables Used by
-Implicit Rules}), but does not include any variables which are only
-defined in a target-specific context. Note that any value you assign
-to this variable will be ignored; it will always return its special
-value.
-
-@c @vindex .TARGETS @r{(list of targets)}
-@c @item .TARGETS
-@c The second special variable is @code{.TARGETS}. When expanded, the
-@c value consists of a list of all targets defined in all makefiles read
-@c up until that point. Note it's not enough for a file to be simply
-@c mentioned in the makefile to be listed in this variable, even if it
-@c would match an implicit rule and become an ``implicit target''. The
-@c file must appear as a target, on the left-hand side of a ``:'', to be
-@c considered a target for the purposes of this variable.
-
-@vindex .FEATURES @r{(list of supported features)}
-@item .FEATURES
-Expands to a list of special features supported by this version of
-@code{make}. Possible values include:
-
-@table @samp
-
-@item archives
-Supports @code{ar} (archive) files using special filename syntax.
-@xref{Archives, ,Using @code{make} to Update Archive Files}.
-
-@item check-symlink
-Supports the @code{-L} (@code{--check-symlink-times}) flag.
-@xref{Options Summary, ,Summary of Options}.
-
-@item else-if
-Supports ``else if'' non-nested conditionals. @xref{Conditional
-Syntax, ,Syntax of Conditionals}.
-
-@item jobserver
-Supports ``job server'' enhanced parallel builds. @xref{Parallel,
-,Parallel Execution}.
-
-@item second-expansion
-Supports secondary expansion of prerequisite lists.
-
-@item order-only
-Supports order-only prerequisites. @xref{Prerequisite Types, ,Types
-of Prerequisites}.
-
-@item target-specific
-Supports target-specific and pattern-specific variable assignments.
-@xref{Target-specific, ,Target-specific Variable Values}.
-
-@end table
-
-@vindex .INCLUDE_DIRS @r{(list of include directories)}
-@item .INCLUDE_DIRS
-Expands to a list of directories that @code{make} searches for
-included makefiles (@pxref{Include, , Including Other Makefiles}).
-
-@end table
-
-@node Conditionals, Functions, Using Variables, Top
-@chapter Conditional Parts of Makefiles
-
-@cindex conditionals
-A @dfn{conditional} directive causes part of a makefile to be obeyed
-or ignored depending on the values of variables. Conditionals can
-compare the value of one variable to another, or the value of a
-variable to a constant string. Conditionals control what @code{make}
-actually ``sees'' in the makefile, so they @emph{cannot} be used to
-control recipes at the time of execution.@refill
-
-@menu
-* Conditional Example:: Example of a conditional
-* Conditional Syntax:: The syntax of conditionals.
-* Testing Flags:: Conditionals that test flags.
-@end menu
-
-@node Conditional Example, Conditional Syntax, Conditionals, Conditionals
-@section Example of a Conditional
-
-The following example of a 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 recipe lines will be used for the rule. The result is that
-@samp{CC=gcc} as an argument to @code{make} changes not only 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
-
-This conditional uses three directives: one @code{ifeq}, one @code{else}
-and one @code{endif}.
-
-The @code{ifeq} directive begins the conditional, and specifies the
-condition. It 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.
-
-As this example illustrates, conditionals work at the textual level:
-the lines of the conditional are treated as part of the makefile, or
-ignored, according to the condition. This is why the larger syntactic
-units of the makefile, such as rules, may cross the beginning or the
-end of the conditional.
-
-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, the 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 ifndef
-@findex ifneq
-@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
-
-or:
-
-@example
-@var{conditional-directive}
-@var{text-if-one-is-true}
-else @var{conditional-directive}
-@var{text-if-true}
-else
-@var{text-if-false}
-endif
-@end example
-
-@noindent
-There can be as many ``@code{else} @var{conditional-directive}''
-clauses as necessary. Once a given condition is true,
-@var{text-if-true} is used and no other clause is used; if no
-condition is true then @var{text-if-false} is used. The
-@var{text-if-true} and @var{text-if-false} can be any number of lines
-of text.
-
-The syntax of the @var{conditional-directive} is the same whether the
-conditional is simple or complex; after an @code{else} or not. There
-are four different directives that test different conditions. Here is
-a table of them:
-
-@table @code
-@item ifeq (@var{arg1}, @var{arg2})
-@itemx ifeq '@var{arg1}' '@var{arg2}'
-@itemx ifeq "@var{arg1}" "@var{arg2}"
-@itemx ifeq "@var{arg1}" '@var{arg2}'
-@itemx 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.
-
-Often you want to test if a variable has a non-empty value. When the
-value results from complex expansions of variables and functions,
-expansions you would consider empty may actually contain whitespace
-characters and thus are not seen as empty. However, you can use the
-@code{strip} function (@pxref{Text Functions}) to avoid interpreting
-whitespace as a non-empty value. For example:
-
-@example
-@group
-ifeq ($(strip $(foo)),)
-@var{text-if-empty}
-endif
-@end group
-@end example
-
-@noindent
-will evaluate @var{text-if-empty} even if the expansion of
-@code{$(foo)} contains whitespace characters.
-
-@item ifneq (@var{arg1}, @var{arg2})
-@itemx ifneq '@var{arg1}' '@var{arg2}'
-@itemx ifneq "@var{arg1}" "@var{arg2}"
-@itemx ifneq "@var{arg1}" '@var{arg2}'
-@itemx 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}
-The @code{ifdef} form takes the @emph{name} of a variable as its
-argument, not a reference to a variable. The value of that variable
-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. The text @var{variable-name}
-is expanded, so it could be a variable or function that expands
-to the name of a variable. For example:
-
-@example
-bar = true
-foo = bar
-ifdef $(foo)
-frobozz = yes
-endif
-@end example
-
-The variable reference @code{$(foo)} is expanded, yielding @code{bar},
-which is considered to be the name of a variable. The variable
-@code{bar} is not expanded, but its value is examined to determine if
-it is non-empty.
-
-Note that @code{ifdef} only tests whether a variable has a value. It
-does not expand the variable to see if that value is nonempty.
-Consequently, tests using @code{ifdef} return true for all definitions
-except those like @code{foo =}. To test for an empty value, use
-@w{@code{ifeq ($(foo),)}}. For example,
-
-@example
-bar =
-foo = $(bar)
-ifdef foo
-frobozz = yes
-else
-frobozz = no
-endif
-@end example
-
-@noindent
-sets @samp{frobozz} to @samp{yes}, while:
-
-@example
-foo =
-ifdef foo
-frobozz = yes
-else
-frobozz = no
-endif
-@end example
-
-@noindent
-sets @samp{frobozz} to @samp{no}.
-
-@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. The rules for expansion and testing of
-@var{variable-name} are identical to the @code{ifdef} directive.
-@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 part of a recipe 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.
-
-Conditionals affect which lines of the makefile @code{make} uses. If
-the condition is true, @code{make} reads the lines of the
-@var{text-if-true} as part of the makefile; if the condition is false,
-@code{make} ignores those lines 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
-
-@code{make} evaluates conditionals when it reads a makefile.
-Consequently, you cannot use automatic variables in the tests of
-conditionals because they are not defined until recipes are run
-(@pxref{Automatic Variables}).
-
-To prevent intolerable confusion, it is not permitted to start a
-conditional in one makefile and end it in another. However, you may
-write an @code{include} directive within a conditional, provided you do
-not attempt to terminate the conditional inside the included file.
-
-@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
-(@pxref{Text Functions, , Functions for String Substitution and Analysis}).
-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)))
- +touch archive.a
- +ranlib -t archive.a
-else
- ranlib archive.a
-endif
-@end example
-
-@noindent
-The @samp{+} prefix marks those recipe lines as ``recursive'' so that
-they will be executed despite use of the @samp{-t} flag.
-@xref{Recursion, ,Recursive Use of @code{make}}.
-
-@node Functions, Running, Conditionals, Top
-@chapter Functions for Transforming Text
-@cindex functions
-
-@dfn{Functions} allow you to do text processing in the makefile to
-compute the files to operate on or the commands to use in recipes.
-You use a function in a @dfn{function call}, where you give the name
-of the function and some text (the @dfn{arguments}) for the function
-to operate on. The result of the function's processing is substituted
-into the makefile at the point of the call, just as a variable might
-be substituted.
-
-@menu
-* Syntax of Functions:: How to write a function call.
-* Text Functions:: General-purpose text manipulation functions.
-* File Name Functions:: Functions for manipulating file names.
-* Conditional Functions:: Functions that implement conditions.
-* Foreach Function:: Repeat some text with controlled variation.
-* Call Function:: Expand a user-defined function.
-* Value Function:: Return the un-expanded value of a variable.
-* Eval Function:: Evaluate the arguments as makefile syntax.
-* Origin Function:: Find where a variable got its value.
-* Flavor Function:: Find out the flavor of a variable.
-* Shell Function:: Substitute the output of a shell command.
-* Make Control Functions:: Functions that control how make runs.
-@end menu
-
-@node Syntax of Functions, Text Functions, Functions, Functions
-@section Function Call Syntax
-@cindex @code{$}, in function call
-@cindex dollar sign (@code{$}), in function call
-@cindex arguments of functions
-@cindex functions, syntax of
-
-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}. You can also essentially create your own
-functions by using the @code{call} builtin function.
-
-The @var{arguments} are the arguments of the function. They are
-separated from the function name by one or more spaces or tabs, and if
-there is more than one argument, then they are separated by commas.
-Such whitespace and commas are not part of an argument's value. The
-delimiters which you use to surround the function call, whether
-parentheses or braces, can appear in an argument only in matching pairs;
-the other kind of delimiters may appear singly. If the arguments
-themselves contain other function calls or variable references, it is
-wisest to use the same kind of delimiters for all the references; write
-@w{@samp{$(subst a,b,$(x))}}, not @w{@samp{$(subst a,b,$@{x@})}}. This
-is because it is clearer, and because only one type of delimiter is
-matched to find the end of the reference.
-
-The text written for each argument is processed by substitution of
-variables and function calls to produce the argument value, which
-is the text on which the function acts. The substitution is done in the
-order in which the arguments appear.
-
-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 these variables where such characters are wanted, like this:
-
-@example
-@group
-comma:= ,
-empty:=
-space:= $(empty) $(empty)
-foo:= a b c
-bar:= $(subst $(space),$(comma),$(foo))
-# @r{bar is now `a,b,c'.}
-@end group
-@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, File Name Functions, Syntax of Functions, Functions
-@section Functions for String Substitution and Analysis
-@cindex functions, for text
-
-Here are some functions that operate on strings:
-
-@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}. Only the first
-@samp{%} in the @var{pattern} and @var{replacement} is treated this
-way; any subsequent @samp{%} is unchanged.@refill
-
-@cindex @code{%}, quoting in @code{patsubst}
-@cindex @code{%}, quoting with @code{\} (backslash)
-@cindex @code{\} (backslash), to quote @code{%}
-@cindex backslash (@code{\}), to quote @code{%}
-@cindex quoting @code{%}, in @code{patsubst}
-@samp{%} characters in @code{patsubst} function invocations can be
-quoted with preceding backslashes (@samp{\}). Backslashes that would
-otherwise quote @samp{%} characters can be quoted with more backslashes.
-Backslashes that quote @samp{%} characters or other backslashes are
-removed from the pattern before it is compared file names or has a stem
-substituted into it. Backslashes that are not in danger of quoting
-@samp{%} characters go unmolested. For example, the pattern
-@file{the\%weird\\%pattern\\} has @samp{the%weird\} preceding the
-operative @samp{%} character, and @samp{pattern\\} following it. The
-final two backslashes are left alone because they cannot affect any
-@samp{%} character.@refill
-
-Whitespace between words is folded into single space characters;
-leading and trailing whitespace is discarded.
-
-For example,
-
-@example
-$(patsubst %.c,%.o,x.c.c bar.c)
-@end example
-
-@noindent
-produces the value @samp{x.c.o bar.o}.
-
-Substitution references (@pxref{Substitution Refs, ,Substitution
-References}) are a simpler way to get the effect of the @code{patsubst}
-function:
-
-@example
-$(@var{var}:@var{pattern}=@var{replacement})
-@end example
-
-@noindent
-is equivalent to
-
-@example
-$(patsubst @var{pattern},@var{replacement},$(@var{var}))
-@end example
-
-The second shorthand simplifies one of the most common uses of
-@code{patsubst}: replacing the suffix at the end of file names.
-
-@example
-$(@var{var}:@var{suffix}=@var{replacement})
-@end example
-
-@noindent
-is equivalent to
-
-@example
-$(patsubst %@var{suffix},%@var{replacement},$(@var{var}))
-@end example
-
-@noindent
-For example, you might have a list of object files:
-
-@example
-objects = foo.o bar.o baz.o
-@end example
-
-@noindent
-To get the list of corresponding source files, you could simply write:
-
-@example
-$(objects:.o=.c)
-@end example
-
-@noindent
-instead of using the general form:
-
-@example
-$(patsubst %.o,%.c,$(objects))
-@end example
-
-@item $(strip @var{string})
-@cindex stripping whitespace
-@cindex whitespace, stripping
-@cindex spaces, stripping
-@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. Thus, @samp{$(strip a b c )} results in @w{@samp{a b c}}.
-
-The function @code{strip} can be very useful when used in conjunction
-with conditionals. When comparing something with the empty string
-@samp{} using @code{ifeq} or @code{ifneq}, you usually want a string of
-just whitespace to match the empty string (@pxref{Conditionals}).
-
-Thus, the following may fail to have the desired results:
-
-@example
-.PHONY: all
-ifneq "$(needs_made)" ""
-all: $(needs_made)
-else
-all:;@@echo 'Nothing to make!'
-endif
-@end example
-
-@noindent
-Replacing the variable reference @w{@samp{$(needs_made)}} with the
-function call @w{@samp{$(strip $(needs_made))}} in the @code{ifneq}
-directive would make it more robust.@refill
-
-@item $(findstring @var{find},@var{in})
-@findex findstring
-@cindex searching for strings
-@cindex finding strings
-@cindex strings, searching for
-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. Thus, the two examples,
-
-@example
-$(findstring a,a b c)
-$(findstring a,b c)
-@end example
-
-@noindent
-produce the values @samp{a} and @samp{} (the empty string),
-respectively. @xref{Testing Flags}, for a practical application of
-@code{findstring}.@refill
-
-@need 750
-@findex filter
-@cindex filtering words
-@cindex words, filtering
-@item $(filter @var{pattern}@dots{},@var{text})
-Returns all whitespace-separated words in @var{text} that @emph{do} match
-any of the @var{pattern} words, removing any words that @emph{do not}
-match. The patterns are written using @samp{%}, just like the patterns
-used in the @code{patsubst} function above.@refill
-
-The @code{filter} function can be used to separate out different types
-of strings (such as file names) in a variable. For example:
-
-@example
-sources := foo.c bar.c baz.s ugh.h
-foo: $(sources)
- cc $(filter %.c %.s,$(sources)) -o foo
-@end example
-
-@noindent
-says that @file{foo} depends of @file{foo.c}, @file{bar.c},
-@file{baz.s} and @file{ugh.h} but only @file{foo.c}, @file{bar.c} and
-@file{baz.s} should be specified in the command to the
-compiler.@refill
-
-@item $(filter-out @var{pattern}@dots{},@var{text})
-@findex filter-out
-@cindex filtering out words
-@cindex words, filtering out
-Returns all whitespace-separated words in @var{text} that @emph{do not}
-match any of the @var{pattern} words, removing the words that @emph{do}
-match one or more. This is the exact opposite of the @code{filter}
-function.@refill
-
-For example, given:
-
-@example
-@group
-objects=main1.o foo.o main2.o bar.o
-mains=main1.o main2.o
-@end group
-@end example
-
-@noindent
-the following generates a list which contains all the object files not
-in @samp{mains}:
-
-@example
-$(filter-out $(mains),$(objects))
-@end example
-
-@need 1500
-@findex sort
-@cindex sorting words
-@item $(sort @var{list})
-Sorts the words of @var{list} in lexical order, removing duplicate
-words. The output is a list of words separated by single spaces.
-Thus,
-
-@example
-$(sort foo bar lose)
-@end example
-
-@noindent
-returns the value @samp{bar foo lose}.
-
-@cindex removing duplicate words
-@cindex duplicate words, removing
-@cindex words, removing duplicates
-Incidentally, since @code{sort} removes duplicate words, you can use
-it for this purpose even if you don't care about the sort order.
-
-@item $(word @var{n},@var{text})
-@findex word
-@cindex word, selecting a
-@cindex selecting a word
-Returns the @var{n}th word of @var{text}. The legitimate values of
-@var{n} start from 1. If @var{n} is bigger than the number of words
-in @var{text}, the value is empty. For example,
-
-@example
-$(word 2, foo bar baz)
-@end example
-
-@noindent
-returns @samp{bar}.
-
-@item $(wordlist @var{s},@var{e},@var{text})
-@findex wordlist
-@cindex words, selecting lists of
-@cindex selecting word lists
-Returns the list of words in @var{text} starting with word @var{s} and
-ending with word @var{e} (inclusive). The legitimate values of @var{s}
-start from 1; @var{e} may start from 0. If @var{s} is bigger than the
-number of words in @var{text}, the value is empty. If @var{e} is
-bigger than the number of words in @var{text}, words up to the end of
-@var{text} are returned. If @var{s} is greater than @var{e}, nothing
-is returned. For example,
-
-@example
-$(wordlist 2, 3, foo bar baz)
-@end example
-
-@noindent
-returns @samp{bar baz}.
-
-@c Following item phrased to prevent overfull hbox. --RJC 17 Jul 92
-@item $(words @var{text})
-@findex words
-@cindex words, finding number
-Returns the number of words in @var{text}.
-Thus, the last word of @var{text} is
-@w{@code{$(word $(words @var{text}),@var{text})}}.@refill
-
-@item $(firstword @var{names}@dots{})
-@findex firstword
-@cindex words, extracting first
-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}. Although @code{$(firstword
-@var{text})} is the same as @code{$(word 1,@var{text})}, the
-@code{firstword} function is retained for its simplicity.@refill
-
-
-@item $(lastword @var{names}@dots{})
-@findex lastword
-@cindex words, extracting last
-The argument @var{names} is regarded as a series of names, separated
-by whitespace. The value is the last name in the series.
-
-For example,
-
-@example
-$(lastword foo bar)
-@end example
-
-@noindent
-produces the result @samp{bar}. Although @code{$(lastword
-@var{text})} is the same as @code{$(word $(words @var{text}),@var{text})},
-the @code{lastword} function was added for its simplicity and better
-performance.@refill
-@end table
-
-
-Here is a realistic example of the use of @code{subst} and
-@code{patsubst}. Suppose that a makefile uses the @code{VPATH} variable
-to specify a list of directories that @code{make} should search for
-prerequisite files
-(@pxref{General Search, , @code{VPATH} Search Path for All Prerequisites}).
-This example shows how to
-tell the C compiler to search for header files in the same list of
-directories.@refill
-
-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 @code{patsubst} is used to turn
-each directory name into a @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
-override CFLAGS += $(patsubst %,-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 @code{override} directive is
-used so that the new value is assigned even if the previous value of
-@code{CFLAGS} was specified with a command argument (@pxref{Override
-Directive, , The @code{override} Directive}).
-
-@node File Name Functions, Conditional Functions, Text Functions, Functions
-@section Functions for File Names
-@cindex functions, for file names
-@cindex file name functions
-
-Several of the built-in expansion functions relate specifically to
-taking apart file names or lists of file names.
-
-Each of the following 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}@dots{})
-@findex dir
-@cindex directory part
-@cindex file name, directory part
-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}@dots{})
-@findex notdir
-@cindex file name, nondirectory part
-@cindex nondirectory part
-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}@dots{})
-@findex suffix
-@cindex suffix, function to find
-@cindex file name 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 src-1.0/bar.c hacks)
-@end example
-
-@noindent
-produces the result @samp{.c .c}.
-
-@item $(basename @var{names}@dots{})
-@findex basename
-@cindex basename
-@cindex file name, basename of
-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. Periods in the directory part are
-ignored. If there is no period, the basename is the entire file name.
-For example,
-
-@example
-$(basename src/foo.c src-1.0/bar hacks)
-@end example
-
-@noindent
-produces the result @samp{src/foo src-1.0/bar hacks}.
-
-@c plural convention with dots (be consistent)
-@item $(addsuffix @var{suffix},@var{names}@dots{})
-@findex addsuffix
-@cindex suffix, adding
-@cindex file name suffix, adding
-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}@dots{})
-@findex addprefix
-@cindex prefix, adding
-@cindex file name prefix, adding
-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 prepended 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
-@cindex joining lists of words
-@cindex words, joining lists
-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.
-
-For example, @samp{$(join a b,.c .o)} produces @samp{a.c b.o}.
-
-Whitespace between the words in the lists is not preserved; it is
-replaced with a single space.
-
-This function can merge the results of the @code{dir} and
-@code{notdir} functions, to produce the original list of files which
-was given to those two functions.@refill
-
-@item $(wildcard @var{pattern})
-@findex wildcard
-@cindex wildcard, function
-The argument @var{pattern} is a file name pattern, typically containing
-wildcard characters (as in shell file name patterns). The result of
-@code{wildcard} is a space-separated list of the names of existing files
-that match the pattern.
-@xref{Wildcards, ,Using Wildcard Characters in File Names}.
-
-@item $(realpath @var{names}@dots{})
-@findex realpath
-@cindex realpath
-@cindex file name, realpath of
-For each file name in @var{names} return the canonical absolute name.
-A canonical name does not contain any @code{.} or @code{..} components,
-nor any repeated path separators (@code{/}) or symlinks. In case of a
-failure the empty string is returned. Consult the @code{realpath(3)}
-documentation for a list of possible failure causes.
-
-@item $(abspath @var{names}@dots{})
-@findex abspath
-@cindex abspath
-@cindex file name, abspath of
-For each file name in @var{names} return an absolute name that does
-not contain any @code{.} or @code{..} components, nor any repeated path
-separators (@code{/}). Note that, in contrast to @code{realpath}
-function, @code{abspath} does not resolve symlinks and does not require
-the file names to refer to an existing file or directory. Use the
-@code{wildcard} function to test for existence.
-@end table
-
-@node Conditional Functions, Foreach Function, File Name Functions, Functions
-@section Functions for Conditionals
-@findex if
-@cindex conditional expansion
-There are three functions that provide conditional expansion. A key
-aspect of these functions is that not all of the arguments are
-expanded initially. Only those arguments which need to be expanded,
-will be expanded.
-
-@table @code
-@item $(if @var{condition},@var{then-part}[,@var{else-part}])
-@findex if
-The @code{if} function provides support for conditional expansion in a
-functional context (as opposed to the GNU @code{make} makefile
-conditionals such as @code{ifeq} (@pxref{Conditional Syntax, ,Syntax of
-Conditionals}).
-
-The first argument, @var{condition}, first has all preceding and
-trailing whitespace stripped, then is expanded. If it expands to any
-non-empty string, then the condition is considered to be true. If it
-expands to an empty string, the condition is considered to be false.
-
-If the condition is true then the second argument, @var{then-part}, is
-evaluated and this is used as the result of the evaluation of the entire
-@code{if} function.
-
-If the condition is false then the third argument, @var{else-part}, is
-evaluated and this is the result of the @code{if} function. If there is
-no third argument, the @code{if} function evaluates to nothing (the
-empty string).
-
-Note that only one of the @var{then-part} or the @var{else-part} will be
-evaluated, never both. Thus, either can contain side-effects (such as
-@code{shell} function calls, etc.)
-
-@item $(or @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]])
-@findex or
-The @code{or} function provides a ``short-circuiting'' OR operation.
-Each argument is expanded, in order. If an argument expands to a
-non-empty string the processing stops and the result of the expansion
-is that string. If, after all arguments are expanded, all of them are
-false (empty), then the result of the expansion is the empty string.
-
-@item $(and @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]])
-@findex and
-The @code{and} function provides a ``short-circuiting'' AND operation.
-Each argument is expanded, in order. If an argument expands to an
-empty string the processing stops and the result of the expansion is
-the empty string. If all arguments expand to a non-empty string then
-the result of the expansion is the expansion of the last argument.
-
-@end table
-
-@node Foreach Function, Call Function, Conditional Functions, Functions
-@section The @code{foreach} Function
-@findex foreach
-@cindex words, iterating over
-
-The @code{foreach} function is very different from other functions. It
-causes one piece of text to be used repeatedly, each time with a different
-substitution performed on it. It resembles the @code{for} command in the
-shell @code{sh} and the @code{foreach} command in the C-shell @code{csh}.
-
-The syntax of the @code{foreach} function is:
-
-@example
-$(foreach @var{var},@var{list},@var{text})
-@end example
-
-@noindent
-The first two arguments, @var{var} and @var{list}, are expanded before
-anything else is done; note that the last argument, @var{text}, is
-@strong{not} expanded at the same time. Then for each word of the expanded
-value of @var{list}, the variable named by the expanded value of @var{var}
-is set to that word, and @var{text} is expanded. Presumably @var{text}
-contains references to that variable, so its expansion will be different
-each time.
-
-The result is that @var{text} is expanded as many times as there are
-whitespace-separated words in @var{list}. The multiple expansions of
-@var{text} are concatenated, with spaces between them, to make the result
-of @code{foreach}.
-
-This simple example sets the variable @samp{files} to the list of all files
-in the directories in the list @samp{dirs}:
-
-@example
-dirs := a b c d
-files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
-@end example
-
-Here @var{text} is @samp{$(wildcard $(dir)/*)}. The first repetition
-finds the value @samp{a} for @code{dir}, so it produces the same result
-as @samp{$(wildcard a/*)}; the second repetition produces the result
-of @samp{$(wildcard b/*)}; and the third, that of @samp{$(wildcard c/*)}.
-
-This example has the same result (except for setting @samp{dirs}) as
-the following example:
-
-@example
-files := $(wildcard a/* b/* c/* d/*)
-@end example
-
-When @var{text} is complicated, you can improve readability by giving it
-a name, with an additional variable:
-
-@example
-find_files = $(wildcard $(dir)/*)
-dirs := a b c d
-files := $(foreach dir,$(dirs),$(find_files))
-@end example
-
-@noindent
-Here we use the variable @code{find_files} this way. We use plain @samp{=}
-to define a recursively-expanding variable, so that its value contains an
-actual function call to be reexpanded under the control of @code{foreach};
-a simply-expanded variable would not do, since @code{wildcard} would be
-called only once at the time of defining @code{find_files}.
-
-The @code{foreach} function has no permanent effect on the variable
-@var{var}; its value and flavor after the @code{foreach} function call are
-the same as they were beforehand. The other values which are taken from
-@var{list} are in effect only temporarily, during the execution of
-@code{foreach}. The variable @var{var} is a simply-expanded variable
-during the execution of @code{foreach}. If @var{var} was undefined
-before the @code{foreach} function call, it is undefined after the call.
-@xref{Flavors, ,The Two Flavors of Variables}.@refill
-
-You must take care when using complex variable expressions that result in
-variable names because many strange things are valid variable names, but
-are probably not what you intended. For example,
-
-@smallexample
-files := $(foreach Esta escrito en espanol!,b c ch,$(find_files))
-@end smallexample
-
-@noindent
-might be useful if the value of @code{find_files} references the variable
-whose name is @samp{Esta escrito en espanol!} (es un nombre bastante largo,
-no?), but it is more likely to be a mistake.
-
-@node Call Function, Value Function, Foreach Function, Functions
-@section The @code{call} Function
-@findex call
-@cindex functions, user defined
-@cindex user defined functions
-
-The @code{call} function is unique in that it can be used to create new
-parameterized functions. You can write a complex expression as the
-value of a variable, then use @code{call} to expand it with different
-values.
-
-The syntax of the @code{call} function is:
-
-@example
-$(call @var{variable},@var{param},@var{param},@dots{})
-@end example
-
-When @code{make} expands this function, it assigns each @var{param} to
-temporary variables @code{$(1)}, @code{$(2)}, etc. The variable
-@code{$(0)} will contain @var{variable}. There is no maximum number of
-parameter arguments. There is no minimum, either, but it doesn't make
-sense to use @code{call} with no parameters.
-
-Then @var{variable} is expanded as a @code{make} variable in the context
-of these temporary assignments. Thus, any reference to @code{$(1)} in
-the value of @var{variable} will resolve to the first @var{param} in the
-invocation of @code{call}.
-
-Note that @var{variable} is the @emph{name} of a variable, not a
-@emph{reference} to that variable. Therefore you would not normally use
-a @samp{$} or parentheses when writing it. (You can, however, use a
-variable reference in the name if you want the name not to be a
-constant.)
-
-If @var{variable} is the name of a builtin function, the builtin function
-is always invoked (even if a @code{make} variable by that name also
-exists).
-
-The @code{call} function expands the @var{param} arguments before
-assigning them to temporary variables. This means that @var{variable}
-values containing references to builtin functions that have special
-expansion rules, like @code{foreach} or @code{if}, may not work as you
-expect.
-
-Some examples may make this clearer.
-
-This macro simply reverses its arguments:
-
-@smallexample
-reverse = $(2) $(1)
-
-foo = $(call reverse,a,b)
-@end smallexample
-
-@noindent
-Here @var{foo} will contain @samp{b a}.
-
-This one is slightly more interesting: it defines a macro to search for
-the first instance of a program in @code{PATH}:
-
-@smallexample
-pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH)))))
-
-LS := $(call pathsearch,ls)
-@end smallexample
-
-@noindent
-Now the variable LS contains @code{/bin/ls} or similar.
-
-The @code{call} function can be nested. Each recursive invocation gets
-its own local values for @code{$(1)}, etc.@: that mask the values of
-higher-level @code{call}. For example, here is an implementation of a
-@dfn{map} function:
-
-@smallexample
-map = $(foreach a,$(2),$(call $(1),$(a)))
-@end smallexample
-
-Now you can @var{map} a function that normally takes only one argument,
-such as @code{origin}, to multiple values in one step:
-
-@smallexample
-o = $(call map,origin,o map MAKE)
-@end smallexample
-
-and end up with @var{o} containing something like @samp{file file default}.
-
-A final caution: be careful when adding whitespace to the arguments to
-@code{call}. As with other functions, any whitespace contained in the
-second and subsequent arguments is kept; this can cause strange
-effects. It's generally safest to remove all extraneous whitespace when
-providing parameters to @code{call}.
-
-@node Value Function, Eval Function, Call Function, Functions
-@comment node-name, next, previous, up
-@section The @code{value} Function
-@findex value
-@cindex variables, unexpanded value
-
-The @code{value} function provides a way for you to use the value of a
-variable @emph{without} having it expanded. Please note that this
-does not undo expansions which have already occurred; for example if
-you create a simply expanded variable its value is expanded during the
-definition; in that case the @code{value} function will return the
-same result as using the variable directly.
-
-The syntax of the @code{value} function is:
-
-@example
-$(value @var{variable})
-@end example
-
-Note that @var{variable} is the @emph{name} of a variable; not a
-@emph{reference} to that variable. Therefore you would not normally
-use a @samp{$} or parentheses when writing it. (You can, however, use
-a variable reference in the name if you want the name not to be a
-constant.)
-
-The result of this function is a string containing the value of
-@var{variable}, without any expansion occurring. For example, in this
-makefile:
-
-@example
-@group
-FOO = $PATH
-
-all:
- @@echo $(FOO)
- @@echo $(value FOO)
-@end group
-@end example
-
-@noindent
-The first output line would be @code{ATH}, since the ``$P'' would be
-expanded as a @code{make} variable, while the second output line would
-be the current value of your @code{$PATH} environment variable, since
-the @code{value} function avoided the expansion.
-
-The @code{value} function is most often used in conjunction with the
-@code{eval} function (@pxref{Eval Function}).
-
-@node Eval Function, Origin Function, Value Function, Functions
-@comment node-name, next, previous, up
-@section The @code{eval} Function
-@findex eval
-@cindex evaluating makefile syntax
-@cindex makefile syntax, evaluating
-
-The @code{eval} function is very special: it allows you to define new
-makefile constructs that are not constant; which are the result of
-evaluating other variables and functions. The argument to the
-@code{eval} function is expanded, then the results of that expansion
-are parsed as makefile syntax. The expanded results can define new
-@code{make} variables, targets, implicit or explicit rules, etc.
-
-The result of the @code{eval} function is always the empty string;
-thus, it can be placed virtually anywhere in a makefile without
-causing syntax errors.
-
-It's important to realize that the @code{eval} argument is expanded
-@emph{twice}; first by the @code{eval} function, then the results of
-that expansion are expanded again when they are parsed as makefile
-syntax. This means you may need to provide extra levels of escaping
-for ``$'' characters when using @code{eval}. The @code{value}
-function (@pxref{Value Function}) can sometimes be useful in these
-situations, to circumvent unwanted expansions.
-
-Here is an example of how @code{eval} can be used; this example
-combines a number of concepts and other functions. Although it might
-seem overly complex to use @code{eval} in this example, rather than
-just writing out the rules, consider two things: first, the template
-definition (in @code{PROGRAM_template}) could need to be much more
-complex than it is here; and second, you might put the complex,
-``generic'' part of this example into another makefile, then include
-it in all the individual makefiles. Now your individual makefiles are
-quite straightforward.
-
-@example
-@group
-PROGRAMS = server client
-
-server_OBJS = server.o server_priv.o server_access.o
-server_LIBS = priv protocol
-
-client_OBJS = client.o client_api.o client_mem.o
-client_LIBS = protocol
-
-# Everything after this is generic
-
-.PHONY: all
-all: $(PROGRAMS)
-
-define PROGRAM_template
- $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
- ALL_OBJS += $$($(1)_OBJS)
-endef
-
-$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
-
-$(PROGRAMS):
- $(LINK.o) $^ $(LDLIBS) -o $@@
-
-clean:
- rm -f $(ALL_OBJS) $(PROGRAMS)
-@end group
-@end example
-
-@node Origin Function, Flavor Function, Eval Function, Functions
-@section The @code{origin} Function
-@findex origin
-@cindex variables, origin of
-@cindex origin of variable
-
-The @code{origin} function is unlike most other functions in that it does
-not operate on the values of variables; it tells you something @emph{about}
-a variable. Specifically, it tells you where it came from.
-
-The syntax of the @code{origin} function is:
-
-@example
-$(origin @var{variable})
-@end example
-
-Note that @var{variable} is the @emph{name} of a variable to inquire about;
-not a @emph{reference} to that variable. Therefore you would not normally
-use a @samp{$} or parentheses when writing it. (You can, however, use a
-variable reference in the name if you want the name not to be a constant.)
-
-The result of this function is a string telling you how the variable
-@var{variable} was defined:
-
-@table @samp
-@item undefined
-
-if @var{variable} was never defined.
-
-@item default
-
-if @var{variable} has a default definition, as is usual with @code{CC}
-and so on. @xref{Implicit Variables, ,Variables Used by Implicit Rules}.
-Note that if you have redefined a default variable, the @code{origin}
-function will return the origin of the later definition.
-
-@item environment
-
-if @var{variable} was defined as an environment variable and the
-@samp{-e} option is @emph{not} turned on (@pxref{Options Summary, ,Summary of Options}).
-
-@item environment override
-
-if @var{variable} was defined as an environment variable and the
-@w{@samp{-e}} option @emph{is} turned on (@pxref{Options Summary,
-,Summary of Options}).@refill
-
-@item file
-
-if @var{variable} was defined in a makefile.
-
-@item command line
-
-if @var{variable} was defined on the command line.
-
-@item override
-
-if @var{variable} was defined with an @code{override} directive in a
-makefile (@pxref{Override Directive, ,The @code{override} Directive}).
-
-@item automatic
-
-if @var{variable} is an automatic variable defined for the execution
-of the recipe for each rule (@pxref{Automatic Variables}).
-@end table
-
-This information is primarily useful (other than for your curiosity) to
-determine if you want to believe the value of a variable. For example,
-suppose you have a makefile @file{foo} that includes another makefile
-@file{bar}. You want a variable @code{bletch} to be defined in @file{bar}
-if you run the command @w{@samp{make -f bar}}, even if the environment contains
-a definition of @code{bletch}. However, if @file{foo} defined
-@code{bletch} before including @file{bar}, you do not want to override that
-definition. This could be done by using an @code{override} directive in
-@file{foo}, giving that definition precedence over the later definition in
-@file{bar}; unfortunately, the @code{override} directive would also
-override any command line definitions. So, @file{bar} could
-include:@refill
-
-@example
-@group
-ifdef bletch
-ifeq "$(origin bletch)" "environment"
-bletch = barf, gag, etc.
-endif
-endif
-@end group
-@end example
-
-@noindent
-If @code{bletch} has been defined from the environment, this will redefine
-it.
-
-If you want to override a previous definition of @code{bletch} if it came
-from the environment, even under @samp{-e}, you could instead write:
-
-@example
-@group
-ifneq "$(findstring environment,$(origin bletch))" ""
-bletch = barf, gag, etc.
-endif
-@end group
-@end example
-
-Here the redefinition takes place if @samp{$(origin bletch)} returns either
-@samp{environment} or @samp{environment override}.
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@node Flavor Function, Shell Function, Origin Function, Functions
-@section The @code{flavor} Function
-@findex flavor
-@cindex variables, flavor of
-@cindex flavor of variable
-
-The @code{flavor} function is unlike most other functions (and like
-@code{origin} function) in that it does not operate on the values of
-variables; it tells you something @emph{about} a variable.
-Specifically, it tells you the flavor of a variable (@pxref{Flavors,
-,The Two Flavors of Variables}).
-
-The syntax of the @code{flavor} function is:
-
-@example
-$(flavor @var{variable})
-@end example
-
-Note that @var{variable} is the @emph{name} of a variable to inquire about;
-not a @emph{reference} to that variable. Therefore you would not normally
-use a @samp{$} or parentheses when writing it. (You can, however, use a
-variable reference in the name if you want the name not to be a constant.)
-
-The result of this function is a string that identifies the flavor of the
-variable @var{variable}:
-
-@table @samp
-@item undefined
-
-if @var{variable} was never defined.
-
-@item recursive
-
-if @var{variable} is a recursively expanded variable.
-
-@item simple
-
-if @var{variable} is a simply expanded variable.
-
-@end table
-
-
-@node Shell Function, Make Control Functions, Flavor Function, Functions
-@section The @code{shell} Function
-@findex shell
-@cindex command expansion
-@cindex backquotes
-@cindex shell command, function for
-
-The @code{shell} function is unlike any other function other than the
-@code{wildcard} function
-(@pxref{Wildcard Function, ,The Function @code{wildcard}}) in that it
-communicates with the world outside of @code{make}.
-
-The @code{shell} function performs the same function that backquotes
-(@samp{`}) perform in most shells: it does @dfn{command expansion}.
-This means that it takes as an argument a shell command and evaluates
-to the output of the command. The only processing @code{make} does on
-the result is to convert each newline (or carriage-return / newline
-pair) to a single space. If there is a trailing (carriage-return
-and) newline it will simply be removed.@refill
-
-The commands run by calls to the @code{shell} function are run when the
-function calls are expanded (@pxref{Reading Makefiles, , How
-@code{make} Reads a Makefile}). Because this function involves
-spawning a new shell, you should carefully consider the performance
-implications of using the @code{shell} function within recursively
-expanded variables vs.@: simply expanded variables (@pxref{Flavors, ,The
-Two Flavors of Variables}).
-
-Here are some examples of the use of the @code{shell} function:
-
-@example
-contents := $(shell cat foo)
-@end example
-
-@noindent
-sets @code{contents} to the contents of the file @file{foo}, with a space
-(rather than a newline) separating each line.
-
-@example
-files := $(shell echo *.c)
-@end example
-
-@noindent
-sets @code{files} to the expansion of @samp{*.c}. Unless @code{make} is
-using a very strange shell, this has the same result as
-@w{@samp{$(wildcard *.c)}} (as long as at least one @samp{.c} file
-exists).@refill
-
-@node Make Control Functions, , Shell Function, Functions
-@section Functions That Control Make
-@cindex functions, for controlling make
-@cindex controlling make
-
-These functions control the way make runs. Generally, they are used to
-provide information to the user of the makefile or to cause make to stop
-if some sort of environmental error is detected.
-
-@table @code
-@item $(error @var{text}@dots{})
-@findex error
-@cindex error, stopping on
-@cindex stopping make
-Generates a fatal error where the message is @var{text}. Note that
-the error is generated whenever this function is evaluated. So, if
-you put it inside a recipe or on the right side of a recursive
-variable assignment, it won't be evaluated until later. The
-@var{text} will be expanded before the error is generated.
-
-For example,
-
-@example
-ifdef ERROR1
-$(error error is $(ERROR1))
-endif
-@end example
-
-@noindent
-will generate a fatal error during the read of the makefile if the
-@code{make} variable @code{ERROR1} is defined. Or,
-
-@example
-ERR = $(error found an error!)
-
-.PHONY: err
-err: ; $(ERR)
-@end example
-
-@noindent
-will generate a fatal error while @code{make} is running, if the
-@code{err} target is invoked.
-
-@item $(warning @var{text}@dots{})
-@findex warning
-@cindex warnings, printing
-@cindex printing user warnings
-This function works similarly to the @code{error} function, above,
-except that @code{make} doesn't exit. Instead, @var{text} is expanded
-and the resulting message is displayed, but processing of the makefile
-continues.
-
-The result of the expansion of this function is the empty string.
-
-@item $(info @var{text}@dots{})
-@findex info
-@cindex printing messages
-This function does nothing more than print its (expanded) argument(s)
-to standard output. No makefile name or line number is added. The
-result of the expansion of this function is the empty string.
-@end table
-
-@node Running, Implicit Rules, 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. Usually, makefiles are written so that if you run
-@code{make} with no arguments, it does just that.
-
-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 giving arguments when you run @code{make}, you can do any of these
-things and many others.
-
-@cindex exit status of make
-The exit status of @code{make} is always one of three values:
-@table @code
-@item 0
-The exit status is zero if @code{make} is successful.
-@item 2
-The exit status is two if @code{make} encounters any errors.
-It will print messages describing the particular errors.
-@item 1
-The exit status is one if you use the @samp{-q} flag and @code{make}
-determines that some target is not already up to date.
-@xref{Instead of Execution, ,Instead of Executing the Recipes}.
-@end table
-
-@menu
-* Makefile Arguments:: How to specify which makefile to use.
-* Goals:: How to use goal arguments to specify which
- parts of the makefile to use.
-* Instead of Execution:: How to use mode flags to specify what
- kind of thing to do with the recipes
- in the makefile other than simply
- execute them.
-* Avoiding Compilation:: How to avoid recompiling certain files.
-* Overriding:: How to override a variable to specify
- an alternate compiler and other things.
-* Testing:: How to proceed past some errors, to
- test compilation.
-* Options Summary:: Summary of Options
-@end menu
-
-@node Makefile Arguments, Goals, Running, Running
-@section Arguments to Specify the Makefile
-@cindex @code{--file}
-@cindex @code{--makefile}
-@cindex @code{-f}
-
-The way to specify the name of the makefile is with the @samp{-f} or
-@samp{--file} option (@samp{--makefile} also works). For example,
-@samp{-f altmake} says to use the file @file{altmake} as the makefile.
-
-If you use the @samp{-f} flag several times and follow each @samp{-f}
-with an argument, all the specified files are used jointly as
-makefiles.
-
-If you do not use the @samp{-f} or @samp{--file} flag, the default is
-to try @file{GNUmakefile}, @file{makefile}, and @file{Makefile}, in
-that order, and use the first of these three which exists or can be made
-(@pxref{Makefiles, ,Writing Makefiles}).@refill
-
-@node Goals, Instead of Execution, Makefile Arguments, Running
-@section Arguments to Specify the Goals
-@cindex goal, how to specify
-
-The @dfn{goals} are the targets that @code{make} should strive ultimately
-to update. Other targets are updated as well if they appear as
-prerequisites of goals, or prerequisites of prerequisites of goals, etc.
-
-By default, the goal is the first target in the makefile (not counting
-targets that start with a period). Therefore, makefiles are usually
-written so that the first target is for compiling the entire program or
-programs they describe. If the first rule in the makefile has several
-targets, only the first target in the rule becomes the default goal, not
-the whole list. You can manage the selection of the default goal from
-within your makefile using the @code{.DEFAULT_GOAL} variable
-(@pxref{Special Variables, , Other Special Variables}).
-
-You can also specify a different goal or goals with command line
-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{=}, in which case it will be
-parsed as a switch or variable definition, respectively). Even
-targets not in the makefile may be specified, if @code{make} can find
-implicit rules that say how to make them.
-
-@vindex MAKECMDGOALS
-@code{Make} will set the special variable @code{MAKECMDGOALS} to the
-list of goals you specified on the command line. If no goals were given
-on the command line, this variable is empty. Note that this variable
-should be used only in special circumstances.
-
-An example of appropriate use is to avoid including @file{.d} files
-during @code{clean} rules (@pxref{Automatic Prerequisites}), so
-@code{make} won't create them only to immediately remove them
-again:@refill
-
-@example
-@group
-sources = foo.c bar.c
-
-ifneq ($(MAKECMDGOALS),clean)
-include $(sources:.c=.d)
-endif
-@end group
-@end example
-
-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
-several programs, with a makefile that starts like this:
-
-@example
-.PHONY: all
-all: size nm ld ar as
-@end example
-
-If you are working on the program @code{size}, you might want to say
-@w{@samp{make size}} so that only the files of that program are recompiled.
-
-Another use of specifying a goal is to make files that are not 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 is not a prerequisite of the default goal.
-
-Another use of specifying a goal is to run the recipe associated with
-a phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty
-Targets, ,Empty Target Files to Record Events}). 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
-@w{@samp{make clean}}. Following is a list of typical phony and empty
-target names. @xref{Standard Targets}, for a detailed list of all the
-standard target names which GNU software packages use.
-
-@table @file
-@item all
-@cindex @code{all} @r{(standard target)}
-Make all the top-level targets the makefile knows about.
-
-@item clean
-@cindex @code{clean} @r{(standard target)}
-Delete all files that are normally created by running @code{make}.
-
-@item mostlyclean
-@cindex @code{mostlyclean} @r{(standard target)}
-Like @samp{clean}, but may refrain from deleting a few files that people
-normally don't want to recompile. For example, the @samp{mostlyclean}
-target for GCC does not delete @file{libgcc.a}, because recompiling it
-is rarely necessary and takes a lot of time.
-
-@item distclean
-@cindex @code{distclean} @r{(standard target)}
-@itemx realclean
-@cindex @code{realclean} @r{(standard target)}
-@itemx clobber
-@cindex @code{clobber} @r{(standard target)}
-Any of these targets might be defined to delete @emph{more} files than
-@samp{clean} does. For example, this would delete configuration files
-or links that you would normally create as preparation for compilation,
-even if the makefile itself cannot create these files.
-
-@item install
-@cindex @code{install} @r{(standard target)}
-Copy the executable file into a directory that users typically search
-for commands; copy any auxiliary files that the executable uses into
-the directories where it will look for them.
-
-@item print
-@cindex @code{print} @r{(standard target)}
-Print listings of the source files that have changed.
-
-@item tar
-@cindex @code{tar} @r{(standard target)}
-Create a tar file of the source files.
-
-@item shar
-@cindex @code{shar} @r{(standard target)}
-Create a shell archive (shar file) of the source files.
-
-@item dist
-@cindex @code{dist} @r{(standard target)}
-Create a distribution file of the source files. This might
-be a tar file, or a shar file, or a compressed version of one of the
-above, or even more than one of the above.
-
-@item TAGS
-@cindex @code{TAGS} @r{(standard target)}
-Update a tags table for this program.
-
-@item check
-@cindex @code{check} @r{(standard target)}
-@itemx test
-@cindex @code{test} @r{(standard target)}
-Perform self tests on the program this makefile builds.
-@end table
-
-@node Instead of Execution, Avoiding Compilation, Goals, Running
-@section Instead of Executing the Recipes
-@cindex execution, instead of
-@cindex recipes, instead of executing
-
-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}.
-
-@comment Extra blank lines make it print better.
-@table @samp
-@item -n
-@itemx --just-print
-@itemx --dry-run
-@itemx --recon
-@cindex @code{--just-print}
-@cindex @code{--dry-run}
-@cindex @code{--recon}
-@cindex @code{-n}
-
-``No-op''. The activity is to print what recipe would be used to make
-the targets up to date, but not actually execute it.
-
-@item -t
-@itemx --touch
-@cindex @code{--touch}
-@cindex touching files
-@cindex target, touching
-@cindex @code{-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 -q
-@itemx --question
-@cindex @code{--question}
-@cindex @code{-q}
-@cindex question mode
-
-``Question''. The activity is to find out silently whether the targets
-are up to date already; but execute no recipe in either case. In other
-words, neither compilation nor output will occur.
-
-@item -W @var{file}
-@itemx --what-if=@var{file}
-@itemx --assume-new=@var{file}
-@itemx --new-file=@var{file}
-@cindex @code{--what-if}
-@cindex @code{-W}
-@cindex @code{--assume-new}
-@cindex @code{--new-file}
-@cindex what if
-@cindex files, assuming new
-
-``What if''. Each @samp{-W} flag is followed by a file name. The given
-files' modification times are recorded by @code{make} as being the present
-time, although the actual modification times remain the same.
-You can use the @samp{-W} flag in conjunction with the @samp{-n} flag
-to see what would happen if you were to modify specific files.@refill
-@end table
-
-With the @samp{-n} flag, @code{make} prints the recipe that it would
-normally execute but does not execute it.
-
-With the @samp{-t} flag, @code{make} ignores the recipes 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
-recipes, but the exit status code it returns is zero if and only if the
-targets to be considered are already up to date. If the exit status is
-one, then some updating needs to be done. If @code{make} encounters an
-error, the exit status is two, so you can distinguish an error from a
-target that is not up to date.
-
-It is an error to use more than one of these three flags in the same
-invocation of @code{make}.
-
-@cindex +, and recipe execution
-The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect recipe
-lines that begin with @samp{+} characters or contain the strings
-@samp{$(MAKE)} or @samp{$@{MAKE@}}. Note that only the line containing
-the @samp{+} character or the strings @samp{$(MAKE)} or @samp{$@{MAKE@}}
-is run regardless of these options. Other lines in the same rule are
-not run unless they too begin with @samp{+} or contain @samp{$(MAKE)} or
-@samp{$@{MAKE@}} (@xref{MAKE Variable, ,How the @code{MAKE} Variable Works}.)
-
-The @samp{-W} flag provides two features:
-
-@itemize @bullet
-@item
-If you also use the @samp{-n} or @samp{-q} flag, you can see what
-@code{make} would do if you were to modify some files.
-
-@item
-Without the @samp{-n} or @samp{-q} flag, when @code{make} is actually
-executing recipes, the @samp{-W} flag can direct @code{make} to act as
-if some files had been modified, without actually running the recipes
-for those files.@refill
-@end itemize
-
-Note that the options @samp{-p} and @samp{-v} allow you to obtain other
-information about @code{make} or about the makefiles in use
-(@pxref{Options Summary, ,Summary of Options}).@refill
-
-@node Avoiding Compilation, Overriding, Instead of Execution, Running
-@section Avoiding Recompilation of Some Files
-@cindex @code{-o}
-@cindex @code{--old-file}
-@cindex @code{--assume-old}
-@cindex files, assuming old
-@cindex files, avoiding recompilation of
-@cindex recompilation, avoiding
-
-Sometimes you may have changed a source file but you do not 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 do not need to be recompiled and you would rather not waste
-the time waiting for them to compile.
-
-If you anticipate the problem before changing the header file, you can
-use the @samp{-t} flag. This flag tells @code{make} not to run the
-recipes 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, ensuring that the object files are up-to-date
-before you begin.
-
-@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 @w{@samp{-o @var{file}}} flag, which marks a specified file as
-``old'' (@pxref{Options Summary, ,Summary of Options}). This means
-that the file itself will not 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 Overriding, Testing, Avoiding Compilation, Running
-@section Overriding Variables
-@cindex overriding variables with arguments
-@cindex variables, overriding with arguments
-@cindex command line variables
-@cindex variables, command line
-
-An argument that contains @samp{=} specifies the value of a variable:
-@samp{@var{v}=@var{x}} sets the value of the variable @var{v} to @var{x}.
-If you specify a value in this way, all ordinary assignments of the same
-variable in the makefile are ignored; we say they have been
-@dfn{overridden} by the command line argument.
-
-The most common 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 recipe that runs the C compiler, so a
-file @file{foo.c} would be compiled something 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 if you
-wish. For example, if you say @samp{make CFLAGS='-g -O'}, each C
-compilation will be done with @samp{cc -c -g -O}. (This also
-illustrates how you can use quoting in the shell to 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, , Variables Used by Implicit Rules}, for a complete list.
-
-You can also program the makefile to look at additional variables of your
-own, giving the user the ability to control other aspects of how the
-makefile works by changing the variables.
-
-When you override a variable with a command line argument, you can
-define either a recursively-expanded variable or a simply-expanded
-variable. The examples shown above make a recursively-expanded
-variable; to make a simply-expanded variable, write @samp{:=} instead
-of @samp{=}. But, unless you want to include a variable reference or
-function call in the @emph{value} that you specify, it makes no
-difference which kind of variable you create.
-
-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: @samp{override @var{variable} = @var{value}}
-(@pxref{Override Directive, ,The @code{override} Directive}).
-
-@node Testing, Options Summary, Overriding, Running
-@section Testing the Compilation of a Program
-@cindex testing compilation
-@cindex compilation, testing
-
-Normally, when an error happens in executing a shell command, @code{make}
-gives up immediately, returning a nonzero status. No further recipes are
-executed for any target. The error implies that the goal cannot be
-correctly remade, and @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 as many compilation errors
-as possible.
-
-@cindex @code{-k}
-@cindex @code{--keep-going}
-On these occasions, you should use the @samp{-k} or
-@samp{--keep-going} flag. This tells @code{make} to continue to
-consider the other prerequisites 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. In addition to continuing
-after failed shell commands, @samp{make -k} will continue as much as
-possible after discovering that it does not know how to make a target
-or prerequisite file. This will always cause an error message, but
-without @samp{-k}, it is a fatal error (@pxref{Options Summary,
-,Summary of Options}).@refill
-
-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'
-@kbd{M-x compile} command passes the @samp{-k} flag by default.
-
-@node Options Summary, , Testing, Running
-@section Summary of Options
-@cindex options
-@cindex flags
-@cindex switches
-
-Here is a table of all the options @code{make} understands:
-
-@table @samp
-@item -b
-@cindex @code{-b}
-@itemx -m
-@cindex @code{-m}
-These options are ignored for compatibility with other versions of @code{make}.
-
-@item -B
-@cindex @code{-B}
-@itemx --always-make
-@cindex @code{--always-make}
-Consider all targets out-of-date. GNU @code{make} proceeds to
-consider targets and their prerequisites using the normal algorithms;
-however, all targets so considered are always remade regardless of the
-status of their prerequisites. To avoid infinite recursion, if
-@code{MAKE_RESTARTS} (@pxref{Special Variables, , Other Special
-Variables}) is set to a number greater than 0 this option is disabled
-when considering whether to remake makefiles (@pxref{Remaking
-Makefiles, , How Makefiles Are Remade}).
-
-@item -C @var{dir}
-@cindex @code{-C}
-@itemx --directory=@var{dir}
-@cindex @code{--directory}
-Change to directory @var{dir} before reading the makefiles. 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, ,Recursive Use of @code{make}}).
-
-@item -d
-@cindex @code{-d}
-@c Extra blank line here makes the table look better.
-
-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. The @code{-d} option is equivalent to
-@samp{--debug=a} (see below).
-
-@item --debug[=@var{options}]
-@cindex @code{--debug}
-@c Extra blank line here makes the table look better.
-
-Print debugging information in addition to normal processing. Various
-levels and types of output can be chosen. With no arguments, print the
-``basic'' level of debugging. Possible arguments are below; only the
-first character is considered, and values must be comma- or
-space-separated.
-
-@table @code
-@item a (@i{all})
-All types of debugging output are enabled. This is equivalent to using
-@samp{-d}.
-
-@item b (@i{basic})
-Basic debugging prints each target that was found to be out-of-date, and
-whether the build was successful or not.
-
-@item v (@i{verbose})
-A level above @samp{basic}; includes messages about which makefiles were
-parsed, prerequisites that did not need to be rebuilt, etc. This option
-also enables @samp{basic} messages.
-
-@item i (@i{implicit})
-Prints messages describing the implicit rule searches for each target.
-This option also enables @samp{basic} messages.
-
-@item j (@i{jobs})
-Prints messages giving details on the invocation of specific subcommands.
-
-@item m (@i{makefile})
-By default, the above messages are not enabled while trying to remake
-the makefiles. This option enables messages while rebuilding makefiles,
-too. Note that the @samp{all} option does enable this option. This
-option also enables @samp{basic} messages.
-@end table
-
-@item -e
-@cindex @code{-e}
-@itemx --environment-overrides
-@cindex @code{--environment-overrides}
-Give variables taken from the environment precedence
-over variables from makefiles.
-@xref{Environment, ,Variables from the Environment}.
-
-@item -f @var{file}
-@cindex @code{-f}
-@itemx --file=@var{file}
-@cindex @code{--file}
-@itemx --makefile=@var{file}
-@cindex @code{--makefile}
-Read the file named @var{file} as a makefile.
-@xref{Makefiles, ,Writing Makefiles}.
-
-@item -h
-@cindex @code{-h}
-@itemx --help
-@cindex @code{--help}
-@c Extra blank line here makes the table look better.
-
-Remind you of the options that @code{make} understands and then exit.
-
-@item -i
-@cindex @code{-i}
-@itemx --ignore-errors
-@cindex @code{--ignore-errors}
-Ignore all errors in recipes executed to remake files.
-@xref{Errors, ,Errors in Recipes}.
-
-@item -I @var{dir}
-@cindex @code{-I}
-@itemx --include-dir=@var{dir}
-@cindex @code{--include-dir}
-Specifies a directory @var{dir} to search for included makefiles.
-@xref{Include, ,Including Other Makefiles}. If several @samp{-I}
-options are used to specify several directories, the directories are
-searched in the order specified.
-
-@item -j [@var{jobs}]
-@cindex @code{-j}
-@itemx --jobs[=@var{jobs}]
-@cindex @code{--jobs}
-Specifies the number of recipes (jobs) to run simultaneously. With no
-argument, @code{make} runs as many recipes simultaneously as possible.
-If there is more than one @samp{-j} option, the last one is effective.
-@xref{Parallel, ,Parallel Execution}, for more information on how
-recipes are run. Note that this option is ignored on MS-DOS.
-
-@item -k
-@cindex @code{-k}
-@itemx --keep-going
-@cindex @code{--keep-going}
-Continue as much as possible after an error. While the target that
-failed, and those that depend on it, cannot be remade, the other
-prerequisites of these targets can be processed all the same.
-@xref{Testing, ,Testing the Compilation of a Program}.
-
-@item -l [@var{load}]
-@cindex @code{-l}
-@itemx --load-average[=@var{load}]
-@cindex @code{--load-average}
-@itemx --max-load[=@var{load}]
-@cindex @code{--max-load}
-Specifies that no new recipes should be started if there are other
-recipes running and the load average is at least @var{load} (a
-floating-point number). With no argument, removes a previous load
-limit. @xref{Parallel, ,Parallel Execution}.
-
-@item -L
-@cindex @code{-L}
-@itemx --check-symlink-times
-@cindex @code{--check-symlink-times}
-On systems that support symbolic links, this option causes @code{make}
-to consider the timestamps on any symbolic links in addition to the
-timestamp on the file referenced by those links. When this option is
-provided, the most recent timestamp among the file and the symbolic
-links is taken as the modification time for this target file.
-
-@item -n
-@cindex @code{-n}
-@itemx --just-print
-@cindex @code{--just-print}
-@itemx --dry-run
-@cindex @code{--dry-run}
-@itemx --recon
-@cindex @code{--recon}
-@c Extra blank line here makes the table look better.
-
-Print the recipe that would be executed, but do not execute it.
-@xref{Instead of Execution, ,Instead of Executing the Recipes}.
-
-@item -o @var{file}
-@cindex @code{-o}
-@itemx --old-file=@var{file}
-@cindex @code{--old-file}
-@itemx --assume-old=@var{file}
-@cindex @code{--assume-old}
-Do not remake the file @var{file} even if it is older than its
-prerequisites, 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{Avoiding Compilation, ,Avoiding Recompilation of
-Some Files}.@refill
-
-@item -p
-@cindex @code{-p}
-@itemx --print-data-base
-@cindex @code{--print-data-base}
-@cindex data base of @code{make} rules
-@cindex predefined rules and variables, printing
-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 @w{@samp{make -qp}}. To print the data base
-of predefined rules and variables, use @w{@samp{make -p -f /dev/null}}.
-The data base output contains filename and linenumber information for
-recipe and variable definitions, so it can be a useful debugging tool
-in complex environments.
-
-@item -q
-@cindex @code{-q}
-@itemx --question
-@cindex @code{--question}
-``Question mode''. Do not run any recipes, or print anything; just
-return an exit status that is zero if the specified targets are already
-up to date, one if any remaking is required, or two if an error is
-encountered. @xref{Instead of Execution, ,Instead of Executing the
-Recipes}.@refill
-
-@item -r
-@cindex @code{-r}
-@itemx --no-builtin-rules
-@cindex @code{--no-builtin-rules}
-Eliminate use of the built-in implicit rules (@pxref{Implicit Rules,
-,Using Implicit Rules}). You can still define your own by writing
-pattern rules (@pxref{Pattern Rules, ,Defining and Redefining Pattern
-Rules}). The @samp{-r} option also clears out the default list of
-suffixes for suffix rules (@pxref{Suffix Rules, ,Old-Fashioned Suffix
-Rules}). But you can still define your own suffixes with a rule for
-@code{.SUFFIXES}, and then define your own suffix rules. Note that only
-@emph{rules} are affected by the @code{-r} option; default variables
-remain in effect (@pxref{Implicit Variables, ,Variables Used by Implicit
-Rules}); see the @samp{-R} option below.
-
-@item -R
-@cindex @code{-R}
-@itemx --no-builtin-variables
-@cindex @code{--no-builtin-variables}
-Eliminate use of the built-in rule-specific variables (@pxref{Implicit
-Variables, ,Variables Used by Implicit Rules}). You can still define
-your own, of course. The @samp{-R} option also automatically enables
-the @samp{-r} option (see above), since it doesn't make sense to have
-implicit rules without any definitions for the variables that they use.
-
-@item -s
-@cindex @code{-s}
-@itemx --silent
-@cindex @code{--silent}
-@itemx --quiet
-@cindex @code{--quiet}
-@c Extra blank line here makes the table look better.
-
-Silent operation; do not print the recipes as they are executed.
-@xref{Echoing, ,Recipe Echoing}.
-
-@item -S
-@cindex @code{-S}
-@itemx --no-keep-going
-@cindex @code{--no-keep-going}
-@itemx --stop
-@cindex @code{--stop}
-@c Extra blank line here makes the table look better.
-
-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, ,Recursive Use of @code{make}})
-or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill
-
-@item -t
-@cindex @code{-t}
-@itemx --touch
-@cindex @code{--touch}
-@c Extra blank line here makes the table look better.
-
-Touch files (mark them up to date without really changing them)
-instead of running their recipes. This is used to pretend that the
-recipes were done, in order to fool future invocations of
-@code{make}. @xref{Instead of Execution, ,Instead of Executing the Recipes}.
-
-@item -v
-@cindex @code{-v}
-@itemx --version
-@cindex @code{--version}
-Print the version of the @code{make} program plus a copyright, a list
-of authors, and a notice that there is no warranty; then exit.
-
-@item -w
-@cindex @code{-w}
-@itemx --print-directory
-@cindex @code{--print-directory}
-Print a message containing the working directory both before and after
-executing the makefile. This may be useful for tracking down errors
-from complicated nests of recursive @code{make} commands.
-@xref{Recursion, ,Recursive Use of @code{make}}. (In practice, you
-rarely need to specify this option since @samp{make} does it for you;
-see @ref{-w Option, ,The @samp{--print-directory} Option}.)
-
-@itemx --no-print-directory
-@cindex @code{--no-print-directory}
-Disable printing of the working directory under @code{-w}.
-This option is useful when @code{-w} is turned on automatically,
-but you do not want to see the extra messages.
-@xref{-w Option, ,The @samp{--print-directory} Option}.
-
-@item -W @var{file}
-@cindex @code{-W}
-@itemx --what-if=@var{file}
-@cindex @code{--what-if}
-@itemx --new-file=@var{file}
-@cindex @code{--new-file}
-@itemx --assume-new=@var{file}
-@cindex @code{--assume-new}
-Pretend that the target @var{file} has just been modified. When used
-with the @samp{-n} flag, this shows you what would happen if you were
-to modify that file. Without @samp{-n}, it is almost the same as
-running a @code{touch} command on the given file before running
-@code{make}, except that the modification time is changed only in the
-imagination of @code{make}.
-@xref{Instead of Execution, ,Instead of Executing the Recipes}.
-
-@item --warn-undefined-variables
-@cindex @code{--warn-undefined-variables}
-@cindex variables, warning for undefined
-@cindex undefined variables, warning message
-Issue a warning message whenever @code{make} sees a reference to an
-undefined variable. This can be helpful when you are trying to debug
-makefiles which use variables in complex ways.
-@end table
-
-@node Implicit Rules, Archives, Running, Top
-@chapter Using Implicit Rules
-@cindex implicit rule
-@cindex rule, implicit
-
-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 do not have to specify them in detail when you want to use
-them. For example, there is an implicit rule for C compilation. File
-names determine which implicit rules are run. For example, C
-compilation typically takes a @file{.c} file and makes a @file{.o} file.
-So @code{make} applies the implicit rule for C compilation when it sees
-this combination of file name endings.@refill
-
-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, ,Chains of Implicit Rules}.
-@end iftex
-
-The built-in implicit rules use several variables in their recipes 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, ,Variables Used by Implicit Rules}.
-@end iftex
-
-You can define your own implicit rules by writing @dfn{pattern rules}.
-@iftex
-@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.
-@end iftex
-
-@dfn{Suffix rules} are a more limited way to define implicit rules.
-Pattern rules are more general and clearer, but suffix rules are
-retained for compatibility.
-@iftex
-@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}.
-@end iftex
-
-@menu
-* Using Implicit:: How to use an existing implicit rule
- to get the recipes for updating a file.
-* Catalogue of Rules:: A list of built-in implicit rules.
-* Implicit Variables:: How to change what predefined rules do.
-* Chained Rules:: How to use a chain of implicit rules.
-* Pattern Rules:: How to define new implicit rules.
-* Last Resort:: How to define recipes for rules which
- cannot find any.
-* Suffix Rules:: The old-fashioned style of implicit rule.
-* Implicit Rule Search:: The precise algorithm for applying
- implicit rules.
-@end menu
-
-@node Using Implicit, Catalogue of Rules, Implicit Rules, Implicit Rules
-@section Using Implicit Rules
-@cindex implicit rule, how to use
-@cindex rule, implicit, how to use
-
-To allow @code{make} to find a customary method for updating a target
-file, all you have to do is refrain from specifying recipes yourself.
-Either write a rule with no recipe, 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 or can be made.
-
-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 can supply both a recipe and one or
-more prerequisites (the source files). You would want to write a rule
-for @file{foo.o} with no recipe if you need to specify additional
-prerequisites, such as header files, that the implicit rule cannot
-supply.
-
-Each implicit rule has a target pattern and prerequisite 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 prerequisites exist 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 possible prerequisite files are supposed to exist.
-@xref{Catalogue of Rules, ,Catalogue of Implicit Rules},
-for a catalogue of all the predefined implicit rules.
-
-Above, we said an implicit rule applies if the required prerequisites ``exist
-or can be made''. A file ``can be made'' if it is mentioned explicitly in
-the makefile as a target or a prerequisite, or if an implicit rule can be
-recursively found for how to make it. When an implicit prerequisite is the
-result of another implicit rule, we say that @dfn{chaining} is occurring.
-@xref{Chained Rules, ,Chains of Implicit Rules}.
-
-In general, @code{make} searches for an implicit rule for each target, and
-for each double-colon rule, that has no recipe. A file that is mentioned
-only as a prerequisite is considered a target whose rule specifies nothing,
-so implicit rule search happens for it. @xref{Implicit Rule Search, ,Implicit Rule Search Algorithm}, for the
-details of how the search is done.
-
-Note that explicit prerequisites do not influence implicit rule search.
-For example, consider this explicit rule:
-
-@example
-foo.o: foo.p
-@end example
-
-@noindent
-The prerequisite on @file{foo.p} does not necessarily mean that
-@code{make} will remake @file{foo.o} according to the implicit rule to
-make an object file, a @file{.o} file, from a Pascal source file, a
-@file{.p} file. For example, if @file{foo.c} also exists, the implicit
-rule to make an object file from a C source file is used instead,
-because it appears before the Pascal rule in the list of predefined
-implicit rules (@pxref{Catalogue of Rules, , Catalogue of Implicit
-Rules}).
-
-If you do not want an implicit rule to be used for a target that has no
-recipe, you can give that target an empty recipe by writing a semicolon
-(@pxref{Empty Recipes, ,Defining Empty Recipes}).
-
-@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit Rules
-@section Catalogue of Implicit Rules
-@cindex implicit rule, predefined
-@cindex rule, implicit, predefined
-
-Here is a catalogue of predefined implicit rules which are always
-available unless the makefile explicitly overrides or cancels them.
-@xref{Canceling Rules, ,Canceling Implicit Rules}, for information on
-canceling or overriding an implicit rule. The @samp{-r} or
-@samp{--no-builtin-rules} option cancels all predefined rules.
-
-This manual only documents the default rules available on POSIX-based
-operating systems. Other operating systems, such as VMS, Windows,
-OS/2, etc. may have different sets of default rules. To see the full
-list of default rules and variables available in your version of GNU
-@code{make}, run @samp{make -p} in a directory with no makefile.
-
-Not all of these rules will always be defined, even when the @samp{-r}
-option is not given. Many of the predefined implicit rules are
-implemented in @code{make} as suffix rules, so which ones will be
-defined depends on the @dfn{suffix list} (the list of prerequisites of
-the special target @code{.SUFFIXES}). The default suffix list is:
-@code{.out}, @code{.a}, @code{.ln}, @code{.o}, @code{.c}, @code{.cc},
-@code{.C}, @code{.cpp}, @code{.p}, @code{.f}, @code{.F}, @code{.m},
-@code{.r}, @code{.y}, @code{.l}, @code{.ym}, @code{.lm}, @code{.s},
-@code{.S}, @code{.mod}, @code{.sym}, @code{.def}, @code{.h},
-@code{.info}, @code{.dvi}, @code{.tex}, @code{.texinfo}, @code{.texi},
-@code{.txinfo}, @code{.w}, @code{.ch} @code{.web}, @code{.sh},
-@code{.elc}, @code{.el}. All of the implicit rules described below
-whose prerequisites have one of these suffixes are actually suffix
-rules. If you modify the suffix list, the only predefined suffix
-rules in effect will be those named by one or two of the suffixes that
-are on the list you specify; rules whose suffixes fail to be on the
-list are disabled. @xref{Suffix Rules, ,Old-Fashioned Suffix Rules},
-for full details on suffix rules.
-
-@table @asis
-@item Compiling C programs
-@cindex C, rule to compile
-@pindex cc
-@pindex gcc
-@pindex .o
-@pindex .c
-@file{@var{n}.o} is made automatically from @file{@var{n}.c} with
-a recipe of the form @samp{$(CC) -c $(CPPFLAGS) $(CFLAGS)}.@refill
-
-@item Compiling C++ programs
-@cindex C++, rule to compile
-@pindex g++
-@pindex .cc
-@pindex .cpp
-@pindex .C
-@file{@var{n}.o} is made automatically from @file{@var{n}.cc},
-@file{@var{n}.cpp}, or @file{@var{n}.C} with a recipe of the form
-@samp{$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)}. We encourage you to use the
-suffix @samp{.cc} for C++ source files instead of @samp{.C}.@refill
-
-@item Compiling Pascal programs
-@cindex Pascal, rule to compile
-@pindex pc
-@pindex .p
-@file{@var{n}.o} is made automatically from @file{@var{n}.p}
-with the recipe @samp{$(PC) -c $(PFLAGS)}.@refill
-
-@item Compiling Fortran and Ratfor programs
-@cindex Fortran, rule to compile
-@cindex Ratfor, rule to compile
-@pindex f77
-@pindex .f
-@pindex .r
-@pindex .F
-@file{@var{n}.o} is made automatically from @file{@var{n}.r},
-@file{@var{n}.F} or @file{@var{n}.f} by running the
-Fortran compiler. The precise recipe used is as follows:@refill
-
-@table @samp
-@item .f
-@samp{$(FC) -c $(FFLAGS)}.
-@item .F
-@samp{$(FC) -c $(FFLAGS) $(CPPFLAGS)}.
-@item .r
-@samp{$(FC) -c $(FFLAGS) $(RFLAGS)}.
-@end table
-
-@item Preprocessing Fortran and Ratfor programs
-@file{@var{n}.f} is made automatically from @file{@var{n}.r} or
-@file{@var{n}.F}. This rule runs just the preprocessor to convert a
-Ratfor or preprocessable Fortran program into a strict Fortran
-program. The precise recipe used is as follows:@refill
-
-@table @samp
-@item .F
-@samp{$(FC) -F $(CPPFLAGS) $(FFLAGS)}.
-@item .r
-@samp{$(FC) -F $(FFLAGS) $(RFLAGS)}.
-@end table
-
-@item Compiling Modula-2 programs
-@cindex Modula-2, rule to compile
-@pindex m2c
-@pindex .sym
-@pindex .def
-@pindex .mod
-@file{@var{n}.sym} is made from @file{@var{n}.def} with a recipe
-of the form @samp{$(M2C) $(M2FLAGS) $(DEFFLAGS)}. @file{@var{n}.o}
-is made from @file{@var{n}.mod}; the form is:
-@w{@samp{$(M2C) $(M2FLAGS) $(MODFLAGS)}}.@refill
-
-@need 1200
-@item Assembling and preprocessing assembler programs
-@cindex assembly, rule to compile
-@pindex as
-@pindex .s
-@file{@var{n}.o} is made automatically from @file{@var{n}.s} by
-running the assembler, @code{as}. The precise recipe is
-@samp{$(AS) $(ASFLAGS)}.@refill
-
-@pindex .S
-@file{@var{n}.s} is made automatically from @file{@var{n}.S} by
-running the C preprocessor, @code{cpp}. The precise recipe is
-@w{@samp{$(CPP) $(CPPFLAGS)}}.
-
-@item Linking a single object file
-@cindex linking, predefined rule for
-@pindex ld
-@pindex .o
-@file{@var{n}} is made automatically from @file{@var{n}.o} by running
-the linker (usually called @code{ld}) via the C compiler. The precise
-recipe used is @w{@samp{$(CC) $(LDFLAGS) @var{n}.o $(LOADLIBES) $(LDLIBS)}}.
-
-This rule does the right thing for a simple program with only one
-source file. It will also do the right thing if there are multiple
-object files (presumably coming from various other source files), one
-of which has a name matching that of the executable file. Thus,
-
-@example
-x: y.o z.o
-@end example
-
-@noindent
-when @file{x.c}, @file{y.c} and @file{z.c} all exist will execute:
-
-@example
-@group
-cc -c x.c -o x.o
-cc -c y.c -o y.o
-cc -c z.c -o z.o
-cc x.o y.o z.o -o x
-rm -f x.o
-rm -f y.o
-rm -f z.o
-@end group
-@end example
-
-@noindent
-In more complicated cases, such as when there is no object file whose
-name derives from the executable file name, you must write an explicit
-recipe for linking.
-
-Each kind of file automatically made into @samp{.o} object files will
-be automatically linked by using the compiler (@samp{$(CC)},
-@samp{$(FC)} or @samp{$(PC)}; the C compiler @samp{$(CC)} is used to
-assemble @samp{.s} files) without the @samp{-c} option. This could be
-done by using the @samp{.o} object files as intermediates, but it is
-faster to do the compiling and linking in one step, so that's how it's
-done.@refill
-
-@item Yacc for C programs
-@pindex yacc
-@cindex Yacc, rule to run
-@pindex .y
-@file{@var{n}.c} is made automatically from @file{@var{n}.y} by
-running Yacc with the recipe @samp{$(YACC) $(YFLAGS)}.
-
-@item Lex for C programs
-@pindex lex
-@cindex Lex, rule to run
-@pindex .l
-@file{@var{n}.c} is made automatically from @file{@var{n}.l} by
-running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}.
-
-@item Lex for Ratfor programs
-@file{@var{n}.r} is made automatically from @file{@var{n}.l} by
-running Lex. The actual recipe is @samp{$(LEX) $(LFLAGS)}.
-
-The convention 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. Or, if you
-are using Ratfor exclusively, with no C files, remove @samp{.c} from
-the list of implicit rule suffixes with:@refill
-
-@example
-@group
-.SUFFIXES:
-.SUFFIXES: .o .r .f .l @dots{}
-@end group
-@end example
-
-@item Making Lint Libraries from C, Yacc, or Lex programs
-@pindex lint
-@cindex @code{lint}, rule to run
-@pindex .ln
-@file{@var{n}.ln} is made from @file{@var{n}.c} by running @code{lint}.
-The precise recipe is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}.
-The same recipe is used on the C code produced from
-@file{@var{n}.y} or @file{@var{n}.l}.@refill
-
-@item @TeX{} and Web
-@cindex @TeX{}, rule to run
-@cindex Web, rule to run
-@pindex tex
-@pindex cweave
-@pindex weave
-@pindex tangle
-@pindex ctangle
-@pindex .dvi
-@pindex .tex
-@pindex .web
-@pindex .w
-@pindex .ch
-@file{@var{n}.dvi} is made from @file{@var{n}.tex} with the recipe
-@samp{$(TEX)}. @file{@var{n}.tex} is made from @file{@var{n}.web} with
-@samp{$(WEAVE)}, or from @file{@var{n}.w} (and from @file{@var{n}.ch} if
-it exists or can be made) with @samp{$(CWEAVE)}. @file{@var{n}.p} is
-made from @file{@var{n}.web} with @samp{$(TANGLE)} and @file{@var{n}.c}
-is made from @file{@var{n}.w} (and from @file{@var{n}.ch} if it exists
-or can be made) with @samp{$(CTANGLE)}.@refill
-
-@item Texinfo and Info
-@cindex Texinfo, rule to format
-@cindex Info, rule to format
-@pindex texi2dvi
-@pindex makeinfo
-@pindex .texinfo
-@pindex .info
-@pindex .texi
-@pindex .txinfo
-@file{@var{n}.dvi} is made from @file{@var{n}.texinfo},
-@file{@var{n}.texi}, or @file{@var{n}.txinfo}, with the recipe
-@w{@samp{$(TEXI2DVI) $(TEXI2DVI_FLAGS)}}. @file{@var{n}.info} is made from
-@file{@var{n}.texinfo}, @file{@var{n}.texi}, or @file{@var{n}.txinfo}, with
-the recipe @w{@samp{$(MAKEINFO) $(MAKEINFO_FLAGS)}}.
-
-@item RCS
-@cindex RCS, rule to extract from
-@pindex co
-@pindex ,v @r{(RCS file extension)}
-Any file @file{@var{n}} is extracted if necessary from an RCS file
-named either @file{@var{n},v} or @file{RCS/@var{n},v}. The precise
-recipe used is @w{@samp{$(CO) $(COFLAGS)}}. @file{@var{n}} will not be
-extracted from RCS if it already exists, even if the RCS file is
-newer. The rules for RCS are terminal
-(@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}),
-so RCS files cannot be generated from another source; they must
-actually exist.@refill
-
-@item SCCS
-@cindex SCCS, rule to extract from
-@pindex get
-@pindex s. @r{(SCCS file prefix)}
-Any file @file{@var{n}} is extracted if necessary from an SCCS file
-named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}. The precise
-recipe used is @w{@samp{$(GET) $(GFLAGS)}}. The rules for SCCS are
-terminal (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}),
-so SCCS files cannot be generated from another source; they must
-actually exist.@refill
-
-@pindex .sh
-For the benefit of SCCS, a file @file{@var{n}} is copied from
-@file{@var{n}.sh} and made executable (by everyone). This is for
-shell scripts that are checked into SCCS. Since RCS preserves the
-execution permission of a file, you do not need to use this feature
-with RCS.@refill
-
-We recommend that you avoid using of SCCS. RCS is widely held to be
-superior, and is also free. By choosing free software in place of
-comparable (or inferior) proprietary software, you support the free
-software movement.
-@end table
-
-Usually, you want to change only the variables listed in the table
-above, which are documented in the following section.
-
-However, the recipes in built-in implicit rules actually use
-variables such as @code{COMPILE.c}, @code{LINK.p}, and
-@code{PREPROCESS.S}, whose values contain the recipes listed above.
-
-@code{make} follows the convention that the rule to compile a
-@file{.@var{x}} source file uses the variable @code{COMPILE.@var{x}}.
-Similarly, the rule to produce an executable from a @file{.@var{x}}
-file uses @code{LINK.@var{x}}; and the rule to preprocess a
-@file{.@var{x}} file uses @code{PREPROCESS.@var{x}}.
-
-@vindex OUTPUT_OPTION
-Every rule that produces an object file uses the variable
-@code{OUTPUT_OPTION}. @code{make} defines this variable either to
-contain @samp{-o $@@}, or to be empty, depending on a compile-time
-option. You need the @samp{-o} option to ensure that the output goes
-into the right file when the source file is in a different directory,
-as when using @code{VPATH} (@pxref{Directory Search}). However,
-compilers on some systems do not accept a @samp{-o} switch for object
-files. If you use such a system, and use @code{VPATH}, some
-compilations will put their output in the wrong place.
-A possible workaround for this problem is to give @code{OUTPUT_OPTION}
-the value @w{@samp{; mv $*.o $@@}}.
-
-@node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit Rules
-@section Variables Used by Implicit Rules
-@cindex flags for compilers
-
-The recipes in built-in implicit rules make liberal use of certain
-predefined variables. You can alter the values of these variables in
-the makefile, with arguments to @code{make}, or in the environment to
-alter how the implicit rules work without redefining the rules
-themselves. You can cancel all variables used by implicit rules with
-the @samp{-R} or @samp{--no-builtin-variables} option.
-
-For example, the recipe used to compile a C source file actually says
-@samp{$(CC) -c $(CFLAGS) $(CPPFLAGS)}. 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.
-
-The following tables describe of some of the more commonly-used predefined
-variables. This list is not exhaustive, and the default values shown here may
-not be what @code{make} selects for your environment. To see the
-complete list of predefined variables for your instance of GNU @code{make} you
-can run @samp{make -p} in a directory with no makefiles.
-
-Here is a table of some of the more common variables used as names of
-programs in built-in rules:
-makefiles.
-
-@table @code
-@item AR
-@vindex AR
-Archive-maintaining program; default @samp{ar}.
-@pindex ar
-
-@item AS
-@vindex AS
-Program for compiling assembly files; default @samp{as}.
-@pindex as
-
-@item CC
-@vindex CC
-Program for compiling C programs; default @samp{cc}.
-@pindex cc
-
-@item CXX
-@vindex CXX
-Program for compiling C++ programs; default @samp{g++}.
-@pindex g++
-
-@item CPP
-@vindex CPP
-Program for running the C preprocessor, with results to standard output;
-default @samp{$(CC) -E}.
-
-@item FC
-@vindex FC
-Program for compiling or preprocessing Fortran and Ratfor programs;
-default @samp{f77}.
-@pindex f77
-
-@item M2C
-@vindex M2C
-Program to use to compile Modula-2 source code; default @samp{m2c}.
-@pindex m2c
-
-@item PC
-@vindex PC
-Program for compiling Pascal programs; default @samp{pc}.
-@pindex pc
-
-@item CO
-@vindex CO
-Program for extracting a file from RCS; default @samp{co}.
-@pindex co
-
-@item GET
-@vindex GET
-Program for extracting a file from SCCS; default @samp{get}.
-@pindex get
-
-@item LEX
-@vindex LEX
-Program to use to turn Lex grammars into source code; default @samp{lex}.
-@pindex lex
-
-@item YACC
-@vindex YACC
-Program to use to turn Yacc grammars into source code; default @samp{yacc}.
-@pindex yacc
-
-@item LINT
-@vindex LINT
-Program to use to run lint on source code; default @samp{lint}.
-@pindex lint
-
-@item MAKEINFO
-@vindex MAKEINFO
-Program to convert a Texinfo source file into an Info file; default
-@samp{makeinfo}.
-@pindex makeinfo
-
-@item TEX
-@vindex TEX
-Program to make @TeX{} @sc{dvi} files from @TeX{} source;
-default @samp{tex}.
-@pindex tex
-
-@item TEXI2DVI
-@vindex TEXI2DVI
-Program to make @TeX{} @sc{dvi} files from Texinfo source;
-default @samp{texi2dvi}.
-@pindex texi2dvi
-
-@item WEAVE
-@vindex WEAVE
-Program to translate Web into @TeX{}; default @samp{weave}.
-@pindex weave
-
-@item CWEAVE
-@vindex CWEAVE
-Program to translate C Web into @TeX{}; default @samp{cweave}.
-@pindex cweave
-
-@item TANGLE
-@vindex TANGLE
-Program to translate Web into Pascal; default @samp{tangle}.
-@pindex tangle
-
-@item CTANGLE
-@vindex CTANGLE
-Program to translate C Web into C; default @samp{ctangle}.
-@pindex ctangle
-
-@item RM
-@vindex RM
-Command to remove a file; default @samp{rm -f}.
-@pindex rm
-@end table
-
-Here is a table of variables whose values are additional arguments for the
-programs above. The default values for all of these is the empty
-string, unless otherwise noted.
-
-@table @code
-@item ARFLAGS
-@vindex ARFLAGS
-Flags to give the archive-maintaining program; default @samp{rv}.
-
-@item ASFLAGS
-@vindex ASFLAGS
-Extra flags to give to the assembler (when explicitly
-invoked on a @samp{.s} or @samp{.S} file).
-
-@item CFLAGS
-@vindex CFLAGS
-Extra flags to give to the C compiler.
-
-@item CXXFLAGS
-@vindex CXXFLAGS
-Extra flags to give to the C++ compiler.
-
-@item COFLAGS
-@vindex COFLAGS
-Extra flags to give to the RCS @code{co} program.
-
-@item CPPFLAGS
-@vindex CPPFLAGS
-Extra flags to give to the C preprocessor and programs
-that use it (the C and Fortran compilers).
-
-@item FFLAGS
-@vindex FFLAGS
-Extra flags to give to the Fortran compiler.
-
-@item GFLAGS
-@vindex GFLAGS
-Extra flags to give to the SCCS @code{get} program.
-
-@item LDFLAGS
-@vindex LDFLAGS
-Extra flags to give to compilers when they are supposed to invoke the linker,
-@samp{ld}.
-
-@item LFLAGS
-@vindex LFLAGS
-Extra flags to give to Lex.
-
-@item YFLAGS
-@vindex YFLAGS
-Extra flags to give to Yacc.
-
-@item PFLAGS
-@vindex PFLAGS
-Extra flags to give to the Pascal compiler.
-
-@item RFLAGS
-@vindex RFLAGS
-Extra flags to give to the Fortran compiler for Ratfor programs.
-
-@item LINTFLAGS
-@vindex LINTFLAGS
-Extra flags to give to lint.
-@end table
-
-@node Chained Rules, Pattern Rules, Implicit Variables, Implicit Rules
-@section Chains of Implicit Rules
-
-@cindex chains of rules
-@cindex rule, implicit, chains of
-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 is
-used. Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are
-updated.@refill
-
-@cindex intermediate files
-@cindex files, intermediate
-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. But intermediate files are treated differently in two ways.
-
-The first difference is what happens if the intermediate file does not
-exist. If an ordinary file @var{b} does not exist, and @code{make}
-considers a target that depends on @var{b}, it invariably creates
-@var{b} and then updates the target from @var{b}. But if @var{b} is an
-intermediate file, then @code{make} can leave well enough alone. It
-won't bother updating @var{b}, or the ultimate target, unless some
-prerequisite of @var{b} is newer than that target or there is some other
-reason to update that target.
-
-The second difference is that if @code{make} @emph{does} create @var{b}
-in order to update something else, it deletes @var{b} later on after it
-is no longer needed. Therefore, an intermediate file which did not
-exist before @code{make} also does not exist after @code{make}.
-@code{make} reports the deletion to you by printing a @samp{rm -f}
-command showing which file it is deleting.
-
-Ordinarily, a file cannot be intermediate if it is mentioned in the
-makefile as a target or prerequisite. However, you can explicitly mark a
-file as intermediate by listing it as a prerequisite of the special target
-@code{.INTERMEDIATE}. This takes effect even if the file is mentioned
-explicitly in some other way.
-
-@cindex intermediate files, preserving
-@cindex preserving intermediate files
-@cindex secondary files
-You can prevent automatic deletion of an intermediate file by marking it
-as a @dfn{secondary} file. To do this, list it as a prerequisite of the
-special target @code{.SECONDARY}. When a file is secondary, @code{make}
-will not create the file merely because it does not already exist, but
-@code{make} does not automatically delete the file. Marking a file as
-secondary also marks it as intermediate.
-
-You can list the target pattern of an implicit rule (such as @samp{%.o})
-as a prerequisite of the special target @code{.PRECIOUS} to preserve
-intermediate files made by implicit rules whose target patterns match
-that file's name; see @ref{Interrupts}.@refill
-@cindex preserving with @code{.PRECIOUS}
-@cindex @code{.PRECIOUS} intermediate files
-
-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 be handled by rule chains. For example, making @file{foo} from
-@file{foo.c} could be handled by compiling and linking with separate
-chained 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 Rules
-@section Defining and Redefining Pattern Rules
-
-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 nonempty
-substring, while other characters match only themselves. The prerequisites
-likewise use @samp{%} to show how their names relate to the target name.
-
-Thus, a pattern rule @samp{%.o : %.c} says how to make any file
-@file{@var{stem}.o} from another file @file{@var{stem}.c}.@refill
-
-Note that expansion using @samp{%} in pattern rules occurs
-@strong{after} any variable or function expansions, which take place
-when the makefile is read. @xref{Using Variables, , How to Use
-Variables}, and @ref{Functions, ,Functions for Transforming Text}.
-
-@menu
-* Pattern Intro:: An introduction to pattern rules.
-* Pattern Examples:: Examples of pattern rules.
-* Automatic Variables:: How to use automatic variables in the
- recipes of implicit rules.
-* Pattern Match:: How patterns match.
-* Match-Anything Rules:: Precautions you should take prior to
- defining rules that can match any
- target file whatever.
-* Canceling Rules:: How to override or cancel built-in rules.
-@end menu
-
-@node Pattern Intro, Pattern Examples, Pattern Rules, Pattern Rules
-@subsection Introduction to Pattern Rules
-@cindex pattern rule
-@cindex rule, pattern
-
-A pattern rule contains the character @samp{%} (exactly one of them)
-in the target; otherwise, it looks exactly like an ordinary rule. The
-target is a pattern for matching file names; the @samp{%} matches any
-nonempty substring, while other characters match only themselves.
-@cindex target pattern, implicit
-@cindex @code{%}, in pattern rules
-
-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
-
-@samp{%} in a prerequisite 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 all of its prerequisites (after pattern
-substitution) must name files that exist or can be made. These files
-become prerequisites of the target.
-@cindex prerequisite pattern, implicit
-
-Thus, a rule of the form
-
-@example
-%.o : %.c ; @var{recipe}@dots{}
-@end example
-
-@noindent
-specifies how to make a file @file{@var{n}.o}, with another file
-@file{@var{n}.c} as its prerequisite, provided that @file{@var{n}.c}
-exists or can be made.
-
-There may also be prerequisites that do not use @samp{%}; such a prerequisite
-attaches to every file made by this pattern rule. These unvarying
-prerequisites are useful occasionally.
-
-A pattern rule need not have any prerequisites that contain @samp{%}, or
-in fact any prerequisites at all. Such a rule is effectively a general
-wildcard. It provides a way to make any file that matches the target
-pattern. @xref{Last Resort}.
-
-@c !!! The end of of this paragraph should be rewritten. --bob
-Pattern rules may have more than one target. Unlike normal rules,
-this does not act as many different rules with the same prerequisites
-and recipe. If a pattern rule has multiple targets, @code{make} knows
-that the rule's recipe is responsible for making all of the targets.
-The recipe is executed only once to make all the targets. When
-searching for a pattern rule to match a target, the target patterns of
-a rule other than the one that matches the target in need of a rule
-are incidental: @code{make} worries only about giving a recipe and
-prerequisites to the file presently in question. However, when this
-file's recipe is run, the other targets are marked as having been
-updated themselves.
-@cindex multiple targets, in pattern rule
-@cindex target, multiple in pattern rule
-
-The order in which pattern rules appear in the makefile is important
-since this is the order in which they are considered.
-Of equally applicable
-rules, only the first one found is used. The rules you write take precedence
-over those that are built in. Note however, that a rule whose
-prerequisites actually exist or are mentioned always takes priority over a
-rule with prerequisites that must be made by chaining other implicit rules.
-@cindex pattern rules, order of
-@cindex order of pattern rules
-
-@node Pattern Examples, Automatic Variables, Pattern Intro, 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) $(CPPFLAGS) $< -o $@@
-@end example
-
-@noindent
-defines a rule that can make any file @file{@var{x}.o} from
-@file{@var{x}.c}. The recipe uses the automatic variables @samp{$@@} and
-@samp{$<} to substitute the names of the target file and the source file
-in each case where the rule applies (@pxref{Automatic Variables}).@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}} whatsoever 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 prerequisite file exists. The double colon makes the rule
-@dfn{terminal}, which means that its prerequisite may not be an intermediate
-file (@pxref{Match-Anything Rules, ,Match-Anything Pattern Rules}).@refill
-
-@need 500
-This pattern rule has two targets:
-
-@example
-@group
-%.tab.c %.tab.h: %.y
- bison -d $<
-@end group
-@end example
-
-@noindent
-@c The following paragraph is rewritten to avoid overfull hboxes
-This tells @code{make} that the recipe @samp{bison -d @var{x}.y} will
-make both @file{@var{x}.tab.c} and @file{@var{x}.tab.h}. If the file
-@file{foo} depends on the files @file{parse.tab.o} and @file{scan.o}
-and the file @file{scan.o} depends on the file @file{parse.tab.h},
-when @file{parse.y} is changed, the recipe @samp{bison -d parse.y}
-will be executed only once, and the prerequisites of both
-@file{parse.tab.o} and @file{scan.o} will be satisfied. (Presumably
-the file @file{parse.tab.o} will be recompiled from @file{parse.tab.c}
-and the file @file{scan.o} from @file{scan.c}, while @file{foo} is
-linked from @file{parse.tab.o}, @file{scan.o}, and its other
-prerequisites, and it will execute happily ever after.)@refill
-
-@node Automatic Variables, Pattern Match, Pattern Examples, Pattern Rules
-@subsection Automatic Variables
-@cindex automatic variables
-@cindex variables, automatic
-@cindex variables, and implicit rule
-
-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 cannot write the name in the recipe,
-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 prerequisites of the rule. In this
-example, you would use @samp{$@@} for the object file name and @samp{$<}
-for the source file name.
-
-@cindex automatic variables in prerequisites
-@cindex prerequisites, and automatic variables
-It's very important that you recognize the limited scope in which
-automatic variable values are available: they only have values within
-the recipe. In particular, you cannot use them anywhere
-within the target list of a rule; they have no value there and will
-expand to the empty string. Also, they cannot be accessed directly
-within the prerequisite list of a rule. A common mistake is
-attempting to use @code{$@@} within the prerequisites list; this will
-not work. However, there is a special feature of GNU @code{make},
-secondary expansion (@pxref{Secondary Expansion}), which will allow
-automatic variable values to be used in prerequisite lists.
-
-Here is a table of automatic variables:
-
-@table @code
-@vindex $@@
-@vindex @@ @r{(automatic variable)}
-@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. In a pattern
-rule that has multiple targets (@pxref{Pattern Intro, ,Introduction to
-Pattern Rules}), @samp{$@@} is the name of whichever target caused the
-rule's recipe to be run.
-
-@vindex $%
-@vindex % @r{(automatic variable)}
-@item $%
-The target member name, when the target is an archive member.
-@xref{Archives}. 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.
-
-@vindex $<
-@vindex < @r{(automatic variable)}
-@item $<
-The name of the first prerequisite. If the target got its recipe from
-an implicit rule, this will be the first prerequisite added by the
-implicit rule (@pxref{Implicit Rules}).
-
-@vindex $?
-@vindex ? @r{(automatic variable)}
-@item $?
-The names of all the prerequisites that are newer than the target, with
-spaces between them. For prerequisites which are archive members, only
-the named member is used (@pxref{Archives}).
-@cindex prerequisites, list of changed
-@cindex list of changed prerequisites
-
-@vindex $^
-@vindex ^ @r{(automatic variable)}
-@item $^
-The names of all the prerequisites, with spaces between them. For
-prerequisites which are archive members, only the named member is used
-(@pxref{Archives}). A target has only one prerequisite on each other file
-it depends on, no matter how many times each file is listed as a
-prerequisite. So if you list a prerequisite more than once for a target,
-the value of @code{$^} contains just one copy of the name. This list
-does @strong{not} contain any of the order-only prerequisites; for those
-see the @samp{$|} variable, below.
-@cindex prerequisites, list of all
-@cindex list of all prerequisites
-
-@vindex $+
-@vindex + @r{(automatic variable)}
-@item $+
-This is like @samp{$^}, but prerequisites listed more than once are
-duplicated in the order they were listed in the makefile. This is
-primarily useful for use in linking commands where it is meaningful to
-repeat library file names in a particular order.
-
-@vindex $|
-@vindex | @r{(automatic variable)}
-@item $|
-The names of all the order-only prerequisites, with spaces between
-them.
-
-@vindex $*
-@vindex * @r{(automatic variable)}
-@item $*
-The stem with which an implicit rule matches (@pxref{Pattern Match, ,How
-Patterns 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
-@cindex stem, variable for
-
-In a static pattern rule, the stem is part of the file name that matched
-the @samp{%} in the target pattern.
-
-In an explicit rule, there is no stem; so @samp{$*} cannot be determined
-in that way. Instead, if the target name ends with a recognized suffix
-(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}), @samp{$*} is set to
-the target name minus the suffix. For example, if the target name is
-@samp{foo.c}, then @samp{$*} is set to @samp{foo}, since @samp{.c} is a
-suffix. GNU @code{make} does this bizarre thing only for compatibility
-with other implementations of @code{make}. You should generally avoid
-using @samp{$*} except in implicit rules or static pattern rules.@refill
-
-If the target name in an explicit rule does not end with a recognized
-suffix, @samp{$*} is set to the empty string for that rule.
-@end table
-
-@samp{$?} is useful even in explicit rules when you wish to operate on only
-the prerequisites 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
-@group
-lib: foo.o bar.o lose.o win.o
- ar r lib $?
-@end group
-@end example
-
-Of the variables listed above, four have values that are single file
-names, and three have values that are lists of file names. These seven
-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 a similar effect (@pxref{File Name
-Functions, , Functions for File Names}). Note, however, that the
-@samp{D} variants all omit the trailing slash which always appears in
-the output of the @code{dir} function. Here is a table of the variants:
-
-@table @samp
-@vindex $(@@D)
-@vindex @@D @r{(automatic variable)}
-@item $(@@D)
-The directory part of the file name of the target, with the trailing
-slash removed. 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.
-
-@vindex $(@@F)
-@vindex @@F @r{(automatic variable)}
-@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 $@@)}.
-
-@vindex $(*D)
-@vindex *D @r{(automatic variable)}
-@item $(*D)
-@vindex $(*F)
-@vindex *F @r{(automatic variable)}
-@itemx $(*F)
-The directory part and the file-within-directory
-part of the stem; @file{dir} and @file{foo} in this example.
-
-@vindex $(%D)
-@vindex %D @r{(automatic variable)}
-@item $(%D)
-@vindex $(%F)
-@vindex %F @r{(automatic variable)}
-@itemx $(%F)
-The directory part and the file-within-directory part of the target
-archive member name. This makes sense only for archive member targets
-of the form @file{@var{archive}(@var{member})} and is useful only when
-@var{member} may contain a directory name. (@xref{Archive Members,
-,Archive Members as Targets}.)
-
-@vindex $(<D)
-@vindex <D @r{(automatic variable)}
-@item $(<D)
-@vindex $(<F)
-@vindex <F @r{(automatic variable)}
-@itemx $(<F)
-The directory part and the file-within-directory
-part of the first prerequisite.
-
-@vindex $(^D)
-@vindex ^D @r{(automatic variable)}
-@item $(^D)
-@vindex $(^F)
-@vindex ^F @r{(automatic variable)}
-@itemx $(^F)
-Lists of the directory parts and the file-within-directory
-parts of all prerequisites.
-
-@vindex $(+D)
-@vindex +D @r{(automatic variable)}
-@item $(+D)
-@vindex $(+F)
-@vindex +F @r{(automatic variable)}
-@itemx $(+F)
-Lists of the directory parts and the file-within-directory
-parts of all prerequisites, including multiple instances of duplicated
-prerequisites.
-
-@vindex $(?D)
-@vindex ?D @r{(automatic variable)}
-@item $(?D)
-@vindex $(?F)
-@vindex ?F @r{(automatic variable)}
-@itemx $(?F)
-Lists of the directory parts and the file-within-directory parts of
-all prerequisites that are newer than the target.
-@end table
-
-Note that we use a special stylistic convention when we talk about these
-automatic variables; we write ``the value of @samp{$<}'', rather than
-@w{``the variable @code{<}''} as we would write for ordinary variables
-such as @code{objects} and @code{CFLAGS}. We think this convention
-looks more natural in this special case. Please do not assume it has a
-deep significance; @samp{$<} refers to the variable named @code{<} just
-as @samp{$(CFLAGS)} refers to the variable named @code{CFLAGS}.
-You could just as well use @samp{$(<)} in place of @samp{$<}.
-
-@node Pattern Match, Match-Anything Rules, Automatic Variables, Pattern Rules
-@subsection How Patterns Match
-
-@cindex stem
-A target pattern is composed of a @samp{%} between a prefix and a suffix,
-either or both 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 prerequisites are
-turned into actual file names by substituting the stem for the character
-@samp{%}. Thus, if in the same example one of the prerequisites is written
-as @samp{%.c}, it expands to @samp{test.c}.@refill
-
-When the target pattern does not contain a slash (and it usually does
-not), directory names in the file names are removed from the file name
-before it is compared with the target prefix and suffix. After the
-comparison of the file name to the target pattern, the directory
-names, along with the slash that ends them, are added on to the
-prerequisite file names generated from the pattern rule's prerequisite
-patterns and the file name. The directories are ignored only for the
-purpose of finding an implicit rule to use, not in the application of
-that rule. Thus, @samp{e%t} matches the file name @file{src/eat},
-with @samp{src/a} as the stem. When prerequisites 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 prerequisite 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 file name
-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 prerequisite.
-
-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. If @code{make} did consider these possibilities,
-it would ultimately reject them, because files such as @file{foo.c.o} and
-@file{foo.c.p} 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 prerequisites actually exist. Prerequisites that could be made with
-other implicit rules are not good enough. In other words, no further
-chaining is allowed beyond a terminal rule.
-
-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-anything 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-anything
-rules are used for making files containing specific types of data (such as
-executable files) and a file name with a recognized suffix indicates some
-other specific 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-anything rules will not be
-considered. These dummy rules have no prerequisites and no recipes, 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}.
-
-Dummy pattern rules such as the one for @samp{%.p} are made for every
-suffix listed as valid for use in suffix rules (@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}).
-
-@node Canceling Rules, , Match-Anything Rules, Pattern Rules
-@subsection Canceling Implicit Rules
-
-You can override a built-in implicit rule (or one you have defined
-yourself) by defining a new pattern rule with the same target and
-prerequisites, but a different recipe. 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 prerequisites, but no recipe. 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 Rules
-@section Defining Last-Resort Default Rules
-@cindex last-resort default rules
-@cindex default rules, last-resort
-
-You can define a last-resort implicit rule by writing a terminal
-match-anything pattern rule with no prerequisites (@pxref{Match-Anything
-Rules}). This is just like any other pattern rule; the only thing
-special about it is that it will match any target. So such a rule's
-recipe is used for all targets and prerequisites that have no recipe
-of their own and for which no other implicit rule applies.
-
-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
-%::
- touch $@@
-@end example
-
-@noindent
-to cause all the source files needed (as prerequisites) to be created
-automatically.
-
-@findex .DEFAULT
-You can instead define a recipe to be used for targets for which there
-are no rules at all, even ones which don't specify recipes. You do
-this by writing a rule for the target @code{.DEFAULT}. Such a rule's
-recipe is used for all prerequisites which do not appear as targets in
-any explicit rule, and for which no implicit rule applies. Naturally,
-there is no @code{.DEFAULT} rule unless you write one.
-
-If you use @code{.DEFAULT} with no recipe or prerequisites:
-
-@example
-.DEFAULT:
-@end example
-
-@noindent
-the recipe previously stored for @code{.DEFAULT} is cleared. Then
-@code{make} acts as if you had never defined @code{.DEFAULT} at all.
-
-If you do not want a target to get the recipe from a match-anything
-pattern rule or @code{.DEFAULT}, but you also do not want any recipe
-to be run for the target, you can give it an empty recipe
-(@pxref{Empty Recipes, ,Defining Empty Recipes}).@refill
-
-You can use a last-resort rule to override part of another makefile.
-@xref{Overriding Makefiles, , Overriding Part of Another Makefile}.
-
-@node Suffix Rules, Implicit Rule Search, Last Resort, Implicit Rules
-@section Old-Fashioned Suffix Rules
-@cindex old-fashioned suffix rules
-@cindex suffix rule
-
-@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 prerequisite is made by
-replacing the target suffix with the source suffix in the file name. 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
-prerequisite 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}. Here is the old-fashioned
-way to define the rule for compiling a C source file:@refill
-
-@example
-.c.o:
- $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@@ $<
-@end example
-
-Suffix rules cannot have any prerequisites of their own. If they have any,
-they are treated as normal files with funny names, not as suffix rules.
-Thus, the rule:
-
-@example
-.c.o: foo.h
- $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@@ $<
-@end example
-
-@noindent
-tells how to make the file @file{.c.o} from the prerequisite file
-@file{foo.h}, and is not at all like the pattern rule:
-
-@example
-%.o: %.c foo.h
- $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@@ $<
-@end example
-
-@noindent
-which tells how to make @samp{.o} files from @samp{.c} files, and makes all
-@samp{.o} files using this pattern rule also depend on @file{foo.h}.
-
-Suffix rules with no recipe are also meaningless. They do not remove
-previous rules as do pattern rules with no recipe (@pxref{Canceling
-Rules, , Canceling Implicit Rules}). They simply enter the suffix or
-pair of suffixes concatenated as a target in the data base.@refill
-
-@findex .SUFFIXES
-The known suffixes are simply the names of the prerequisites of the special
-target @code{.SUFFIXES}. You can add your own suffixes by writing a rule
-for @code{.SUFFIXES} that adds more prerequisites, 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 prerequisites. By
-special dispensation, this eliminates all existing prerequisites of
-@code{.SUFFIXES}. You can then write another rule to add the suffixes you
-want. For example,
-
-@example
-@group
-.SUFFIXES: # @r{Delete the default suffixes}
-.SUFFIXES: .c .o .h # @r{Define our suffix list}
-@end group
-@end example
-
-The @samp{-r} or @samp{--no-builtin-rules} flag causes the default
-list of suffixes to be empty.
-
-@vindex SUFFIXES
-The variable @code{SUFFIXES} is defined to the default list of suffixes
-before @code{make} reads any makefiles. You can change the list of suffixes
-with a rule for the special target @code{.SUFFIXES}, but that does not alter
-this variable.
-
-@node Implicit Rule Search, , Suffix Rules, Implicit Rules
-@section Implicit Rule Search Algorithm
-@cindex implicit rule, search algorithm
-@cindex search algorithm, implicit rule
-
-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 recipe, for each target of ordinary rules none of which have
-a recipe, and for each prerequisite that is not the target of any rule. It
-is also followed recursively for prerequisites 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 once 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 the entire target name @var{t}, and second using
-@samp{(@var{member})} as the target @var{t} 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 all the pattern rules one of whose targets matches
-@var{t} 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 from the list all rules with no recipe.
-
-@item
-For each pattern rule in the list:
-
-@enumerate a
-@item
-Find the stem @var{s}, which is the nonempty part of @var{t} or @var{n}
-matched by the @samp{%} in the target pattern.@refill
-
-@item
-Compute the prerequisite names by substituting @var{s} for @samp{%}; if
-the target pattern does not contain a slash, append @var{d} to
-the front of each prerequisite name.@refill
-
-@item
-Test whether all the prerequisites exist or ought to exist. (If a
-file name is mentioned in the makefile as a target or as an explicit
-prerequisite, then we say it ought to exist.)
-
-If all prerequisites exist or ought to exist, or there are no prerequisites,
-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 a
-@item
-If the rule is terminal, ignore it and go on to the next rule.
-
-@item
-Compute the prerequisite names as before.
-
-@item
-Test whether all the prerequisites exist or ought to exist.
-
-@item
-For each prerequisite that does not exist, follow this algorithm
-recursively to see if the prerequisite can be made by an implicit
-rule.
-
-@item
-If all prerequisites exist, ought to exist, or can be
-made by implicit rules, then this rule applies.
-@end enumerate
-
-@item
-If no implicit rule applies, the rule for @code{.DEFAULT}, if any,
-applies. In that case, give @var{t} the same recipe that
-@code{.DEFAULT} has. Otherwise, there is no recipe for @var{t}.
-@end enumerate
-
-Once a rule that applies has been found, for each target pattern of
-the rule other than the one that matched @var{t} or @var{n}, the
-@samp{%} in the pattern is replaced with @var{s} and the resultant
-file name is stored until the recipe to remake the target file @var{t}
-is executed. After the recipe is executed, each of these stored file
-names are entered into the data base and marked as having been updated
-and having the same update status as the file @var{t}.
-
-When the recipe of a pattern rule is executed for @var{t}, the
-automatic variables are set corresponding to the target and
-prerequisites. @xref{Automatic Variables}.
-
-@node Archives, Features, Implicit Rules, 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
-* Archive Members:: Archive members as targets.
-* Archive Update:: The implicit rule for archive member targets.
-* Archive Pitfalls:: Dangers to watch out for when using archives.
-* Archive Suffix Rules:: You can write a special kind of suffix rule
- for updating archives.
-@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
-prerequisite in @code{make}. 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 prerequisites, not in
-recipes! Most programs that you might use in recipes 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 recipes 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 cr 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. @strong{Please note:} The
-@samp{c} flag to @code{ar} is required if the archive file does not
-already exist.
-
-To specify several members in the same archive, you can write all the
-member names together between the parentheses. For example:
-
-@example
-foolib(hack.o kludge.o)
-@end example
-
-@noindent
-is equivalent to:
-
-@example
-foolib(hack.o) foolib(kludge.o)
-@end example
-
-@cindex wildcard, in archive member
-You can also use shell-style wildcards in an archive member reference.
-@xref{Wildcards, ,Using Wildcard Characters in File Names}. For
-example, @w{@samp{foolib(*.o)}} expands to all existing members of the
-@file{foolib} archive whose names end in @samp{.o}; perhaps
-@samp{@w{foolib(hack.o)} @w{foolib(kludge.o)}}.
-
-@node Archive Update, Archive Pitfalls, 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 @emph{member} named @file{bar.o}.
-
-When this rule is chained with others, the result is very powerful.
-Thus, @samp{make "foo.a(bar.o)"} (the quotes are needed to protect the
-@samp{(} and @samp{)} from being interpreted specially by the shell) in
-the presence of a file @file{bar.c} is enough to cause the following
-recipe 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 @code{make} has envisioned the file @file{bar.o} as an intermediate
-file. @xref{Chained Rules, ,Chains of Implicit Rules}.
-
-Implicit rules such as this one are written using the automatic variable
-@samp{$%}. @xref{Automatic Variables}.
-
-An archive member name in an archive cannot contain a directory name, but
-it may be useful in a makefile to pretend that it does. If you write an
-archive member target @file{foo.a(dir/file.o)}, @code{make} will perform
-automatic updating with this recipe:
-
-@example
-ar r foo.a dir/file.o
-@end example
-
-@noindent
-which has the effect of copying the file @file{dir/file.o} into a member
-named @file{file.o}. In connection with such usage, the automatic variables
-@code{%D} and @code{%F} may be useful.
-
-@menu
-* Archive Symbols:: How to update archive symbol directories.
-@end menu
-
-@node Archive Symbols, , Archive Update, Archive Update
-@subsection Updating Archive Symbol Directories
-@cindex @code{__.SYMDEF}
-@cindex updating archive symbol directories
-@cindex archive symbol directory updating
-@cindex symbol directories, updating archive
-@cindex directories, updating archive symbol
-
-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 prerequisites 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.
-
-This is not necessary when using the GNU @code{ar} program, which
-updates the @file{__.SYMDEF} member automatically.
-
-@node Archive Pitfalls, Archive Suffix Rules, Archive Update, Archives
-@section Dangers When Using Archives
-@cindex archive, and parallel execution
-@cindex parallel execution, and archive update
-@cindex archive, and @code{-j}
-@cindex @code{-j}, and archive update
-
-It is important to be careful when using parallel execution (the
-@code{-j} switch; @pxref{Parallel, ,Parallel Execution}) and archives.
-If multiple @code{ar} commands run at the same time on the same archive
-file, they will not know about each other and can corrupt the file.
-
-Possibly a future version of @code{make} will provide a mechanism to
-circumvent this problem by serializing all recipes that operate on the
-same archive file. But for the time being, you must either write your
-makefiles to avoid this problem in some other way, or not use @code{-j}.
-
-@node Archive Suffix Rules, , Archive Pitfalls, Archives
-@section Suffix Rules for Archive Files
-@cindex suffix rule, for archive
-@cindex archive, suffix rule for
-@cindex library archive, suffix rule for
-@cindex @code{.a} (archives)
-
-You can write a special kind of suffix rule for dealing with archive
-files. @xref{Suffix Rules}, for a full explanation of suffix rules.
-Archive suffix rules are obsolete in GNU @code{make}, because pattern
-rules for archives are a more general mechanism (@pxref{Archive
-Update}). But they are retained for compatibility with other
-@code{make}s.
-
-To write a suffix rule for archives, you simply write a suffix rule
-using the target suffix @samp{.a} (the usual suffix for archive files).
-For example, here is the old-fashioned suffix rule to update a library
-archive from C source files:
-
-@example
-@group
-.c.a:
- $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
- $(AR) r $@@ $*.o
- $(RM) $*.o
-@end group
-@end example
-
-@noindent
-This works just as if you had written the pattern rule:
-
-@example
-@group
-(%.o): %.c
- $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
- $(AR) r $@@ $*.o
- $(RM) $*.o
-@end group
-@end example
-
-In fact, this is just what @code{make} does when it sees a suffix rule
-with @samp{.a} as the target suffix. Any double-suffix rule
-@w{@samp{.@var{x}.a}} is converted to a pattern rule with the target
-pattern @samp{(%.o)} and a prerequisite pattern of @samp{%.@var{x}}.
-
-Since you might want to use @samp{.a} as the suffix for some other kind
-of file, @code{make} also converts archive suffix rules to pattern rules
-in the normal way (@pxref{Suffix Rules}). Thus a double-suffix rule
-@w{@samp{.@var{x}.a}} produces two pattern rules: @samp{@w{(%.o):}
-@w{%.@var{x}}} and @samp{@w{%.a}: @w{%.@var{x}}}.@refill
-
-@node Features, Missing, Archives, Top
-@chapter Features of GNU @code{make}
-@cindex features of GNU @code{make}
-@cindex portability
-@cindex compatibility
-
-Here is a summary of the features of GNU @code{make}, for comparison
-with and credit to other versions of @code{make}. We consider the
-features of @code{make} in 4.2 BSD systems as a baseline. If you are
-concerned with writing portable makefiles, you should not use the
-features of @code{make} listed here, nor the ones in @ref{Missing}.
-
-Many features come from the version of @code{make} in System V.
-
-@itemize @bullet
-@item
-The @code{VPATH} variable and its special meaning.
-@xref{Directory Search, , Searching Directories for Prerequisites}.
-This feature exists in System V @code{make}, but is undocumented.
-It is documented in 4.3 BSD @code{make} (which says it mimics System V's
-@code{VPATH} feature).@refill
-
-@item
-Included makefiles. @xref{Include, ,Including Other Makefiles}.
-Allowing multiple files to be included with a single directive is a GNU
-extension.
-
-@item
-Variables are read from and communicated via the environment.
-@xref{Environment, ,Variables from the Environment}.
-
-@item
-Options passed through the variable @code{MAKEFLAGS} to recursive
-invocations of @code{make}.
-@xref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}.
-
-@item
-The automatic variable @code{$%} is set to the member name
-in an archive reference. @xref{Automatic Variables}.
-
-@item
-The automatic variables @code{$@@}, @code{$*}, @code{$<}, @code{$%},
-and @code{$?} have corresponding forms like @code{$(@@F)} and
-@code{$(@@D)}. We have generalized this to @code{$^} as an obvious
-extension. @xref{Automatic Variables}.@refill
-
-@item
-Substitution variable references.
-@xref{Reference, ,Basics of Variable References}.
-
-@item
-The command line options @samp{-b} and @samp{-m}, accepted and
-ignored. In System V @code{make}, these options actually do something.
-
-@item
-Execution of recursive commands to run @code{make} via the variable
-@code{MAKE} even if @samp{-n}, @samp{-q} or @samp{-t} is specified.
-@xref{Recursion, ,Recursive Use of @code{make}}.
-
-@item
-Support for suffix @samp{.a} in suffix rules. @xref{Archive Suffix
-Rules}. This feature is obsolete in GNU @code{make}, because the
-general feature of rule chaining (@pxref{Chained Rules, ,Chains of
-Implicit Rules}) allows one pattern rule for installing members in an
-archive (@pxref{Archive Update}) to be sufficient.
-
-@item
-The arrangement of lines and backslash-newline combinations in
-recipes is retained when the recipes are printed, so they appear as
-they do in the makefile, except for the stripping of initial
-whitespace.
-@end itemize
-
-The following features were inspired by various other versions of
-@code{make}. In some cases it is unclear exactly which versions inspired
-which others.
-
-@itemize @bullet
-@item
-Pattern rules using @samp{%}.
-This has been implemented in several versions of @code{make}.
-We're not sure who invented it first, but it's been spread around a bit.
-@xref{Pattern Rules, ,Defining and Redefining Pattern Rules}.@refill
-
-@item
-Rule chaining and implicit intermediate files.
-This was implemented by Stu Feldman in his version of @code{make}
-for AT&T Eighth Edition Research Unix, and later by Andrew Hume of
-AT&T Bell Labs in his @code{mk} program (where he terms it
-``transitive closure''). We do not really know if
-we got this from either of them or thought it up ourselves at the
-same time. @xref{Chained Rules, ,Chains of Implicit Rules}.
-
-@item
-The automatic variable @code{$^} containing a list of all prerequisites
-of the current target. We did not invent this, but we have no idea who
-did. @xref{Automatic Variables}. The automatic variable
-@code{$+} is a simple extension of @code{$^}.
-
-@item
-The ``what if'' flag (@samp{-W} in GNU @code{make}) was (as far as we know)
-invented by Andrew Hume in @code{mk}.
-@xref{Instead of Execution, ,Instead of Executing the Recipes}.
-
-@item
-The concept of doing several things at once (parallelism) exists in
-many incarnations of @code{make} and similar programs, though not in the
-System V or BSD implementations. @xref{Execution, ,Recipe Execution}.
-
-@item
-Modified variable references using pattern substitution come from
-SunOS 4. @xref{Reference, ,Basics of Variable References}.
-This functionality was provided in GNU @code{make} by the
-@code{patsubst} function before the alternate syntax was implemented
-for compatibility with SunOS 4. It is not altogether clear who
-inspired whom, since GNU @code{make} had @code{patsubst} before SunOS
-4 was released.@refill
-
-@item
-The special significance of @samp{+} characters preceding recipe lines
-(@pxref{Instead of Execution, ,Instead of Executing the Recipes}) is
-mandated by @cite{IEEE Standard 1003.2-1992} (POSIX.2).
-
-@item
-The @samp{+=} syntax to append to the value of a variable comes from SunOS
-4 @code{make}. @xref{Appending, , Appending More Text to Variables}.
-
-@item
-The syntax @w{@samp{@var{archive}(@var{mem1} @var{mem2}@dots{})}} to list
-multiple members in a single archive file comes from SunOS 4 @code{make}.
-@xref{Archive Members}.
-
-@item
-The @code{-include} directive to include makefiles with no error for a
-nonexistent file comes from SunOS 4 @code{make}. (But note that SunOS 4
-@code{make} does not allow multiple makefiles to be specified in one
-@code{-include} directive.) The same feature appears with the name
-@code{sinclude} in SGI @code{make} and perhaps others.
-@end itemize
-
-The remaining features are inventions new in GNU @code{make}:
-
-@itemize @bullet
-@item
-Use the @samp{-v} or @samp{--version} option to print version and
-copyright information.
-
-@item
-Use the @samp{-h} or @samp{--help} option to summarize the options to
-@code{make}.
-
-@item
-Simply-expanded variables. @xref{Flavors, ,The Two Flavors of Variables}.
-
-@item
-Pass command line variable assignments automatically through the
-variable @code{MAKE} to recursive @code{make} invocations.
-@xref{Recursion, ,Recursive Use of @code{make}}.
-
-@item
-Use the @samp{-C} or @samp{--directory} command option to change
-directory. @xref{Options Summary, ,Summary of Options}.
-
-@item
-Make verbatim variable definitions with @code{define}.
-@xref{Defining, ,Defining Variables Verbatim}.
-
-@item
-Declare phony targets with the special target @code{.PHONY}.
-
-Andrew Hume of AT&T Bell Labs implemented a similar feature with a
-different syntax in his @code{mk} program. This seems to be a case of
-parallel discovery. @xref{Phony Targets, ,Phony Targets}.
-
-@item
-Manipulate text by calling functions.
-@xref{Functions, ,Functions for Transforming Text}.
-
-@item
-Use the @samp{-o} or @samp{--old-file}
-option to pretend a file's modification-time is old.
-@xref{Avoiding Compilation, ,Avoiding Recompilation of Some Files}.
-
-@item
-Conditional execution.
-
-This feature has been implemented numerous times in various versions
-of @code{make}; it seems a natural extension derived from the features
-of the C preprocessor and similar macro languages and is not a
-revolutionary concept. @xref{Conditionals, ,Conditional Parts of Makefiles}.
-
-@item
-Specify a search path for included makefiles.
-@xref{Include, ,Including Other Makefiles}.
-
-@item
-Specify extra makefiles to read with an environment variable.
-@xref{MAKEFILES Variable, ,The Variable @code{MAKEFILES}}.
-
-@item
-Strip leading sequences of @samp{./} from file names, so that
-@file{./@var{file}} and @file{@var{file}} are considered to be the
-same file.@refill
-
-@item
-Use a special search method for library prerequisites written in the
-form @samp{-l@var{name}}.
-@xref{Libraries/Search, ,Directory Search for Link Libraries}.
-
-@item
-Allow suffixes for suffix rules
-(@pxref{Suffix Rules, ,Old-Fashioned Suffix Rules}) to contain any
-characters. In other versions of @code{make}, they must begin with
-@samp{.} and not contain any @samp{/} characters.
-
-@item
-Keep track of the current level of @code{make} recursion using the
-variable @code{MAKELEVEL}. @xref{Recursion, ,Recursive Use of @code{make}}.
-
-@item
-Provide any goals given on the command line in the variable
-@code{MAKECMDGOALS}. @xref{Goals, ,Arguments to Specify the Goals}.
-
-@item
-Specify static pattern rules. @xref{Static Pattern, ,Static Pattern Rules}.
-
-@item
-Provide selective @code{vpath} search.
-@xref{Directory Search, ,Searching Directories for Prerequisites}.
-
-@item
-Provide computed variable references.
-@xref{Reference, ,Basics of Variable References}.
-
-@item
-Update makefiles. @xref{Remaking Makefiles, ,How Makefiles Are Remade}.
-System V @code{make} has a very, very limited form of this
-functionality in that it will check out SCCS files for makefiles.
-
-@item
-Various new built-in implicit rules.
-@xref{Catalogue of Rules, ,Catalogue of Implicit Rules}.
-
-@item
-The built-in variable @samp{MAKE_VERSION} gives the version number of
-@code{make}.
-@vindex MAKE_VERSION
-@end itemize
-
-@node Missing, Makefile Conventions, Features, Top
-@chapter Incompatibilities and Missing Features
-@cindex incompatibilities
-@cindex missing features
-@cindex features, missing
-
-The @code{make} programs in various other systems support a few features
-that are not implemented in GNU @code{make}. The POSIX.2 standard
-(@cite{IEEE Standard 1003.2-1992}) which specifies @code{make} does not
-require any of these features.@refill
-
-@itemize @bullet
-@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 tables.
-@xref{Archive Symbols, ,Updating Archive Symbol Directories}.
-
-@item
-Suffixes (used in suffix rules) that end with the character @samp{~}
-have a special meaning to System V @code{make};
-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} from
-the SCCS file @file{s.@var{n}.c}. For complete coverage, a whole
-series of such suffix rules is required.
-@xref{Suffix Rules, ,Old-Fashioned Suffix Rules}.
-
-In GNU @code{make}, this entire series of cases is handled by two
-pattern rules for extraction from SCCS, in combination with the
-general feature of rule chaining.
-@xref{Chained Rules, ,Chains of Implicit Rules}.
-
-@item
-In System V and 4.3 BSD @code{make}, files found by @code{VPATH}
-search (@pxref{Directory Search, ,Searching Directories for
-Prerequisites}) have their names changed inside recipes. We feel it
-is much cleaner to always use automatic variables and thus make this
-feature obsolete.@refill
-
-@item
-In some Unix @code{make}s, the automatic variable @code{$*} appearing in
-the prerequisites of a rule has the amazingly strange ``feature'' of
-expanding to the full name of the @emph{target of that rule}. We cannot
-imagine what went on in the minds of Unix @code{make} developers to do
-this; it is utterly inconsistent with the normal definition of @code{$*}.
-@vindex * @r{(automatic variable), unsupported bizarre usage}
-
-@item
-In some Unix @code{make}s, implicit rule search (@pxref{Implicit
-Rules, ,Using Implicit Rules}) is apparently done for @emph{all}
-targets, not just those without recipes. This means you can
-do:@refill
-
-@example
-@group
-foo.o:
- cc -c foo.c
-@end group
-@end example
-
-@noindent
-and Unix @code{make} will intuit that @file{foo.o} depends on
-@file{foo.c}.@refill
-
-We feel that such usage is broken. The prerequisite properties of
-@code{make} are well-defined (for GNU @code{make}, at least),
-and doing such a thing simply does not fit the model.@refill
-
-@item
-GNU @code{make} does not include any built-in implicit rules for
-compiling or preprocessing EFL programs. If we hear of anyone who is
-using EFL, we will gladly add them.
-
-@item
-It appears that in SVR4 @code{make}, a suffix rule can be specified
-with no recipe, and it is treated as if it had an empty recipe
-(@pxref{Empty Recipes}). For example:
-
-@example
-.c.a:
-@end example
-
-@noindent
-will override the built-in @file{.c.a} suffix rule.
-
-We feel that it is cleaner for a rule without a recipe to always simply
-add to the prerequisite list for the target. The above example can be
-easily rewritten to get the desired behavior in GNU @code{make}:
-
-@example
-.c.a: ;
-@end example
-
-@item
-Some versions of @code{make} invoke the shell with the @samp{-e} flag,
-except under @samp{-k} (@pxref{Testing, ,Testing the Compilation of a
-Program}). The @samp{-e} flag tells the shell to exit as soon as any
-program it runs returns a nonzero status. We feel it is cleaner to
-write each line of the recipe to stand on its own and not require this
-special treatment.
-@end itemize
-
-@comment The makefile standards are in a separate file that is also
-@comment included by standards.texi.
-@include make-stds.texi
-
-@node Quick Reference, Error Messages, Makefile Conventions, Top
-@appendix Quick Reference
-
-This appendix summarizes the directives, text manipulation functions,
-and special variables which GNU @code{make} understands.
-@xref{Special Targets}, @ref{Catalogue of Rules, ,Catalogue of Implicit Rules},
-and @ref{Options Summary, ,Summary of Options},
-for other summaries.
-
-Here is a summary of the directives GNU @code{make} recognizes:
-
-@table @code
-@item define @var{variable}
-@itemx endef
-
-Define a multi-line, recursively-expanded variable.@*
-@xref{Sequences}.
-
-@item ifdef @var{variable}
-@itemx ifndef @var{variable}
-@itemx ifeq (@var{a},@var{b})
-@itemx ifeq "@var{a}" "@var{b}"
-@itemx ifeq '@var{a}' '@var{b}'
-@itemx ifneq (@var{a},@var{b})
-@itemx ifneq "@var{a}" "@var{b}"
-@itemx ifneq '@var{a}' '@var{b}'
-@itemx else
-@itemx endif
-
-Conditionally evaluate part of the makefile.@*
-@xref{Conditionals}.
-
-@item include @var{file}
-@itemx -include @var{file}
-@itemx sinclude @var{file}
-
-Include another makefile.@*
-@xref{Include, ,Including Other Makefiles}.
-
-@item override @var{variable} = @var{value}
-@itemx override @var{variable} := @var{value}
-@itemx override @var{variable} += @var{value}
-@itemx override @var{variable} ?= @var{value}
-@itemx override define @var{variable}
-@itemx endef
-
-Define a variable, overriding any previous definition, even one from
-the command line.@*
-@xref{Override Directive, ,The @code{override} Directive}.
-
-@item export
-
-Tell @code{make} to export all variables to child processes by default.@*
-@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
-
-@item export @var{variable}
-@itemx export @var{variable} = @var{value}
-@itemx export @var{variable} := @var{value}
-@itemx export @var{variable} += @var{value}
-@itemx export @var{variable} ?= @var{value}
-@itemx unexport @var{variable}
-Tell @code{make} whether or not to export a particular variable to child
-processes.@*
-@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
-
-@item vpath @var{pattern} @var{path}
-Specify a search path for files matching a @samp{%} pattern.@*
-@xref{Selective Search, , The @code{vpath} Directive}.
-
-@item vpath @var{pattern}
-Remove all search paths previously specified for @var{pattern}.
-
-@item vpath
-Remove all search paths previously specified in any @code{vpath}
-directive.
-@end table
-
-Here is a summary of the built-in functions (@pxref{Functions}):
-
-@table @code
-@item $(subst @var{from},@var{to},@var{text})
-Replace @var{from} with @var{to} in @var{text}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(patsubst @var{pattern},@var{replacement},@var{text})
-Replace words matching @var{pattern} with @var{replacement} in @var{text}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(strip @var{string})
-Remove excess whitespace characters from @var{string}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(findstring @var{find},@var{text})
-Locate @var{find} in @var{text}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(filter @var{pattern}@dots{},@var{text})
-Select words in @var{text} that match one of the @var{pattern} words.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(filter-out @var{pattern}@dots{},@var{text})
-Select words in @var{text} that @emph{do not} match any of the @var{pattern} words.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(sort @var{list})
-Sort the words in @var{list} lexicographically, removing duplicates.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(word @var{n},@var{text})
-Extract the @var{n}th word (one-origin) of @var{text}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(words @var{text})
-Count the number of words in @var{text}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(wordlist @var{s},@var{e},@var{text})
-Returns the list of words in @var{text} from @var{s} to @var{e}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(firstword @var{names}@dots{})
-Extract the first word of @var{names}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(lastword @var{names}@dots{})
-Extract the last word of @var{names}.@*
-@xref{Text Functions, , Functions for String Substitution and Analysis}.
-
-@item $(dir @var{names}@dots{})
-Extract the directory part of each file name.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(notdir @var{names}@dots{})
-Extract the non-directory part of each file name.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(suffix @var{names}@dots{})
-Extract the suffix (the last @samp{.} and following characters) of each file name.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(basename @var{names}@dots{})
-Extract the base name (name without suffix) of each file name.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(addsuffix @var{suffix},@var{names}@dots{})
-Append @var{suffix} to each word in @var{names}.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(addprefix @var{prefix},@var{names}@dots{})
-Prepend @var{prefix} to each word in @var{names}.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(join @var{list1},@var{list2})
-Join two parallel lists of words.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(wildcard @var{pattern}@dots{})
-Find file names matching a shell file name pattern (@emph{not} a
-@samp{%} pattern).@*
-@xref{Wildcard Function, ,The Function @code{wildcard}}.
-
-@item $(realpath @var{names}@dots{})
-For each file name in @var{names}, expand to an absolute name that
-does not contain any @code{.}, @code{..}, nor symlinks.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(abspath @var{names}@dots{})
-For each file name in @var{names}, expand to an absolute name that
-does not contain any @code{.} or @code{..} components, but preserves
-symlinks.@*
-@xref{File Name Functions, ,Functions for File Names}.
-
-@item $(error @var{text}@dots{})
-
-When this function is evaluated, @code{make} generates a fatal error
-with the message @var{text}.@*
-@xref{Make Control Functions, ,Functions That Control Make}.
-
-@item $(warning @var{text}@dots{})
-
-When this function is evaluated, @code{make} generates a warning with
-the message @var{text}.@*
-@xref{Make Control Functions, ,Functions That Control Make}.
-
-@item $(shell @var{command})
-
-Execute a shell command and return its output.@*
-@xref{Shell Function, , The @code{shell} Function}.
-
-@item $(origin @var{variable})
-
-Return a string describing how the @code{make} variable @var{variable} was
-defined.@*
-@xref{Origin Function, , The @code{origin} Function}.
-
-@item $(flavor @var{variable})
-
-Return a string describing the flavor of the @code{make} variable
-@var{variable}.@*
-@xref{Flavor Function, , The @code{flavor} Function}.
-
-@item $(foreach @var{var},@var{words},@var{text})
-
-Evaluate @var{text} with @var{var} bound to each word in @var{words},
-and concatenate the results.@*
-@xref{Foreach Function, ,The @code{foreach} Function}.
-
-@item $(call @var{var},@var{param},@dots{})
-
-Evaluate the variable @var{var} replacing any references to @code{$(1)},
-@code{$(2)} with the first, second, etc.@: @var{param} values.@*
-@xref{Call Function, ,The @code{call} Function}.
-
-@item $(eval @var{text})
-
-Evaluate @var{text} then read the results as makefile commands.
-Expands to the empty string.@*
-@xref{Eval Function, ,The @code{eval} Function}.
-
-@item $(value @var{var})
-
-Evaluates to the contents of the variable @var{var}, with no expansion
-performed on it.@*
-@xref{Value Function, ,The @code{value} Function}.
-@end table
-
-Here is a summary of the automatic variables.
-@xref{Automatic Variables},
-for full information.
-
-@table @code
-@item $@@
-The file name of the target.
-
-@item $%
-The target member name, when the target is an archive member.
-
-@item $<
-The name of the first prerequisite.
-
-@item $?
-The names of all the prerequisites that are
-newer than the target, with spaces between them.
-For prerequisites which are archive members, only
-the named member is used (@pxref{Archives}).
-
-@item $^
-@itemx $+
-The names of all the prerequisites, with spaces between them. For
-prerequisites which are archive members, only the named member is used
-(@pxref{Archives}). The value of @code{$^} omits duplicate
-prerequisites, while @code{$+} retains them and preserves their order.
-
-@item $*
-The stem with which an implicit rule matches
-(@pxref{Pattern Match, ,How Patterns Match}).
-
-@item $(@@D)
-@itemx $(@@F)
-The directory part and the file-within-directory part of @code{$@@}.
-
-@item $(*D)
-@itemx $(*F)
-The directory part and the file-within-directory part of @code{$*}.
-
-@item $(%D)
-@itemx $(%F)
-The directory part and the file-within-directory part of @code{$%}.
-
-@item $(<D)
-@itemx $(<F)
-The directory part and the file-within-directory part of @code{$<}.
-
-@item $(^D)
-@itemx $(^F)
-The directory part and the file-within-directory part of @code{$^}.
-
-@item $(+D)
-@itemx $(+F)
-The directory part and the file-within-directory part of @code{$+}.
-
-@item $(?D)
-@itemx $(?F)
-The directory part and the file-within-directory part of @code{$?}.
-@end table
-
-These variables are used specially by GNU @code{make}:
-
-@table @code
-@item MAKEFILES
-
-Makefiles to be read on every invocation of @code{make}.@*
-@xref{MAKEFILES Variable, ,The Variable @code{MAKEFILES}}.
-
-@item VPATH
-
-Directory search path for files not found in the current directory.@*
-@xref{General Search, , @code{VPATH} Search Path for All Prerequisites}.
-
-@item SHELL
-
-The name of the system default command interpreter, usually @file{/bin/sh}.
-You can set @code{SHELL} in the makefile to change the shell used to run
-recipes. @xref{Execution, ,Recipe Execution}. The @code{SHELL}
-variable is handled specially when importing from and exporting to the
-environment. @xref{Choosing the Shell}.
-
-@item MAKESHELL
-
-On MS-DOS only, the name of the command interpreter that is to be used
-by @code{make}. This value takes precedence over the value of
-@code{SHELL}. @xref{Execution, ,MAKESHELL variable}.
-
-@item MAKE
-
-The name with which @code{make} was invoked. Using this variable in
-recipes has special meaning. @xref{MAKE Variable, ,How the
-@code{MAKE} Variable Works}.
-
-@item MAKELEVEL
-
-The number of levels of recursion (sub-@code{make}s).@*
-@xref{Variables/Recursion}.
-
-@item MAKEFLAGS
-
-The flags given to @code{make}. You can set this in the environment or
-a makefile to set flags.@*
-@xref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}.
-
-It is @emph{never} appropriate to use @code{MAKEFLAGS} directly in a
-recipe line: its contents may not be quoted correctly for use in the
-shell. Always allow recursive @code{make}'s to obtain these values
-through the environment from its parent.
-
-@item MAKECMDGOALS
-
-The targets given to @code{make} on the command line. Setting this
-variable has no effect on the operation of @code{make}.@*
-@xref{Goals, ,Arguments to Specify the Goals}.
-
-@item CURDIR
-
-Set to the pathname of the current working directory (after all
-@code{-C} options are processed, if any). Setting this variable has no
-effect on the operation of @code{make}.@*
-@xref{Recursion, ,Recursive Use of @code{make}}.
-
-@item SUFFIXES
-
-The default list of suffixes before @code{make} reads any makefiles.
-
-@item .LIBPATTERNS
-Defines the naming of the libraries @code{make} searches for, and their
-order.@*
-@xref{Libraries/Search, ,Directory Search for Link Libraries}.
-@end table
-
-@node Error Messages, Complex Makefile, Quick Reference, Top
-@comment node-name, next, previous, up
-@appendix Errors Generated by Make
-
-Here is a list of the more common errors you might see generated by
-@code{make}, and some information about what they mean and how to fix
-them.
-
-Sometimes @code{make} errors are not fatal, especially in the presence
-of a @code{-} prefix on a recipe line, or the @code{-k} command line
-option. Errors that are fatal are prefixed with the string
-@code{***}.
-
-Error messages are all either prefixed with the name of the program
-(usually @samp{make}), or, if the error is found in a makefile, the name
-of the file and linenumber containing the problem.
-
-In the table below, these common prefixes are left off.
-
-@table @samp
-
-@item [@var{foo}] Error @var{NN}
-@itemx [@var{foo}] @var{signal description}
-These errors are not really @code{make} errors at all. They mean that a
-program that @code{make} invoked as part of a recipe returned a
-non-0 error code (@samp{Error @var{NN}}), which @code{make} interprets
-as failure, or it exited in some other abnormal fashion (with a
-signal of some type). @xref{Errors, ,Errors in Recipes}.
-
-If no @code{***} is attached to the message, then the subprocess failed
-but the rule in the makefile was prefixed with the @code{-} special
-character, so @code{make} ignored the error.
-
-@item missing separator. Stop.
-@itemx missing separator (did you mean TAB instead of 8 spaces?). Stop.
-This means that @code{make} could not understand much of anything
-about the makefile line it just read. GNU @code{make} looks for
-various separators (@code{:}, @code{=}, recipe prefix characters,
-etc.) to indicate what kind of line it's parsing. This message means
-it couldn't find a valid one.
-
-One of the most common reasons for this message is that you (or
-perhaps your oh-so-helpful editor, as is the case with many MS-Windows
-editors) have attempted to indent your recipe lines with spaces
-instead of a tab character. In this case, @code{make} will use the
-second form of the error above. Remember that every line in the
-recipe must begin with a tab character (unless you set
-@code{.CMDPREFIX}; @pxref{Special Variables}). Eight spaces do not
-count. @xref{Rule Syntax}.
-
-@item recipe commences before first target. Stop.
-@itemx missing rule before recipe. Stop.
-This means the first thing in the makefile seems to be part of a
-recipe: it begins with a recipe prefix character and doesn't appear to
-be a legal @code{make} directive (such as a variable assignment).
-Recipes must always be associated with a target.
-
-The second form is generated if the line has a semicolon as the first
-non-whitespace character; @code{make} interprets this to mean you left
-out the "target: prerequisite" section of a rule. @xref{Rule Syntax}.
-
-@item No rule to make target `@var{xxx}'.
-@itemx No rule to make target `@var{xxx}', needed by `@var{yyy}'.
-This means that @code{make} decided it needed to build a target, but
-then couldn't find any instructions in the makefile on how to do that,
-either explicit or implicit (including in the default rules database).
-
-If you want that file to be built, you will need to add a rule to your
-makefile describing how that target can be built. Other possible
-sources of this problem are typos in the makefile (if that filename is
-wrong) or a corrupted source tree (if that file is not supposed to be
-built, but rather only a prerequisite).
-
-@item No targets specified and no makefile found. Stop.
-@itemx No targets. Stop.
-The former means that you didn't provide any targets to be built on the
-command line, and @code{make} couldn't find any makefiles to read in.
-The latter means that some makefile was found, but it didn't contain any
-default goal and none was given on the command line. GNU @code{make}
-has nothing to do in these situations.
-@xref{Makefile Arguments, ,Arguments to Specify the Makefile}.@refill
-
-@item Makefile `@var{xxx}' was not found.
-@itemx Included makefile `@var{xxx}' was not found.
-A makefile specified on the command line (first form) or included
-(second form) was not found.
-
-@item warning: overriding recipe for target `@var{xxx}'
-@itemx warning: ignoring old recipe for target `@var{xxx}'
-GNU @code{make} allows only one recipe to be specified per target
-(except for double-colon rules). If you give a recipe for a target
-which already has been defined to have one, this warning is issued and
-the second recipe will overwrite the first. @xref{Multiple Rules,
-,Multiple Rules for One Target}.
-
-@item Circular @var{xxx} <- @var{yyy} dependency dropped.
-This means that @code{make} detected a loop in the dependency graph:
-after tracing the prerequisite @var{yyy} of target @var{xxx}, and its
-prerequisites, etc., one of them depended on @var{xxx} again.
-
-@item Recursive variable `@var{xxx}' references itself (eventually). Stop.
-This means you've defined a normal (recursive) @code{make} variable
-@var{xxx} that, when it's expanded, will refer to itself (@var{xxx}).
-This is not allowed; either use simply-expanded variables (@code{:=}) or
-use the append operator (@code{+=}). @xref{Using Variables, ,How to Use
-Variables}.
-
-@item Unterminated variable reference. Stop.
-This means you forgot to provide the proper closing parenthesis
-or brace in your variable or function reference.
-
-@item insufficient arguments to function `@var{xxx}'. Stop.
-This means you haven't provided the requisite number of arguments for
-this function. See the documentation of the function for a description
-of its arguments. @xref{Functions, ,Functions for Transforming Text}.
-
-@item missing target pattern. Stop.
-@itemx multiple target patterns. Stop.
-@itemx target pattern contains no `%'. Stop.
-@itemx mixed implicit and static pattern rules. Stop.
-These are generated for malformed static pattern rules. The first means
-there's no pattern in the target section of the rule; the second means
-there are multiple patterns in the target section; the third means
-the target doesn't contain a pattern character (@code{%}); and the
-fourth means that all three parts of the static pattern rule contain
-pattern characters (@code{%})--only the first two parts should.
-@xref{Static Usage, ,Syntax of Static Pattern Rules}.
-
-@item warning: -jN forced in submake: disabling jobserver mode.
-This warning and the next are generated if @code{make} detects error
-conditions related to parallel processing on systems where
-sub-@code{make}s can communicate (@pxref{Options/Recursion,
-,Communicating Options to a Sub-@code{make}}). This warning is
-generated if a recursive invocation of a @code{make} process is forced
-to have @samp{-j@var{N}} in its argument list (where @var{N} is greater
-than one). This could happen, for example, if you set the @code{MAKE}
-environment variable to @samp{make -j2}. In this case, the
-sub-@code{make} doesn't communicate with other @code{make} processes and
-will simply pretend it has two jobs of its own.
-
-@item warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
-In order for @code{make} processes to communicate, the parent will pass
-information to the child. Since this could result in problems if the
-child process isn't actually a @code{make}, the parent will only do this
-if it thinks the child is a @code{make}. The parent uses the normal
-algorithms to determine this (@pxref{MAKE Variable, ,How the @code{MAKE}
-Variable Works}). If the makefile is constructed such that the parent
-doesn't know the child is a @code{make} process, then the child will
-receive only part of the information necessary. In this case, the child
-will generate this warning message and proceed with its build in a
-sequential manner.
-
-@end table
-
-@node Complex Makefile, GNU Free Documentation License, Error Messages, Top
-@appendix Complex Makefile Example
-
-Here is the makefile for the GNU @code{tar} program. This is a
-moderately complex makefile.
-
-Because it is the first target, the default goal is @samp{all}. An
-interesting feature of this makefile is that @file{testpad.h} is a
-source file automatically created by the @code{testpad} program,
-itself compiled from @file{testpad.c}.
-
-If you type @samp{make} or @samp{make all}, then @code{make} creates
-the @file{tar} executable, the @file{rmt} daemon that provides
-remote tape access, and the @file{tar.info} Info file.
-
-If you type @samp{make install}, then @code{make} not only creates
-@file{tar}, @file{rmt}, and @file{tar.info}, but also installs
-them.
-
-If you type @samp{make clean}, then @code{make} removes the @samp{.o}
-files, and the @file{tar}, @file{rmt}, @file{testpad},
-@file{testpad.h}, and @file{core} files.
-
-If you type @samp{make distclean}, then @code{make} not only removes
-the same files as does @samp{make clean} but also the
-@file{TAGS}, @file{Makefile}, and @file{config.status} files.
-(Although it is not evident, this makefile (and
-@file{config.status}) is generated by the user with the
-@code{configure} program, which is provided in the @code{tar}
-distribution, but is not shown here.)
-
-If you type @samp{make realclean}, then @code{make} removes the same
-files as does @samp{make distclean} and also removes the Info files
-generated from @file{tar.texinfo}.
-
-In addition, there are targets @code{shar} and @code{dist} that create
-distribution kits.
-
-@example
-@group
-# Generated automatically from Makefile.in by configure.
-# Un*x Makefile for GNU tar program.
-# Copyright (C) 1991 Free Software Foundation, Inc.
-@end group
-
-@group
-# This program is free software; you can redistribute
-# it and/or modify it under the terms of the GNU
-# General Public License @dots{}
-@dots{}
-@dots{}
-@end group
-
-SHELL = /bin/sh
-
-#### Start of system configuration section. ####
-
-srcdir = .
-
-@group
-# If you use gcc, you should either run the
-# fixincludes script that comes with it or else use
-# gcc with the -traditional option. Otherwise ioctl
-# calls will be compiled incorrectly on some systems.
-CC = gcc -O
-YACC = bison -y
-INSTALL = /usr/local/bin/install -c
-INSTALLDATA = /usr/local/bin/install -c -m 644
-@end group
-
-# Things you might add to DEFS:
-# -DSTDC_HEADERS If you have ANSI C headers and
-# libraries.
-# -DPOSIX If you have POSIX.1 headers and
-# libraries.
-# -DBSD42 If you have sys/dir.h (unless
-# you use -DPOSIX), sys/file.h,
-# and st_blocks in `struct stat'.
-# -DUSG If you have System V/ANSI C
-# string and memory functions
-# and headers, sys/sysmacros.h,
-# fcntl.h, getcwd, no valloc,
-# and ndir.h (unless
-# you use -DDIRENT).
-# -DNO_MEMORY_H If USG or STDC_HEADERS but do not
-# include memory.h.
-# -DDIRENT If USG and you have dirent.h
-# instead of ndir.h.
-# -DSIGTYPE=int If your signal handlers
-# return int, not void.
-# -DNO_MTIO If you lack sys/mtio.h
-# (magtape ioctls).
-# -DNO_REMOTE If you do not have a remote shell
-# or rexec.
-# -DUSE_REXEC To use rexec for remote tape
-# operations instead of
-# forking rsh or remsh.
-# -DVPRINTF_MISSING If you lack vprintf function
-# (but have _doprnt).
-# -DDOPRNT_MISSING If you lack _doprnt function.
-# Also need to define
-# -DVPRINTF_MISSING.
-# -DFTIME_MISSING If you lack ftime system call.
-# -DSTRSTR_MISSING If you lack strstr function.
-# -DVALLOC_MISSING If you lack valloc function.
-# -DMKDIR_MISSING If you lack mkdir and
-# rmdir system calls.
-# -DRENAME_MISSING If you lack rename system call.
-# -DFTRUNCATE_MISSING If you lack ftruncate
-# system call.
-# -DV7 On Version 7 Unix (not
-# tested in a long time).
-# -DEMUL_OPEN3 If you lack a 3-argument version
-# of open, and want to emulate it
-# with system calls you do have.
-# -DNO_OPEN3 If you lack the 3-argument open
-# and want to disable the tar -k
-# option instead of emulating open.
-# -DXENIX If you have sys/inode.h
-# and need it 94 to be included.
-
-DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
- -DVPRINTF_MISSING -DBSD42
-# Set this to rtapelib.o unless you defined NO_REMOTE,
-# in which case make it empty.
-RTAPELIB = rtapelib.o
-LIBS =
-DEF_AR_FILE = /dev/rmt8
-DEFBLOCKING = 20
-
-@group
-CDEBUG = -g
-CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \
- -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \
- -DDEFBLOCKING=$(DEFBLOCKING)
-LDFLAGS = -g
-@end group
-
-@group
-prefix = /usr/local
-# Prefix for each installed program,
-# normally empty or `g'.
-binprefix =
-
-# The directory to install tar in.
-bindir = $(prefix)/bin
-
-# The directory to install the info files in.
-infodir = $(prefix)/info
-@end group
-
-#### End of system configuration section. ####
-
-SRC1 = tar.c create.c extract.c buffer.c \
- getoldopt.c update.c gnu.c mangle.c
-SRC2 = version.c list.c names.c diffarch.c \
- port.c wildmat.c getopt.c
-SRC3 = getopt1.c regex.c getdate.y
-SRCS = $(SRC1) $(SRC2) $(SRC3)
-OBJ1 = tar.o create.o extract.o buffer.o \
- getoldopt.o update.o gnu.o mangle.o
-OBJ2 = version.o list.o names.o diffarch.o \
- port.o wildmat.o getopt.o
-OBJ3 = getopt1.o regex.o getdate.o $(RTAPELIB)
-OBJS = $(OBJ1) $(OBJ2) $(OBJ3)
-@group
-AUX = README COPYING ChangeLog Makefile.in \
- makefile.pc configure configure.in \
- tar.texinfo tar.info* texinfo.tex \
- tar.h port.h open3.h getopt.h regex.h \
- rmt.h rmt.c rtapelib.c alloca.c \
- msd_dir.h msd_dir.c tcexparg.c \
- level-0 level-1 backup-specs testpad.c
-@end group
-
-.PHONY: all
-all: tar rmt tar.info
-
-@group
-tar: $(OBJS)
- $(CC) $(LDFLAGS) -o $@@ $(OBJS) $(LIBS)
-@end group
-
-@group
-rmt: rmt.c
- $(CC) $(CFLAGS) $(LDFLAGS) -o $@@ rmt.c
-@end group
-
-@group
-tar.info: tar.texinfo
- makeinfo tar.texinfo
-@end group
-
-@group
-.PHONY: install
-install: all
- $(INSTALL) tar $(bindir)/$(binprefix)tar
- -test ! -f rmt || $(INSTALL) rmt /etc/rmt
- $(INSTALLDATA) $(srcdir)/tar.info* $(infodir)
-@end group
-
-@group
-$(OBJS): tar.h port.h testpad.h
-regex.o buffer.o tar.o: regex.h
-# getdate.y has 8 shift/reduce conflicts.
-@end group
-
-@group
-testpad.h: testpad
- ./testpad
-@end group
-
-@group
-testpad: testpad.o
- $(CC) -o $@@ testpad.o
-@end group
-
-@group
-TAGS: $(SRCS)
- etags $(SRCS)
-@end group
-
-@group
-.PHONY: clean
-clean:
- rm -f *.o tar rmt testpad testpad.h core
-@end group
-
-@group
-.PHONY: distclean
-distclean: clean
- rm -f TAGS Makefile config.status
-@end group
-
-@group
-.PHONY: realclean
-realclean: distclean
- rm -f tar.info*
-@end group
-
-@group
-.PHONY: shar
-shar: $(SRCS) $(AUX)
- shar $(SRCS) $(AUX) | compress \
- > tar-`sed -e '/version_string/!d' \
- -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
- -e q
- version.c`.shar.Z
-@end group
-
-@group
-.PHONY: dist
-dist: $(SRCS) $(AUX)
- echo tar-`sed \
- -e '/version_string/!d' \
- -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
- -e q
- version.c` > .fname
- -rm -rf `cat .fname`
- mkdir `cat .fname`
- ln $(SRCS) $(AUX) `cat .fname`
- tar chZf `cat .fname`.tar.Z `cat .fname`
- -rm -rf `cat .fname` .fname
-@end group
-
-@group
-tar.zoo: $(SRCS) $(AUX)
- -rm -rf tmp.dir
- -mkdir tmp.dir
- -rm tar.zoo
- for X in $(SRCS) $(AUX) ; do \
- echo $$X ; \
- sed 's/$$/^M/' $$X \
- > tmp.dir/$$X ; done
- cd tmp.dir ; zoo aM ../tar.zoo *
- -rm -rf tmp.dir
-@end group
-@end example
-
-@node GNU Free Documentation License, Concept Index, Complex Makefile, Top
-@appendixsec GNU Free Documentation License
-@cindex FDL, GNU Free Documentation License
-@include fdl.texi
-
-@node Concept Index, Name Index, GNU Free Documentation License, Top
-@unnumbered Index of Concepts
-
-@printindex cp
-
-@node Name Index, , Concept Index, Top
-@unnumbered Index of Functions, Variables, & Directives
-
-@printindex fn
-
-@bye