mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2024-12-26 14:00:56 +00:00
8734 lines
320 KiB
Text
8734 lines
320 KiB
Text
\input texinfo @c -*- Texinfo -*-
|
|
@c %**start of header
|
|
@setfilename make.info
|
|
@settitle GNU @code{make}
|
|
@setchapternewpage odd
|
|
@c %**end of header
|
|
|
|
@c FSF publishers: format makebook.texi instead of using this file directly.
|
|
|
|
@set RCSID $Id$
|
|
@set EDITION 0.45
|
|
@set VERSION 3.71 Beta
|
|
@set UPDATED 20 April 1994
|
|
@set UPDATE-MONTH April 1994
|
|
|
|
@c finalout
|
|
|
|
@c ISPELL CHECK: done, 10 June 1993 --roland
|
|
|
|
@c Combine the variable and function indices:
|
|
@syncodeindex vr fn
|
|
@c Combine the program and concept indices:
|
|
@syncodeindex pg cp
|
|
|
|
@ifinfo
|
|
This file documents the GNU 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 @code{make}, Version @value{VERSION}.
|
|
|
|
Copyright (C) 1988, '89, '90, '91, '92, '93, '94 Free Software Foundation, Inc.
|
|
|
|
Permission is granted to make and distribute verbatim copies of
|
|
this manual provided the copyright notice and this permission notice
|
|
are preserved on all copies.
|
|
|
|
@ignore
|
|
Permission is granted to process this file through TeX and print the
|
|
results, provided the printed document carries copying permission
|
|
notice identical to this one except for the removal of this paragraph
|
|
(this paragraph not being relevant to the printed manual).
|
|
|
|
@end ignore
|
|
Permission is granted to copy and distribute modified versions of this
|
|
manual under the conditions for verbatim copying, provided that the entire
|
|
resulting derived work is distributed under the terms of a permission
|
|
notice identical to this one.
|
|
|
|
Permission is granted to copy and distribute translations of this manual
|
|
into another language, under the above conditions for modified versions,
|
|
except that this permission notice may be stated in a translation approved
|
|
by the Free Software Foundation.
|
|
@end ifinfo
|
|
|
|
@iftex
|
|
@shorttitlepage GNU Make
|
|
@end iftex
|
|
@titlepage
|
|
@title GNU Make
|
|
@subtitle A Program for Directing Recompilation
|
|
@subtitle Edition @value{EDITION}, for @code{make} Version @value{VERSION}.
|
|
@subtitle @value{UPDATE-MONTH}
|
|
@author Richard M. Stallman and Roland McGrath
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
Copyright @copyright{} 1988, '89, '90, '91, '92, '93, '94 Free Software Foundation, Inc.
|
|
@sp 2
|
|
Published by the Free Software Foundation @*
|
|
675 Massachusetts Avenue, @*
|
|
Cambridge, MA 02139 USA @*
|
|
Printed copies are available for $20 each. @*
|
|
ISBN 1-882114-16-7 @*
|
|
|
|
Permission is granted to make and distribute verbatim copies of
|
|
this manual provided the copyright notice and this permission notice
|
|
are preserved on all copies.
|
|
|
|
Permission is granted to copy and distribute modified versions of this
|
|
manual under the conditions for verbatim copying, provided that the entire
|
|
resulting derived work is distributed under the terms of a permission
|
|
notice identical to this one.
|
|
|
|
Permission is granted to copy and distribute translations of this manual
|
|
into another language, under the above conditions for modified versions,
|
|
except that this permission notice may be stated in a translation approved
|
|
by the Free Software Foundation.
|
|
@sp 2
|
|
Cover art by Etienne Suvasa.
|
|
@end titlepage
|
|
@page
|
|
|
|
@ifinfo
|
|
@node Top, Overview, (dir), (dir)
|
|
@top Make
|
|
|
|
The GNU @code{make} utility automatically determines which pieces of a
|
|
large program need to be recompiled, and issues the commands to
|
|
recompile them.@refill
|
|
|
|
This is Edition @value{EDITION} of the @cite{GNU Make Manual},
|
|
last updated @value{UPDATED}
|
|
for @code{make} Version @value{VERSION}.@refill
|
|
|
|
This manual describes @code{make} and contains the following chapters:@refill
|
|
@end ifinfo
|
|
|
|
@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.
|
|
* Commands:: Commands 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.
|
|
* make Invocation: 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 makefiles in GNU programs.
|
|
* Quick Reference:: A quick reference for experienced users.
|
|
* Complex Makefile:: A real example of a straightforward,
|
|
but nontrivial, makefile.
|
|
* Concept Index:: Index of Concepts
|
|
* Name Index:: Index of Functions, Variables, & Directives
|
|
|
|
--- 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 Commands
|
|
* Combine By Dependency:: 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.
|
|
|
|
Writing Rules
|
|
|
|
* Rule Example:: An example explained.
|
|
* Rule Syntax:: General syntax explained.
|
|
* 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 commands
|
|
or dependencies 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 dependencies according to
|
|
the target name.
|
|
* Double-Colon:: How to use a special kind of rule to allow
|
|
several independent rules for one target.
|
|
* Automatic Dependencies:: How to automatically generate rules giving
|
|
dependencies from the 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 Dependencies
|
|
|
|
* General Search:: Specifying a search path that applies
|
|
to every dependency.
|
|
* Selective Search:: Specifying a search path
|
|
for a specified class of names.
|
|
* Commands/Search:: How to write shell commands that work together
|
|
with search paths.
|
|
* Implicit/Search:: How search paths affect implicit rules.
|
|
* Libraries/Search:: Directory search for link libraries.
|
|
|
|
Static Pattern Rules
|
|
|
|
* Static Usage:: The syntax of static pattern rules.
|
|
* Static versus Implicit:: When are they better than implicit rules?
|
|
|
|
Writing the Commands in Rules
|
|
|
|
* Echoing:: How to control when commands are echoed.
|
|
* Execution:: How commands are executed.
|
|
* Parallel:: How commands can be executed in parallel.
|
|
* Errors:: What happens after a command execution error.
|
|
* Interrupts:: What happens when a command is interrupted.
|
|
* Recursion:: Invoking @code{make} from makefiles.
|
|
* Sequences:: Defining canned sequences of commands.
|
|
* Empty Commands:: Defining useful, do-nothing commands.
|
|
|
|
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.
|
|
|
|
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.
|
|
* Filename Functions:: Functions for manipulating file names.
|
|
* Foreach Function:: Repeat some text with controlled variation.
|
|
* Origin Function:: Find where a variable got its value.
|
|
* Shell Function:: Substitute the output of a shell command.
|
|
|
|
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 commands
|
|
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 commands 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 defining commands for rules
|
|
which cannot find any.
|
|
* Suffix Rules:: The old-fashioned style of implicit rule.
|
|
* Search Algorithm:: 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:: How to use automatic variables in the
|
|
commands 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 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 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. 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
|
|
@ifinfo
|
|
@heading Preparing and Running Make
|
|
@end ifinfo
|
|
|
|
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 commands 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.
|
|
@ifinfo
|
|
The exception is the second chapter, @ref{Introduction, ,An
|
|
Introduction to Makefiles}, all of which is introductory.
|
|
@end ifinfo
|
|
@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. Also
|
|
say what you expected to occur; this will help us decide whether the
|
|
problem was really in the documentation.
|
|
|
|
Once you've got a precise problem, please send electronic mail either
|
|
through the Internet or via UUCP:
|
|
|
|
@example
|
|
@group
|
|
@r{Internet address:}
|
|
bug-gnu-utils@@prep.ai.mit.edu
|
|
|
|
@r{UUCP path:}
|
|
mit-eddie!prep.ai.mit.edu!bug-gnu-utils
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
Please 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. If possible, include the contents of the file @file{config.h}
|
|
that is generated by the configuration process.
|
|
|
|
Non-bug suggestions are always welcome as well. If you have questions
|
|
about things that are unclear in the documentation or are just obscure
|
|
features, send a message to the bug reporting address. We cannot
|
|
guarantee you'll get help with your problem, but many seasoned
|
|
@code{make} users read the mailing list and they will probably try to
|
|
help you out. The maintainers sometimes answer such questions as well,
|
|
when time permits.
|
|
|
|
@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 Commands
|
|
* Combine By Dependency:: Another Style of Makefile
|
|
* Cleanup:: Rules for Cleaning the Directory
|
|
@end menu
|
|
|
|
@node Rule Introduction, Simple Makefile, , 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 dependencies, introduction to
|
|
@cindex commands, introduction to
|
|
@example
|
|
@group
|
|
@var{target} @dots{} : @var{dependencies} @dots{}
|
|
@var{command}
|
|
@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{dependency} 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{command} is an action that @code{make} carries out.
|
|
A rule 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.
|
|
|
|
Usually a command is in a rule with dependencies and serves to create a
|
|
target file if any of the dependencies change. However, the rule that
|
|
specifies commands for the target need not have dependencies. For
|
|
example, the rule containing the delete command associated with the
|
|
target @samp{clean} does not have dependencies.
|
|
|
|
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 commands on the dependencies 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
|
|
dependencies are files such as @samp{main.c} and @samp{defs.h}.
|
|
In fact, each @samp{.o} file is both a target and a dependency.
|
|
Commands 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 dependencies change. In addition, any dependencies that are
|
|
themselves automatically generated should be updated first. In this
|
|
example, @file{edit} depends on each of the eight object files; the
|
|
object file @file{main.o} depends on the source file @file{main.c} and
|
|
on the header file @file{defs.h}.
|
|
|
|
A shell command follows each line that contains a target and
|
|
dependencies. These shell commands say how to update the target file.
|
|
A tab character must come at the beginning of every command line to
|
|
distinguish commands lines from other lines in the makefile. (Bear in
|
|
mind that @code{make} does not know anything about how the commands
|
|
work. It is up to you to supply commands that will update the target
|
|
file properly. All @code{make} does is execute the commands in the rule
|
|
you have specified when the target file needs to be updated.)
|
|
@cindex shell command
|
|
|
|
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 dependency 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 dependency, it
|
|
also does not have any dependencies, so the only purpose of the rule
|
|
is to run the specified commands. 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 Commands}, 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 rule (not counting rules
|
|
whose target names start with @samp{.}). This is called the
|
|
@dfn{default goal}. (@dfn{Goals} are the targets that @code{make}
|
|
strives ultimately to update. @xref{Goals, , Arguments to Specify the
|
|
Goals}.)
|
|
@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
|
|
dependencies, 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
|
|
dependencies 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
|
|
dependencies, the source file and header files. This makefile does not
|
|
specify anything to be done for them---the @samp{.c} and @samp{.h} files
|
|
are not the targets of any rules---so @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 Dependency, Variables Simplify, Introduction
|
|
@section Letting @code{make} Deduce the Commands
|
|
@cindex deducing commands (implicit rules)
|
|
@cindex implicit rule, introduction to
|
|
@cindex rule, implicit, introduction to
|
|
|
|
It is not necessary to spell out the commands for compiling the individual
|
|
C source files, because @code{make} can figure them out: it has an
|
|
@dfn{implicit rule} for updating a @samp{.o} file from a correspondingly
|
|
named @samp{.c} file using a @samp{cc -c} command. For example, it will
|
|
use the command @samp{cc -c main.c -o main.o} to compile @file{main.c} into
|
|
@file{main.o}. We can therefore omit the commands from the rules for the
|
|
object files. @xref{Implicit 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 dependencies. We can therefore omit
|
|
the @samp{.c} files from the dependencies, provided we omit the commands.
|
|
|
|
Here is the entire example, with both of these changes, and a variable
|
|
@code{objects} as suggested above:
|
|
|
|
@example
|
|
@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 Commands}.)
|
|
|
|
Because implicit rules are so convenient, they are important. You
|
|
will see them used frequently.@refill
|
|
|
|
@node Combine By Dependency, Cleanup, make Deduces, Introduction
|
|
@section Another Style of Makefile
|
|
@cindex combining rules by dependency
|
|
|
|
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 dependencies 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 dependency of all the object files;
|
|
@file{command.h} and @file{buffer.h} are dependencies of the specific
|
|
object files listed for them.
|
|
|
|
Whether this is better is a matter of taste: it is more compact, but some
|
|
people dislike it because they find it clearer to put all the information
|
|
about each target in one place.
|
|
|
|
@node Cleanup, , Combine By Dependency, 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
|
|
Commands}.)
|
|
|
|
@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 dependency 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.
|
|
@end menu
|
|
|
|
@node Makefile Contents, Makefile Names, , 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 targets. It lists the other files that the targets
|
|
@dfn{depend on}, and may also give commands to use to create or update
|
|
the targets. @xref{Rules, ,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 commands 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 a command 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.
|
|
Comments may appear on any of the lines in the makefile, except within a
|
|
@code{define} directive, and perhaps within commands (where the shell
|
|
decides what is a comment). A line containing just a comment (with
|
|
perhaps spaces before it) is effectively blank, and is ignored.@refill
|
|
@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.
|
|
@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
|
|
a tab is not allowed. (If the line begins with a tab, it will be
|
|
considered a command line.) Whitespace is required between
|
|
@code{include} and 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 dependencies from
|
|
source files automatically; the dependencies can be put in a file that
|
|
is included by the main makefile. This practice is generally cleaner
|
|
than that of somehow appending the dependencies to the end of the main
|
|
makefile as has been traditionally done with other versions of
|
|
@code{make}. @xref{Automatic Dependencies}.
|
|
@cindex dependencies, automatic generation
|
|
@cindex automatic generation of dependencies
|
|
@cindex generating dependencies automatically
|
|
|
|
@cindex @code{-I}
|
|
@cindex @code{--include-dir}
|
|
@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})
|
|
@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 is 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.
|
|
|
|
@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 the makefiles specify a double-colon rule to remake a file with
|
|
commands but no dependencies, that file will always be remade
|
|
(@pxref{Double-Colon}). In the case of makefiles, a makefile that has a
|
|
double-colon rule with commands but no dependencies 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 double-colon targets but have no
|
|
dependencies.@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 Commands}),
|
|
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 commands to update @file{foo} and its dependencies
|
|
without running them. The commands printed for @file{foo} will be those
|
|
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 commands needed to update it without actually
|
|
running them, and then print the commands needed to update @file{foo}
|
|
without running them. The commands for @file{foo} will be those
|
|
specified by the existing contents of @file{mfile}.
|
|
|
|
@node Overriding 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, if the two makefiles give different commands for the same
|
|
target, @code{make} will not let you just do this. But there is another way.
|
|
|
|
@cindex @code{.DEFAULT}, used to override
|
|
In the containing makefile (the one that wants to include the other),
|
|
you can use the @code{.DEFAULT} special target 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{Last Resort, , Defining Last-Resort Default Rules},
|
|
for more information on @code{.DEFAULT}.
|
|
|
|
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
|
|
|
|
.DEFAULT:
|
|
@@$(MAKE) -f Makefile $@@
|
|
@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 command
|
|
@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
|
|
commands from @code{.DEFAULT}: @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.@refill
|
|
|
|
@node Rules, Commands, Makefiles, Top
|
|
@chapter Writing Rules
|
|
@cindex writing rules
|
|
@cindex rule, how to write
|
|
@cindex target
|
|
@cindex dependency
|
|
|
|
A @dfn{rule} appears in the makefile and says when and how to remake
|
|
certain files, called the rule's @dfn{targets} (most often only one per rule).
|
|
It lists the other files that are the @dfn{dependencies} of the target, and
|
|
@dfn{commands} to use to create or update the target.
|
|
|
|
@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.
|
|
* 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 commands
|
|
or dependencies 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 dependencies according to
|
|
the target name.
|
|
* Double-Colon:: How to use a special kind of rule to allow
|
|
several independent rules for one target.
|
|
* Automatic Dependencies:: How to automatically generate rules giving
|
|
dependencies from the source files themselves.
|
|
@end menu
|
|
|
|
@ifinfo
|
|
@node Rule Example, Rule Syntax, , 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 dependencies are @file{foo.c} and
|
|
@file{defs.h}. It has one command, which is @samp{cc -c -g foo.c}.
|
|
The command line starts with a tab to identify it as a command.
|
|
|
|
This rule says two things:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
How to decide whether @file{foo.o} is out of date: it is out of date
|
|
if it does not exist, or if either @file{foo.c} or @file{defs.h} is
|
|
more recent than it.
|
|
|
|
@item
|
|
How to update the file @file{foo.o}: by running @code{cc} as stated.
|
|
The command does not explicitly mention @file{defs.h}, but we presume
|
|
that @file{foo.c} includes it, and that that is why @file{defs.h} was
|
|
added to the dependencies.
|
|
@end itemize
|
|
@end ifinfo
|
|
|
|
@node Rule Syntax, Wildcards, Rule Example, Rules
|
|
@section Rule Syntax
|
|
|
|
@cindex rule syntax
|
|
@cindex syntax of rules
|
|
In general, a rule looks like this:
|
|
|
|
@example
|
|
@var{targets} : @var{dependencies}
|
|
@var{command}
|
|
@dots{}
|
|
@end example
|
|
|
|
@noindent
|
|
or like this:
|
|
|
|
@example
|
|
@var{targets} : @var{dependencies} ; @var{command}
|
|
@var{command}
|
|
@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 commands
|
|
@cindex tab character (in commands)
|
|
The @var{command} lines start with a tab character. The first command may
|
|
appear on the line after the dependencies, with a tab character, or may
|
|
appear on the same line, with a semicolon. Either way, the effect is the
|
|
same. @xref{Commands, ,Writing the Commands in Rules}.
|
|
|
|
@cindex dollar sign (@code{$}), in rules
|
|
@cindex @code{$}, in rules
|
|
@cindex rule, and @code{$}
|
|
Because dollar signs are used to start variable references, if you really
|
|
want a dollar sign in a rule you must write two of them, @samp{$$}
|
|
(@pxref{Using Variables, ,How to Use Variables}).
|
|
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 dependencies
|
|
@cindex rule dependencies
|
|
The criterion for being out of date is specified in terms of the
|
|
@var{dependencies}, which consist of file names separated by spaces.
|
|
(Wildcards and archive members (@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 dependencies (by comparison of last-modification times). The
|
|
idea is that the contents of the target file are computed based on
|
|
information in the dependencies, so if any of the dependencies changes,
|
|
the contents of the existing target file are no longer necessarily
|
|
valid.
|
|
|
|
How to update is specified by @var{commands}. These are lines to be
|
|
executed by the shell (normally @samp{sh}), but with some extra features
|
|
(@pxref{Commands, ,Writing the Commands in Rules}).
|
|
|
|
@node Wildcards, Directory Search, Rule Syntax, 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}.@refill
|
|
|
|
Wildcard expansion happens automatically in targets, in dependencies,
|
|
and in commands (where the shell does the 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
|
|
@subsection Wildcard Examples
|
|
|
|
Wildcards can be used in the commands 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 dependencies of a rule. With the
|
|
following rule in the makefile, @samp{make print} will print all the
|
|
@samp{.c} files that have changed since the last time you printed them:
|
|
|
|
@example
|
|
print: *.c
|
|
lpr -p $?
|
|
touch print
|
|
@end example
|
|
|
|
@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, ,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,
|
|
dependency or command, 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 dependency 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.
|
|
@ifinfo
|
|
@xref{Wildcard Function, ,The Function @code{wildcard}}.
|
|
@end ifinfo
|
|
@iftex
|
|
These are described in the following section.
|
|
@end iftex
|
|
|
|
@node Wildcard Function, , Wildcard Pitfall, Wildcards
|
|
@subsection The Function @code{wildcard}
|
|
@findex wildcard
|
|
|
|
Wildcard expansion happens automatically in rules. But wildcard expansion
|
|
does not normally take place when a variable is set, or inside the
|
|
arguments of a function. If you want to do wildcard expansion in such
|
|
places, you need to use the @code{wildcard} function, like this:
|
|
|
|
@example
|
|
$(wildcard @var{pattern}@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{.o} suffix with @samp{.c} 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 Dependencies
|
|
@vindex VPATH
|
|
@findex vpath
|
|
@cindex vpath
|
|
@cindex search path for dependencies (@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 dependency. 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 dependency.
|
|
* Selective Search:: Specifying a search path
|
|
for a specified class of names.
|
|
* Commands/Search:: How to write shell commands that work together
|
|
with search paths.
|
|
* Implicit/Search:: How search paths affect implicit rules.
|
|
* Libraries/Search:: Directory search for link libraries.
|
|
@end menu
|
|
|
|
@node General Search, Selective Search, , Directory Search
|
|
@subsection @code{VPATH}: Search Path for All Dependencies
|
|
@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 dependency files that are not in the
|
|
current directory; however, @code{VPATH} specifies a search list that
|
|
@code{make} applies for all files, including files which are targets of
|
|
rules.
|
|
|
|
Thus, if a file that is listed as a target or dependency 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 becomes the dependency. Rules may then specify the
|
|
names of source files in the dependencies as if they all existed in the
|
|
current directory. @xref{Commands/Search, ,Writing Shell Commands with
|
|
Directory Search}.
|
|
|
|
In the @code{VPATH} variable, directory names are separated by colons.
|
|
The order in which directories are listed is the order followed by
|
|
@code{make} in its search.
|
|
|
|
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, Commands/Search, 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 colon-separated list of
|
|
directories to be searched, just like the search path used in the
|
|
@code{VPATH} variable.
|
|
|
|
@item vpath @var{pattern}
|
|
Clear out the search path associated with @var{pattern}.
|
|
|
|
@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 dependency 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
|
|
dependency 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 dependency fails to exist in the current directory, if the
|
|
@var{pattern} in a @code{vpath} directive matches the name of the
|
|
dependency file, then the @var{directories} in that directive are searched
|
|
just like (and before) the directories in the @code{VPATH} variable.
|
|
|
|
For example,
|
|
|
|
@example
|
|
vpath %.h ../headers
|
|
@end example
|
|
|
|
@noindent
|
|
tells @code{make} to look for any dependency 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 dependency 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 Commands/Search, Implicit/Search, Selective Search, Directory Search
|
|
@subsection Writing Shell Commands with Directory Search
|
|
@cindex shell command, and directory search
|
|
@cindex directory search (@code{VPATH}), and shell commands
|
|
|
|
When a dependency is found in another directory through directory search,
|
|
this cannot change the commands of the rule; they will execute as written.
|
|
Therefore, you must write the commands with care so that they will look for
|
|
the dependency in the directory where @code{make} finds it.
|
|
|
|
This is done with the @dfn{automatic variables} such as @samp{$^}
|
|
(@pxref{Automatic, ,Automatic Variables}).
|
|
For instance, the value of @samp{$^} is a
|
|
list of all the dependencies of the rule, including the names of
|
|
the directories in which they were found, and the value of
|
|
@samp{$@@} is the target. Thus:@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 dependencies include header files as well, which you do not
|
|
want to mention in the commands. The automatic variable @samp{$<} is
|
|
just the first dependency:
|
|
|
|
@example
|
|
VPATH = src:../headers
|
|
foo.o : foo.c defs.h hack.h
|
|
cc -c $(CFLAGS) $< -o $@@
|
|
@end example
|
|
|
|
@node Implicit/Search, Libraries/Search, Commands/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 dependencies (@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 commands 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 dependencies (@code{VPATH}), and link libraries
|
|
@cindex @code{-l} (library search)
|
|
|
|
Directory search applies in a special way to libraries used with the
|
|
linker. This special feature comes into play when you write a dependency
|
|
whose name is of the form @samp{-l@var{name}}. (You can tell something
|
|
strange is going on here because the dependency is normally the name of a
|
|
file, and the @emph{file name} of the library looks like
|
|
@file{lib@var{name}.a}, not like @samp{-l@var{name}}.)@refill
|
|
|
|
When a dependency's name has the form @samp{-l@var{name}}, @code{make}
|
|
handles it specially by searching for the file @file{lib@var{name}.a} 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}).
|
|
|
|
For example,
|
|
|
|
@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
|
|
|
|
@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. It is just a
|
|
name for some commands 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 commands will not create the target file, the
|
|
commands will be executed every time the target comes up for remaking.
|
|
Here is an example:
|
|
|
|
@example
|
|
@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 dependencies, the
|
|
file @file{clean} would inevitably be considered up to date, and its
|
|
commands would not be executed. To avoid this problem, you can explicitly
|
|
declare the target to be phony, using the special target @code{.PHONY}
|
|
(@pxref{Special Targets, ,Special Built-in Target Names}) as follows:
|
|
|
|
@example
|
|
.PHONY : clean
|
|
@end example
|
|
|
|
@noindent
|
|
Once this is done, @samp{make clean} will run the commands 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
|
|
|
|
A phony target should not be a dependency of a real target file; if it
|
|
is, its commands are run every time @code{make} goes to update that
|
|
file. As long as a phony target is never a dependency of a real
|
|
target, the phony target commands will be executed only when the phony
|
|
target is a specified goal (@pxref{Goals, ,Arguments to Specify the
|
|
Goals}).
|
|
|
|
Phony targets can have dependencies. When one directory contains multiple
|
|
programs, it is most convenient to describe all of the programs in one
|
|
makefile @file{./Makefile}. Since the target remade by default will be the
|
|
first one in the makefile, it is common to make this a phony target named
|
|
@samp{all} and give it, as dependencies, all the individual programs. For
|
|
example:
|
|
|
|
@example
|
|
all : prog1 prog2 prog3
|
|
.PHONY : all
|
|
|
|
prog1 : prog1.o utils.o
|
|
cc -o prog1 prog1.o utils.o
|
|
|
|
prog2 : prog2.o
|
|
cc -o prog2 prog2.o
|
|
|
|
prog3 : prog3.o sort.o utils.o
|
|
cc -o prog3 prog3.o sort.o utils.o
|
|
@end example
|
|
|
|
@noindent
|
|
Now you can say just @samp{make} to remake all three programs, or specify
|
|
as arguments the ones to remake (as in @samp{make prog1 prog3}).
|
|
|
|
When one phony target is a dependency of another, it serves as a subroutine
|
|
of the other. For example, here @samp{make cleanall} will delete the
|
|
object files, the difference files, and the file @file{program}:
|
|
|
|
@example
|
|
.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 Commands or Dependencies
|
|
@cindex force targets
|
|
@cindex targets, force
|
|
@cindex @code{FORCE}
|
|
@cindex rule, no commands or dependencies
|
|
|
|
If a rule has no dependencies or commands, 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 commands 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 commands.
|
|
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
|
|
commands for an action that you request explicitly from time to time.
|
|
Unlike a phony target, this target file can really exist; but the file's
|
|
contents do not matter, and usually are empty.
|
|
|
|
The purpose of the empty target file is to record, with its
|
|
last-modification time, when the rule's commands were last executed. It
|
|
does so because one of the commands is a @code{touch} command to update the
|
|
target file.
|
|
|
|
The empty target file must have some dependencies. When you ask to remake
|
|
the empty target, the commands are executed if any dependency is more
|
|
recent than the target; in other words, if a dependency has changed since
|
|
the last time you remade the target. Here is an example:
|
|
|
|
@example
|
|
print: foo.c bar.c
|
|
lpr -p $?
|
|
touch print
|
|
@end example
|
|
@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, ,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 dependencies of the special target @code{.PHONY} are considered to
|
|
be phony targets. When it is time to consider such a target,
|
|
@code{make} will run its commands unconditionally, regardless of
|
|
whether a file with that name exists or what its last-modification
|
|
time is. @xref{Phony Targets, ,Phony Targets}.
|
|
|
|
@findex .SUFFIXES
|
|
@item .SUFFIXES
|
|
|
|
The dependencies 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 commands specified for @code{.DEFAULT} are used for any target for
|
|
which no rules are found (either explicit rules or implicit rules).
|
|
@xref{Last Resort}. If @code{.DEFAULT} commands are specified, every
|
|
file mentioned as a dependency, but not as a target in a rule, will have
|
|
these commands executed on its behalf. @xref{Search Algorithm,
|
|
,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 commands, 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}.
|
|
|
|
You can also list the target pattern of an implicit rule (such as
|
|
@samp{%.o}) as a dependency file of the special target @code{.PRECIOUS}
|
|
to preserve intermediate files created by rules whose target patterns
|
|
match that file's name.
|
|
|
|
@findex .IGNORE
|
|
@item .IGNORE
|
|
|
|
Simply by being mentioned as a target, @code{.IGNORE} says to ignore
|
|
errors in execution of commands. The dependencies and commands for
|
|
@code{.IGNORE} are not meaningful.
|
|
|
|
@samp{.IGNORE} exists for historical compatibility. Since
|
|
@code{.IGNORE} affects every command in the makefile, it is not very
|
|
useful; we recommend you use the more selective ways to ignore errors
|
|
in specific commands. @xref{Errors, ,Errors in Commands}.
|
|
|
|
@findex .SILENT
|
|
@item .SILENT
|
|
|
|
Simply by being mentioned as a target, @code{.SILENT} says not to
|
|
print commands before executing them. The dependencies and commands
|
|
for @code{.SILENT} are not meaningful.
|
|
|
|
@samp{.SILENT} exists for historical compatibility. We recommend you
|
|
use the more selective ways to silence specific commands.
|
|
@xref{Echoing, ,Command Echoing}. If you want to silence all commands
|
|
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}}.
|
|
@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 commands apply to
|
|
all the targets, but their effects may vary because you can substitute the
|
|
actual target name into the command using @samp{$@@}. The rule contributes
|
|
the same dependencies to all the targets also.
|
|
|
|
This is useful in two cases.
|
|
|
|
@itemize @bullet
|
|
@item
|
|
You want just dependencies, no commands. For example:
|
|
|
|
@example
|
|
kbd.o command.o files.o: command.h
|
|
@end example
|
|
|
|
@noindent
|
|
gives an additional dependency to each of the three object files
|
|
mentioned.
|
|
|
|
@item
|
|
Similar commands work for all the targets. The commands do not need
|
|
to be absolutely identical, since the automatic variable @samp{$@@}
|
|
can be used to substitute the particular target to be remade into the
|
|
commands (@pxref{Automatic, ,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 dependencies according to the target,
|
|
much as the variable @samp{$@@} allows you to vary the commands.
|
|
You cannot do this with multiple targets in an ordinary rule, but you can
|
|
do it with a @dfn{static pattern rule}.
|
|
@xref{Static Pattern, ,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 dependencies
|
|
mentioned in all the rules are merged into one list of dependencies for
|
|
the target. If the target is older than any dependency from any rule,
|
|
the commands are executed.
|
|
|
|
There can only be one set of commands to be executed for a file.
|
|
If more than one rule gives commands for the same file,
|
|
@code{make} uses the last set 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}.)
|
|
There is no reason to
|
|
write your makefiles this way; that is why @code{make} gives you
|
|
an error message.@refill
|
|
|
|
An extra rule with just dependencies can be used to give a few extra
|
|
dependencies to many files at once. For example, one usually has a
|
|
variable named @code{objects} containing a list of all the compiler output
|
|
files in the system being made. An easy way to say that all of them must
|
|
be recompiled if @file{config.h} changes is to write 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 dependency intermittently.
|
|
|
|
Another wrinkle is that the additional dependencies could be specified with
|
|
a variable that you set with a command 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 dependency of each object file, but plain @samp{make}
|
|
will not.
|
|
|
|
If none of the explicit rules for a target has commands, then @code{make}
|
|
searches for an applicable implicit rule to find some commands
|
|
@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 dependencies
|
|
@cindex dependencies, varying (static pattern)
|
|
|
|
@dfn{Static pattern rules} are rules which specify multiple targets and
|
|
construct the dependency names for each target based on the target name.
|
|
They are more general than ordinary rules with multiple targets because the
|
|
targets do not have to have identical dependencies. Their dependencies 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
|
|
@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{dep-patterns} @dots{}
|
|
@var{commands}
|
|
@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{dep-patterns} say how to compute the
|
|
dependencies of each target. Each target is matched against the
|
|
@var{target-pattern} to extract a part of the target name, called the
|
|
@dfn{stem}. This stem is substituted into each of the @var{dep-patterns}
|
|
to make the dependency names (one from each @var{dep-pattern}).
|
|
|
|
Each pattern normally contains the character @samp{%} just once. When the
|
|
@var{target-pattern} matches a target, the @samp{%} can match any part of
|
|
the target name; this part is called the @dfn{stem}. The rest of the
|
|
pattern must match exactly. For example, the target @file{foo.o} matches
|
|
the pattern @samp{%.o}, with @samp{foo} as the stem. The targets
|
|
@file{foo.c} and @file{foo.out} do not match that pattern.@refill
|
|
|
|
@cindex dependency pattern, static (not implicit)
|
|
The dependency names for each target are made by substituting the stem
|
|
for the @samp{%} in each dependency pattern. For example, if one
|
|
dependency pattern is @file{%.c}, then substitution of the stem
|
|
@samp{foo} gives the dependency name @file{foo.c}. It is legitimate
|
|
to write a dependency pattern that does not contain @samp{%}; then this
|
|
dependency 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
|
|
|
|
$(objects): %.o: %.c
|
|
$(CC) -c $(CFLAGS) $< -o $@@
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
Here @samp{$<} is the automatic variable that holds the name of the
|
|
dependency and @samp{$@@} is the automatic variable that holds the name
|
|
of the target; see @ref{Automatic, , 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 dependencies. The difference is in how @code{make} decides
|
|
@emph{when} the rule applies.
|
|
|
|
An implicit rule @emph{can} apply to any target that matches its pattern,
|
|
but it @emph{does} apply only when the target has no commands otherwise
|
|
specified, and only when the dependencies can be found. If more than one
|
|
implicit rule appears applicable, only one applies; the choice depends on
|
|
the order of rules.
|
|
|
|
By contrast, a static pattern rule applies to the precise list of targets
|
|
that you specify in the rule. It cannot apply to any other target and it
|
|
invariably does apply to each of the targets specified. If two conflicting
|
|
rules apply, and both have commands, that's an error.
|
|
|
|
The static pattern rule can be better than an implicit rule for these
|
|
reasons:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
You may wish to override the usual implicit rule for a few
|
|
files whose names cannot be categorized syntactically but
|
|
can be given in an explicit list.
|
|
|
|
@item
|
|
If you cannot be sure of the precise contents of the directories
|
|
you are using, you may not be sure which other irrelevant files
|
|
might lead @code{make} to use the wrong implicit rule. The choice
|
|
might depend on the order in which the implicit rule search is done.
|
|
With static pattern rules, there is no uncertainty: each rule applies
|
|
to precisely the targets specified.
|
|
@end itemize
|
|
|
|
@node Double-Colon, Automatic Dependencies, 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 commands are
|
|
executed if the target is older than any dependencies of that rule. This
|
|
can result in executing none, any, or all of the double-colon rules.
|
|
|
|
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 commands 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 dependency files caused the update, and such
|
|
cases are rare.
|
|
|
|
Each double-colon rule should specify commands; if it does not, an
|
|
implicit rule will be used if one applies.
|
|
@xref{Implicit Rules, ,Using Implicit Rules}.
|
|
|
|
@node Automatic Dependencies, , Double-Colon, Rules
|
|
@section Generating Dependencies Automatically
|
|
@cindex dependencies, automatic generation
|
|
@cindex automatic generation of dependencies
|
|
@cindex generating dependencies 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 dependency 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 dependencies on demand with a command like
|
|
@samp{make depend}. That command would create a file @file{depend}
|
|
containing all the automatically-generated dependencies; 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 dependencies, because it always regenerates any makefile
|
|
that is out of date. @xref{Remaking Makefiles}.
|
|
|
|
The practice we recommend for automatic dependency 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 dependencies.
|
|
|
|
Here is the pattern rule to generate a file of dependencies (i.e., a makefile)
|
|
called @file{@var{name}.d} from a C source file called @file{@var{name}.c}:
|
|
|
|
@example
|
|
@group
|
|
%.d: %.c
|
|
$(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< | sed '\''s/$*.o/& $@@/g'\'' > $@@'
|
|
@end group
|
|
@end example
|
|
|
|
@noindent
|
|
@xref{Pattern Rules}, for information on defining pattern rules. The
|
|
@samp{-e} flag to the shell makes it exit immediately if the
|
|
@code{$(CC)} command fails (exits with a nonzero status). Normally the
|
|
shell exits with the status of the last command in the pipeline
|
|
(@code{sed} in this case), so @code{make} would not notice a nonzero
|
|
status from the compiler.
|
|
@cindex @code{-e} (shell flag)
|
|
|
|
@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 dependencies 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 dependency
|
|
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}.
|
|
|
|
@node Commands, Using Variables, Rules, Top
|
|
@chapter Writing the Commands in Rules
|
|
@cindex commands, how to write
|
|
@cindex rule commands
|
|
@cindex writing rule commands
|
|
|
|
The commands of a rule consist of shell command lines to be executed one by
|
|
one. Each command line must start with a tab, except that the first
|
|
command line may be attached to the target-and-dependencies line with a
|
|
semicolon in between. Blank lines and lines of just comments may appear
|
|
among the command lines; they are ignored.
|
|
|
|
Users use many different shell programs, but commands in makefiles are
|
|
always interpreted by @file{/bin/sh} unless the makefile specifies
|
|
otherwise. @xref{Execution, ,Command Execution}.
|
|
|
|
@cindex comments, in commands
|
|
@cindex commands, comments in
|
|
@cindex @code{#} (comments), in commands
|
|
The shell that is in use determines whether comments can be written on
|
|
command lines, and what syntax they use. When the shell is
|
|
@file{/bin/sh}, a @samp{#} starts a comment that extends to the end of
|
|
the line. The @samp{#} does not have to be at the beginning of a line.
|
|
Text on a line before a @samp{#} is not part of the comment.
|
|
|
|
@menu
|
|
* Echoing:: How to control when commands are echoed.
|
|
* Execution:: How commands are executed.
|
|
* Parallel:: How commands can be executed in parallel.
|
|
* Errors:: What happens after a command execution error.
|
|
* Interrupts:: What happens when a command is interrupted.
|
|
* Recursion:: Invoking @code{make} from makefiles.
|
|
* Sequences:: Defining canned sequences of commands.
|
|
* Empty Commands:: Defining useful, do-nothing commands.
|
|
@end menu
|
|
|
|
@node Echoing, Execution, , Commands
|
|
@section Command Echoing
|
|
@cindex echoing of commands
|
|
@cindex silent operation
|
|
@cindex @code{@@} (in commands)
|
|
@cindex commands, echoing
|
|
@cindex printing of commands
|
|
|
|
Normally @code{make} prints each command line before it is executed.
|
|
We call this @dfn{echoing} because it gives the appearance that you
|
|
are typing the commands yourself.
|
|
|
|
When a line starts with @samp{@@}, the echoing of that line is suppressed.
|
|
The @samp{@@} is discarded before the command is passed to the shell.
|
|
Typically you would use this for a command whose only effect is to print
|
|
something, such as an @code{echo} command 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},
|
|
echoing is all that happens, no execution. @xref{Options Summary,
|
|
,Summary of Options}. In this case and only this case, even the
|
|
commands starting with @samp{@@} are printed. This flag is useful for
|
|
finding out which commands @code{make} thinks are necessary without
|
|
actually doing them.
|
|
|
|
@cindex @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 commands
|
|
started with @samp{@@}. A rule in the makefile for the special target
|
|
@code{.SILENT} 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, Commands
|
|
@section Command Execution
|
|
@cindex commands, execution
|
|
@cindex execution, of commands
|
|
@cindex shell command, execution
|
|
@vindex SHELL @r{(command execution)}
|
|
|
|
When it is time to execute commands to update a target, they are executed
|
|
by making a new subshell for each line. (In practice, @code{make} may
|
|
take shortcuts that do not affect the results.)
|
|
|
|
@cindex @code{cd} (shell command)
|
|
@strong{Please note:} this implies that shell commands such as
|
|
@code{cd} that set variables local to each process will not affect the
|
|
following command lines. If you want to use @code{cd} to affect the
|
|
next command, put the two on a single line with a semicolon between
|
|
them. Then @code{make} will consider them a single command and pass
|
|
them, together, to a shell which will execute them in sequence. For
|
|
example:
|
|
|
|
@example
|
|
foo : bar/lose
|
|
cd bar; gobble lose > ../foo
|
|
@end example
|
|
|
|
@cindex commands, backslash (@code{\}) in
|
|
@cindex commands, quoting newlines in
|
|
@cindex backslash (@code{\}), in commands
|
|
@cindex @code{\} (backslash), in commands
|
|
@cindex quoting newline, in commands
|
|
@cindex newline, quoting, in commands
|
|
If you would like to split a single shell command into multiple lines of
|
|
text, you must use a backslash at the end of all but the last subline.
|
|
Such a sequence of lines is combined into a single line, by deleting the
|
|
backslash-newline sequences, before passing it to the shell. Thus, the
|
|
following is equivalent to the preceding example:
|
|
|
|
@example
|
|
@group
|
|
foo : bar/lose
|
|
cd bar; \
|
|
gobble lose > ../foo
|
|
@end group
|
|
@end example
|
|
|
|
@vindex SHELL
|
|
The program used as the shell is taken from the variable @code{SHELL}.
|
|
By default, the program @file{/bin/sh} is used.
|
|
|
|
@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}.
|
|
|
|
@node Parallel, Errors, Execution, Commands
|
|
@section Parallel Execution
|
|
@cindex commands, 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 commands at once.
|
|
Normally, @code{make} will execute only one command 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 commands
|
|
simultaneously.@refill
|
|
|
|
If the @samp{-j} option is followed by an integer, this is the number of
|
|
commands 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 commands simultaneously is
|
|
that output from all of the commands comes when the commands send it, so
|
|
messages from different commands may be interspersed.
|
|
|
|
Another problem is that two processes cannot both take input from the
|
|
same device; so to make sure that only one command tries to take input
|
|
from the terminal at once, @code{make} will invalidate the standard
|
|
input streams of all but one running command. 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 command 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 command run will always get it first, and
|
|
the first command 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 command 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 commands.
|
|
|
|
If a command fails (is killed by a signal or exits with a nonzero
|
|
status), and errors are not ignored for that command
|
|
(@pxref{Errors, ,Errors in Commands}),
|
|
the remaining command lines to remake the same target will not be run.
|
|
If a command 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, Commands
|
|
@section Errors in Commands
|
|
@cindex errors (in commands)
|
|
@cindex commands, errors in
|
|
@cindex exit status (errors)
|
|
|
|
After each shell command returns, @code{make} looks at its exit status.
|
|
If the command completed successfully, the next command line is executed
|
|
in a new shell; after the last command 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 command 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 commands)
|
|
To ignore errors in a command line, write a @samp{-} at the beginning of
|
|
the line's text (after the initial tab). The @samp{-} is discarded before
|
|
the command is passed to the shell for execution.
|
|
|
|
For example,
|
|
|
|
@example
|
|
@group
|
|
clean:
|
|
-rm -f *.o
|
|
@end group
|
|
@end example
|
|
@cindex @code{rm} (shell command)
|
|
|
|
@noindent
|
|
This causes @code{rm} to continue even if it 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 commands of all rules. A rule in the makefile for the special target
|
|
@code{.IGNORE} has the same effect. These ways of ignoring errors are
|
|
obsolete because @samp{-} is more 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 command 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
|
|
commands 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 dependencies of the pending targets,
|
|
remaking them if necessary, before it gives up and returns nonzero status.
|
|
For example, after an error in compiling one object file, @samp{make -k}
|
|
will continue compiling other object files even though it already knows
|
|
that linking them will be impossible. @xref{Options 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})
|
|
|
|
@node Interrupts, Recursion, Errors, Commands
|
|
@section Interrupting or Killing @code{make}
|
|
@cindex interrupt
|
|
@cindex signal
|
|
@cindex deletion of target files
|
|
@cindex target, deleting on interrupt
|
|
@cindex killing (interruption)
|
|
|
|
If @code{make} gets a fatal signal while a command is executing, it may
|
|
delete the target file that the command was supposed to update. This is
|
|
done if the target file's 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 dependencies of
|
|
@code{.PRECIOUS}, and thereby decides whether the target should be deleted
|
|
if a signal happens. Some reasons why you might do this are that the
|
|
target is updated in some atomic fashion, or exists only to record a
|
|
modification-time (its contents do not matter), or must exist at all
|
|
times to prevent other sorts of trouble.
|
|
|
|
@node Recursion, Sequences, Interrupts, Commands
|
|
@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}.
|
|
|
|
@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
|
|
@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 command executed
|
|
is @samp{cd subdir; /bin/make}. If you use a special version of
|
|
@code{make} to run the top-level makefile, the same special version will be
|
|
executed for recursive invocations.
|
|
@cindex @code{cd} (shell command)
|
|
|
|
Also, any arguments that define variable values are added to @code{MAKE},
|
|
so the sub-@code{make} gets them too. Thus, if you do @samp{make
|
|
CFLAGS=-O}, so that all C compilations will be optimized, the
|
|
sub-@code{make} is run with @samp{cd subdir; /bin/make CFLAGS=-O}.@refill
|
|
|
|
@vindex MAKE_COMMAND
|
|
@vindex MAKEOVERRIDES
|
|
The @code{MAKE} variable actually just refers to two other variables
|
|
which contain these special values. In fact, @code{MAKE} is always
|
|
defined as @samp{$(MAKE_COMMAND) $(MAKEOVERRIDES)}. The variable
|
|
@code{MAKE_COMMAND} is the file name with which @code{make} was invoked
|
|
(such as @file{/bin/make}, above). The variable @code{MAKEOVERRIDES}
|
|
contains definitions for the variables defined on the command line; in
|
|
the above example, its value is @samp{CFLAGS=-O}. If you @emph{do not}
|
|
want these variable definitions done in all recursive @code{make}
|
|
invocations, you can redefine the @code{MAKEOVERRIDES} variable to
|
|
remove them. You do this in any of the normal ways for defining
|
|
variables: in a makefile (@pxref{Setting, ,Setting Variables}); on the command
|
|
line with an argument like @samp{MAKEOVERRIDES=}
|
|
(@pxref{Overriding, ,Overriding Variables}); or with an environment variable
|
|
(@pxref{Environment, ,Variables from the Environment}).
|
|
|
|
As a special feature, using the variable @code{MAKE} in the commands 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 command line. @xref{Instead of
|
|
Execution, ,Instead of Executing the Commands}.@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 commands; 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 command, and @samp{-t} says not to execute
|
|
commands.@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 command
|
|
line of a rule contains the variable @code{MAKE}, the flags @samp{-t},
|
|
@samp{-n} and @samp{-q} do not apply to that line. Command lines
|
|
containing @code{MAKE} are executed normally despite the presence of a
|
|
flag that causes most commands 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
|
|
commands, 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 sub-@code{make}'s 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 command. 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.
|
|
|
|
The special variables @code{SHELL} and @code{MAKEFLAGS} are always
|
|
exported (unless you unexport them).
|
|
@code{MAKEFILES} is exported if you set it to anything.
|
|
|
|
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
|
|
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 commands 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 command.@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 @code{-C}, and recursion
|
|
@cindex @code{-f}, and recursion
|
|
@cindex @code{-I}, and recursion
|
|
@cindex @code{-o}, and recursion
|
|
@cindex @code{-W}, and recursion
|
|
@cindex @code{--directory}, and recursion
|
|
@cindex @code{--file}, and recursion
|
|
@cindex @code{--include-dir}, 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{-I}
|
|
@cindex recursion, and @code{-o}
|
|
@cindex recursion, and @code{-W}
|
|
The options @samp{-C}, @samp{-f}, @samp{-I}, @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{-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
|
|
MAKEFLAGS=
|
|
subsystem:
|
|
cd subdir; $(MAKE)
|
|
@end example
|
|
|
|
or like this:
|
|
|
|
@example
|
|
subsystem:
|
|
cd subdir; $(MAKE) MAKEFLAGS=
|
|
@end example
|
|
|
|
@vindex MFLAGS
|
|
A similar variable @code{MFLAGS} exists also, for historical compatibility.
|
|
It has the same value as @code{MAKEFLAGS} except that 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 Commands, Recursion, Commands
|
|
@section Defining Canned Command Sequences
|
|
@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 rules for those targets. The canned
|
|
sequence is actually a variable, so the name must not conflict with other
|
|
variable names.
|
|
|
|
Here is an example of defining a canned sequence of commands:
|
|
|
|
@example
|
|
define run-yacc
|
|
yacc $(firstword $^)
|
|
mv y.tab.c $@@
|
|
endef
|
|
@end example
|
|
@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 dependency of
|
|
whichever rule uses the canned sequence. The output file from Yacc is
|
|
always named @file{y.tab.c}. The second command moves the output to the
|
|
rule's target file name.
|
|
|
|
To use the canned sequence, substitute the variable into the commands of a
|
|
rule. You can substitute it like any other variable
|
|
(@pxref{Reference, ,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 command 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{Commands, ,Writing the Commands 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 command lines.
|
|
|
|
On the other hand, prefix characters on the command 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} commands.
|
|
(@xref{Echoing, ,Command Echoing}, for a full explanation of @samp{@@}.)
|
|
|
|
@node Empty Commands, , Sequences, Commands
|
|
@section Using Empty Commands
|
|
@cindex empty commands
|
|
@cindex commands, empty
|
|
|
|
It is sometimes useful to define commands which do nothing. This is done
|
|
simply by giving a command that consists of nothing but whitespace. For
|
|
example:
|
|
|
|
@example
|
|
target: ;
|
|
@end example
|
|
|
|
@noindent
|
|
defines an empty command string for @file{target}. You could also use a
|
|
line beginning with a tab character to define an empty command string,
|
|
but this would be confusing because such a line looks empty.
|
|
|
|
@findex .DEFAULT@r{, and empty commands}
|
|
You may be wondering why you would want to define a command string that
|
|
does nothing. The only reason this is useful is to prevent a target
|
|
from getting implicit commands (from implicit rules or the
|
|
@code{.DEFAULT} special target; @pxref{Implicit Rules} and
|
|
@pxref{Last Resort, ,Defining Last-Resort Default Rules}).@refill
|
|
|
|
You may be inclined to define empty command strings for targets that are
|
|
not actual files, but only exist so that their dependencies can be
|
|
remade. However, this is not the best way to do that, because the
|
|
dependencies 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, Commands, Top
|
|
@chapter How to Use Variables
|
|
@cindex variable
|
|
@cindex value
|
|
@cindex recursive variable expansion
|
|
@cindex simple variable expansion
|
|
|
|
A @dfn{variable} is a name defined in a makefile to represent a string
|
|
of text, called the variable's @dfn{value}. These values are
|
|
substituted by explicit request into targets, dependencies, commands,
|
|
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 the shell commands in rules, 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.
|
|
* Automatic:: Some special variables have predefined
|
|
meanings for use with implicit rules.
|
|
@end menu
|
|
|
|
@node Reference, Flavors, , 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 command.
|
|
|
|
Variable references can be used in any context: targets, dependencies,
|
|
commands, 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, ,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 command,
|
|
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@})
|
|
cur-dir := $(shell pwd)
|
|
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' command then looks like this:
|
|
|
|
@example
|
|
@group
|
|
$@{subdirs@}:
|
|
$@{MAKE@} cur-dir=$@{cur-dir@}/$@@ -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!)
|
|
|
|
@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
|
|
@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, ,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 :=
|
|
|
|
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, ,Automatic Variables}).
|
|
|
|
@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
|
|
(@pxref{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
|
|
@ifinfo
|
|
@xref{Defining, ,Defining Variables Verbatim}.
|
|
@end ifinfo
|
|
|
|
@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
|
|
canned sequences of commands
|
|
(@pxref{Sequences, ,Defining Canned Command Sequences}).
|
|
|
|
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.
|
|
|
|
@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
|
|
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, ,Command 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, , 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. But an explicit assignment in the makefile, or with a command
|
|
argument, overrides the environment. (If the @samp{-e} flag is specified,
|
|
then values from the environment override assignments in the makefile.
|
|
@xref{Options 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. (But
|
|
this is not totally reliable; some makefiles set @code{CFLAGS} explicitly
|
|
and therefore are not affected by the value in the environment.)
|
|
|
|
When @code{make} is invoked recursively, variables defined in the
|
|
outer invocation can be passed to inner invocations through the
|
|
environment (@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.
|
|
|
|
Such problems would be especially likely with the variable @code{SHELL},
|
|
which is normally present in the environment to specify the user's choice
|
|
of interactive shell. It would be very undesirable for this choice to
|
|
affect @code{make}. So @code{make} ignores the environment value of
|
|
@code{SHELL}.@refill
|
|
|
|
@node Conditionals, Functions, Using Variables, Top
|
|
@chapter Conditional Parts of Makefiles
|
|
|
|
@cindex conditionals
|
|
A @dfn{conditional} causes part of a makefile to be obeyed or ignored
|
|
depending on the values of variables. Conditionals can compare the
|
|
value of one variable 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 shell
|
|
commands 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
|
|
@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
|
|
command lines will be used as the command for a 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
|
|
|
|
@noindent
|
|
If the condition is true, @var{text-if-true} is used; otherwise,
|
|
@var{text-if-false} is used instead. The @var{text-if-false} can be any
|
|
number of lines of text.
|
|
|
|
The syntax of the @var{conditional-directive} is the same whether the
|
|
conditional is simple or complex. There are four different directives that
|
|
test different conditions. Here is a table of them:
|
|
|
|
@table @code
|
|
@item ifeq (@var{arg1}, @var{arg2})
|
|
@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}
|
|
If the variable @var{variable-name} has a non-empty value, the
|
|
@var{text-if-true} is effective; otherwise, the @var{text-if-false},
|
|
if any, is effective. Variables that have never been defined have an
|
|
empty value.
|
|
|
|
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.
|
|
@end table
|
|
|
|
Extra spaces are allowed and ignored at the beginning of the conditional
|
|
directive line, but a tab is not allowed. (If the line begins with a tab,
|
|
it will be considered a command for a rule.) Aside from this, extra spaces
|
|
or tabs may be inserted with no effect anywhere except within the directive
|
|
name or within an argument. A comment starting with @samp{#} may appear at
|
|
the end of the line.
|
|
|
|
The other two directives that play a part in a conditional are @code{else}
|
|
and @code{endif}. Each of these directives is written as one word, with no
|
|
arguments. Extra spaces are allowed and ignored at the beginning of the
|
|
line, and spaces or tabs at the end. A comment starting with @samp{#} may
|
|
appear at the end of the line.
|
|
|
|
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 commands are run
|
|
(@pxref{Automatic, , 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 command 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. 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.
|
|
* Filename Functions:: Functions for manipulating file names.
|
|
* Foreach Function:: Repeat some text with controlled variation.
|
|
* Origin Function:: Find where a variable got its value.
|
|
* Shell Function:: Substitute the output of a shell command.
|
|
@end menu
|
|
|
|
@node Syntax of Functions, Text 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}. There is no provision for defining new functions.
|
|
|
|
The @var{arguments} are the arguments of the function. They are
|
|
separated from the function name by one or more spaces 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, Filename 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}.@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})
|
|
Removes all whitespace-separated words in @var{text} that do
|
|
@emph{not} match any of the @var{pattern} words, returning only
|
|
matching words. 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
|
|
Removes all whitespace-separated words in @var{text} that @emph{do}
|
|
match the @var{pattern} words, returning only the words that @emph{do
|
|
not} match. 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.
|
|
@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
|
|
dependency files
|
|
(@pxref{General Search, , @code{VPATH} Search Path for All Dependencies}).
|
|
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 Filename Functions, Foreach Function, 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 hacks)
|
|
@end example
|
|
|
|
@noindent
|
|
produces the result @samp{.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. Otherwise, the basename is the
|
|
entire file name. For example,
|
|
|
|
@example
|
|
$(basename src/foo.c hacks)
|
|
@end example
|
|
|
|
@noindent
|
|
produces the result @samp{src/foo hacks}.
|
|
|
|
@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 $(word @var{n},@var{text})
|
|
@findex word
|
|
@cindex words, selecting
|
|
@cindex selecting words
|
|
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}.
|
|
|
|
@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 $(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}.
|
|
@end table
|
|
|
|
@node Foreach Function, Origin Function, Filename 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 Es 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{Es escrito en espanol!} (es un nombre bastante largo,
|
|
no?), but it is more likely to be a mistake.
|
|
|
|
@node Origin Function, Shell Function, Foreach 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 commands for each rule
|
|
(@pxref{Automatic, , 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 Shell Function, , Origin Function, Functions
|
|
@section The @code{shell} Function
|
|
@findex shell
|
|
@cindex commands, expansion
|
|
@cindex backquotes
|
|
@cindex shell command, function for
|
|
|
|
The @code{shell} function is unlike any other function except 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 an argument that is a shell command and returns the
|
|
output of the command. The only processing @code{make} does on the result,
|
|
before substituting it into the surrounding text, is to convert newlines to
|
|
spaces.@refill
|
|
|
|
The commands run by calls to the @code{shell} function are run when the
|
|
function calls are expanded. In most cases, this is when the makefile is
|
|
read in. The exception is that function calls in the commands of the rules
|
|
are expanded when the commands are run, and this applies to @code{shell}
|
|
function calls like all others.
|
|
|
|
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)}}.@refill
|
|
|
|
@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.
|
|
|
|
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 Commands}.
|
|
@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 commands
|
|
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
|
|
@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
|
|
dependencies of goals, or dependencies of dependencies of goals, etc.
|
|
|
|
By default, the goal is the first target in the makefile (not counting
|
|
targets that start with a period). Therefore, makefiles are usually
|
|
written so that the first target is for compiling the entire program or
|
|
programs they describe.
|
|
|
|
You can specify a different goal or goals with arguments to @code{make}.
|
|
Use the name of the goal as an argument. If you specify several goals,
|
|
@code{make} processes each of them in turn, in the order you name them.
|
|
|
|
Any target in the makefile may be specified as a goal (unless it
|
|
starts with @samp{-} or contains an @samp{=}, 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.
|
|
|
|
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 dependency of the default goal.
|
|
|
|
Another use of specifying a goal is to run the commands associated with
|
|
a phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty
|
|
Targets, ,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 Commands
|
|
@cindex execution, instead of
|
|
@cindex commands, 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 commands would be used to make
|
|
the targets up to date, but not actually execute them.
|
|
|
|
@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 commands 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 commands that it would
|
|
normally execute but does not execute them.
|
|
|
|
With the @samp{-t} flag, @code{make} ignores the commands in the rules
|
|
and uses (in effect) the command @code{touch} for each target that needs to
|
|
be remade. The @code{touch} command is also printed, unless @samp{-s} or
|
|
@code{.SILENT} is used. For speed, @code{make} does not actually invoke
|
|
the program @code{touch}. It does the work directly.
|
|
|
|
With the @samp{-q} flag, @code{make} prints nothing and executes no
|
|
commands, but the exit status code it returns is zero if and only if the
|
|
targets to be considered are already up to date. 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}.
|
|
|
|
The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect command
|
|
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 commands, the @samp{-W} flag can direct @code{make} to act
|
|
as if some files had been modified, without actually modifying the
|
|
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
|
|
commands in the rules, but rather to mark the target up to date by
|
|
changing its last-modification date. You would follow this procedure:
|
|
|
|
@enumerate
|
|
@item
|
|
Use the command @samp{make} to recompile the source files that really
|
|
need recompilation.
|
|
|
|
@item
|
|
Make the changes in the header files.
|
|
|
|
@item
|
|
Use the command @samp{make -t} to mark all the object files as
|
|
up to date. The next time you run @code{make}, the changes in the
|
|
header files will not cause any recompilation.
|
|
@end enumerate
|
|
|
|
If you have already changed the header file at a time when some files
|
|
do need recompilation, it is too late to do this. Instead, you can
|
|
use the @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 command 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 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 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 commands 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 dependencies of the pending targets, remaking them
|
|
if necessary, before it gives up and returns nonzero status. For
|
|
example, after an error in compiling one object file, @samp{make -k}
|
|
will continue compiling other object files even though it already
|
|
knows that linking them will be impossible. 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 dependency 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 -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}
|
|
@itemx --debug
|
|
@cindex @code{--debug}
|
|
@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.
|
|
|
|
@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 commands executed to remake files.
|
|
@xref{Errors, ,Errors in Commands}.
|
|
|
|
@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 jobs (commands) to run simultaneously. With no
|
|
argument, @code{make} runs as many jobs 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 commands are run.
|
|
|
|
@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
|
|
dependencies 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 jobs (commands) should be started if there are
|
|
other jobs 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 -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 commands that would be executed, but do not execute them.
|
|
@xref{Instead of Execution, ,Instead of Executing the Commands}.
|
|
|
|
@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
|
|
dependencies, and do not remake anything on account of changes in
|
|
@var{file}. Essentially the file is treated as very old and its rules
|
|
are ignored. @xref{Avoiding Compilation, ,Avoiding Recompilation of
|
|
Some Files}.@refill
|
|
|
|
@item -p
|
|
@cindex @code{-p}
|
|
@itemx --print-data-base
|
|
@cindex @code{--print-data-base}
|
|
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 -p -f /dev/null}}.
|
|
|
|
@item -q
|
|
@cindex @code{-q}
|
|
@itemx --question
|
|
@cindex @code{--question}
|
|
``Question mode''. Do not run any commands, or print anything; just
|
|
return an exit status that is zero if the specified targets are already
|
|
up to date, one if any remaking is required, or two if an error is
|
|
encountered. @xref{Instead of Execution, ,Instead of Executing the
|
|
Commands}.@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.
|
|
|
|
@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 commands as they are executed.
|
|
@xref{Echoing, ,Command 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 commands. This is used to pretend that the
|
|
commands were done, in order to fool future invocations of
|
|
@code{make}. @xref{Instead of Execution, ,Instead of Executing the Commands}.
|
|
|
|
@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 Commands}.
|
|
|
|
@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 commands so
|
|
that, by changing the values of the variables, you can change the way the
|
|
implicit rule works. For example, the variable @code{CFLAGS} controls the
|
|
flags given to the C compiler by the implicit rule for C compilation.
|
|
@iftex
|
|
@xref{Implicit Variables, ,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 commands 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 defining commands for rules
|
|
which cannot find any.
|
|
* Suffix Rules:: The old-fashioned style of implicit rule.
|
|
* Search Algorithm:: The precise algorithm for applying
|
|
implicit rules.
|
|
@end menu
|
|
|
|
@node Using Implicit, Catalogue of 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 commands yourself. Either
|
|
write a rule with no command lines, or don't write a rule at all. Then
|
|
@code{make} will figure out which implicit rule to use based on which
|
|
kind of source file exists 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 commands and one or
|
|
more dependencies (the source files). You would want to write a rule
|
|
for @file{foo.o} with no command lines if you need to specify additional
|
|
dependencies, such as header files, that the implicit rule cannot
|
|
supply.
|
|
|
|
Each implicit rule has a target pattern and dependency patterns. There may
|
|
be many implicit rules with the same target pattern. For example, numerous
|
|
rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler;
|
|
another, from a @samp{.p} file with the Pascal compiler; and so on. The rule
|
|
that actually applies is the one whose dependencies 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 dependency 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 dependencies ``exist
|
|
or can be made''. A file ``can be made'' if it is mentioned explicitly in
|
|
the makefile as a target or a dependency, or if an implicit rule can be
|
|
recursively found for how to make it. When an implicit dependency 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 commands. A file that is mentioned
|
|
only as a dependency is considered a target whose rule specifies nothing,
|
|
so implicit rule search happens for it. @xref{Search Algorithm, ,Implicit Rule Search Algorithm}, for the
|
|
details of how the search is done.
|
|
|
|
Note that explicit dependencies do not influence implicit rule search.
|
|
For example, consider this explicit rule:
|
|
|
|
@example
|
|
foo.o: foo.p
|
|
@end example
|
|
|
|
@noindent
|
|
The dependency 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
|
|
commands, you can give that target empty commands by writing a semicolon
|
|
(@pxref{Empty Commands, ,Defining Empty Commands}).
|
|
|
|
@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.
|
|
|
|
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 dependencies 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{.p}, @code{.f}, @code{.F}, @code{.r}, @code{.y},
|
|
@code{.l}, @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 dependencies 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 command of the form @samp{$(CC) -c $(CPPFLAGS) $(CFLAGS)}.@refill
|
|
|
|
@item Compiling C++ programs
|
|
@cindex C++, rule to compile
|
|
@pindex g++
|
|
@pindex .C
|
|
@pindex .cc
|
|
@file{@var{n}.o} is made automatically from @file{@var{n}.cc} or
|
|
@file{@var{n}.C} with a command 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 command @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 command 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 command 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 command
|
|
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 command 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 command 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
|
|
command used is @w{@samp{$(CC) $(LDFLAGS) @var{n}.o $(LOADLIBES)}}.
|
|
|
|
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
|
|
command 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 command @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
|
|
by running Lex. The actual command is @samp{$(LEX) $(LFLAGS)}.
|
|
|
|
@item Lex for Ratfor programs
|
|
@file{@var{n}.r} is made automatically from @file{@var{n}.l} by
|
|
by running Lex. The actual command 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 command is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}.
|
|
The same command 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 command
|
|
@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 command
|
|
@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 command @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
|
|
command 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
|
|
command 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 commands in built-in implicit rules actually use
|
|
variables such as @code{COMPILE.c}, @code{LINK.p}, and
|
|
@code{PREPROCESS.S}, whose values contain the commands 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 commands in built-in implicit rules make liberal use of certain
|
|
predefined variables. You can alter 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.
|
|
|
|
For example, the command 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.
|
|
|
|
Here is a table of variables used as names of programs in built-in rules:
|
|
|
|
@table @code
|
|
@item AR
|
|
@vindex AR
|
|
Archive-maintaining program; default @samp{ar}.
|
|
@pindex ar
|
|
|
|
@item AS
|
|
@vindex AS
|
|
Program for doing assembly; 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 CO
|
|
@vindex CO
|
|
Program for extracting a file from RCS; default @samp{co}.
|
|
@pindex co
|
|
|
|
@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 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 C programs or Ratfor programs;
|
|
default @samp{lex}.
|
|
@pindex lex
|
|
|
|
@item PC
|
|
@vindex PC
|
|
Program for compiling Pascal programs; default @samp{pc}.
|
|
@pindex pc
|
|
|
|
@item YACC
|
|
@vindex YACC
|
|
Program to use to turn Yacc grammars into C programs; default @samp{yacc}.
|
|
@pindex yacc
|
|
|
|
@item YACCR
|
|
@vindex YACCR
|
|
Program to use to turn Yacc grammars into Ratfor
|
|
programs; default @samp{yacc -r}.
|
|
|
|
@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 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 YFLAGS
|
|
@vindex YFLAGS
|
|
Extra flags to give to Yacc.
|
|
@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. The difference is that the intermediate file is deleted when
|
|
@code{make} is finished. Therefore, the intermediate file which did not
|
|
exist before @code{make} also does not exist after @code{make}. The
|
|
deletion is reported to you by printing a @samp{rm -f} command that
|
|
shows what @code{make} is doing. (You can list the target pattern of an
|
|
implicit rule (such as @samp{%.o}) as a dependency 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 intermediate files, preserving
|
|
@cindex preserving intermediate files
|
|
@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 dependencies
|
|
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:: How to use automatic variables in the
|
|
commands 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
|
|
@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 dependency of a pattern rule stands for the same stem
|
|
that was matched by the @samp{%} in the target. In order for
|
|
the pattern rule to apply, its target pattern must match the file name
|
|
under consideration, and its dependency patterns must name files that
|
|
exist or can be made. These files become dependencies of the target.
|
|
@cindex dependency pattern, implicit
|
|
|
|
Thus, a rule of the form
|
|
|
|
@example
|
|
%.o : %.c ; @var{command}@dots{}
|
|
@end example
|
|
|
|
@noindent
|
|
specifies how to make a file @file{@var{n}.o}, with another file
|
|
@file{@var{n}.c} as its dependency, provided that @file{@var{n}.c}
|
|
exists or can be made.
|
|
|
|
There may also be dependencies that do not use @samp{%}; such a dependency
|
|
attaches to every file made by this pattern rule. These unvarying
|
|
dependencies are useful occasionally.
|
|
|
|
A pattern rule need not have any dependencies that contain @samp{%}, or
|
|
in fact any dependencies 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 dependencies and
|
|
commands. If a pattern rule has multiple targets, @code{make} knows that
|
|
the rule's commands are responsible for making all of the targets. The
|
|
commands are 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 commands and dependencies to the file
|
|
presently in question. However, when this file's commands are 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
|
|
dependencies actually exist or are mentioned always takes priority over a
|
|
rule with dependencies that must be made by chaining other implicit rules.
|
|
@cindex pattern rules, order of
|
|
@cindex order of pattern rules
|
|
|
|
@node Pattern Examples, Automatic, 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 command 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, ,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 dependency file exists. The double colon makes the rule
|
|
@dfn{terminal}, which means that its dependency may not be an intermediate
|
|
file (@pxref{Match-Anything Rules, ,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 command @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 command @samp{bison -d parse.y}
|
|
will be executed only once, and the dependencies 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
|
|
dependencies, and it will execute happily ever after.)@refill
|
|
|
|
@node Automatic, 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 command,
|
|
because the name is different each time the implicit rule is applied.
|
|
|
|
What you do is use a special feature of @code{make}, the @dfn{automatic
|
|
variables}. These variables have values computed afresh for each rule that
|
|
is executed, based on the target and dependencies of the rule. In this
|
|
example, you would use @samp{$@@} for the object file name and @samp{$<}
|
|
for the source file name.
|
|
|
|
Here is a table of automatic variables:
|
|
|
|
@table @code
|
|
@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 commands 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 dependency. If the target got its commands from
|
|
an implicit rule, this will be the first dependency added by the
|
|
implicit rule (@pxref{Implicit Rules}).
|
|
|
|
@vindex $?
|
|
@vindex ? @r{(automatic variable)}
|
|
@item $?
|
|
The names of all the dependencies that are newer than the target, with
|
|
spaces between them. For dependencies which are archive members, only
|
|
the member named is used (@pxref{Archives}).
|
|
@cindex dependencies, list of changed
|
|
@cindex list of changed dependencies
|
|
|
|
@vindex $^
|
|
@vindex ^ @r{(automatic variable)}
|
|
@item $^
|
|
The names of all the dependencies, with spaces between them. For
|
|
dependencies which are archive members, only the member named is used
|
|
(@pxref{Archives}). A target has only one dependency on each other file
|
|
it depends on, no matter how many times each file is listed as a
|
|
dependency. So if you list a dependency more than once for a target,
|
|
the value of @code{$^} contains just one copy of the name.
|
|
@cindex dependencies, list of all
|
|
@cindex list of all dependencies
|
|
|
|
@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 dependencies that have changed. For example, suppose that an archive
|
|
named @file{lib} is supposed to contain copies of several object files.
|
|
This rule copies just the changed object files into the archive:
|
|
|
|
@example
|
|
@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 two have values that are lists of file names. These six 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{Filename
|
|
Functions, , Functions for File Names}). Note, however, that the
|
|
@samp{F} 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 dependency.
|
|
|
|
@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 dependencies.
|
|
|
|
@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 dependencies 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, 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 dependencies are
|
|
turned into actual file names by substituting the stem for the character
|
|
@samp{%}. Thus, if in the same example one of the dependencies is written
|
|
as @samp{%.c}, it expands to @samp{test.c}.@refill
|
|
|
|
When the target pattern does not contain a slash (and 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
|
|
dependency file names generated from the pattern rule's dependency
|
|
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 dependencies are turned into file
|
|
names, the directories from the stem are added at the front, while the
|
|
rest of the stem is substituted for the @samp{%}. The stem
|
|
@samp{src/a} with a dependency pattern @samp{c%r} gives the file name
|
|
@file{src/car}.@refill
|
|
|
|
@node Match-Anything Rules, Canceling Rules, Pattern Match, Pattern Rules
|
|
@subsection Match-Anything Pattern Rules
|
|
|
|
@cindex match-anything rule
|
|
@cindex terminal rule
|
|
When a pattern rule's target is just @samp{%}, it matches any 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 dependency.
|
|
|
|
Suppose the makefile mentions @file{foo.c}. For this target, @code{make}
|
|
would have to consider making it by linking an object file @file{foo.c.o},
|
|
or by C compilation-and-linking in one step from @file{foo.c.c}, or by
|
|
Pascal compilation-and-linking from @file{foo.c.p}, and many other
|
|
possibilities.
|
|
|
|
We know these possibilities are ridiculous since @file{foo.c} is a C source
|
|
file, not an executable. 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 dependencies actually exist. Dependencies 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 dependencies and no commands, and
|
|
they are ignored for all other purposes. For example, the built-in
|
|
implicit rule
|
|
|
|
@example
|
|
%.p :
|
|
@end example
|
|
|
|
@noindent
|
|
exists to make sure that Pascal source files such as @file{foo.p} match a
|
|
specific target pattern and thereby prevent time from being wasted looking
|
|
for @file{foo.p.o} or @file{foo.p.c}.
|
|
|
|
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
|
|
dependencies, but different commands. When the new rule is defined, the
|
|
built-in one is replaced. The new rule's position in the sequence of
|
|
implicit rules is determined by where you write the new rule.
|
|
|
|
You can cancel a built-in implicit rule by defining a pattern rule with the
|
|
same target and dependencies, but no commands. For example, the following
|
|
would cancel the rule that runs the assembler:
|
|
|
|
@example
|
|
%.o : %.s
|
|
@end example
|
|
|
|
@node Last Resort, Suffix Rules, Pattern Rules, Implicit 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 dependencies (@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
|
|
commands are used for all targets and dependencies that have no commands
|
|
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 dependencies) to be created
|
|
automatically.
|
|
|
|
@findex .DEFAULT
|
|
You can instead define commands to be used for targets for which there
|
|
are no rules at all, even ones which don't specify commands. You do
|
|
this by writing a rule for the target @code{.DEFAULT}. Such a rule's
|
|
commands are used for all dependencies 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 commands or dependencies:
|
|
|
|
@example
|
|
.DEFAULT:
|
|
@end example
|
|
|
|
@noindent
|
|
the commands previously stored for @code{.DEFAULT} are 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 commands from a match-anything
|
|
pattern rule or @code{.DEFAULT}, but you also do not want any commands
|
|
to be run for the target, you can give it empty commands (@pxref{Empty
|
|
Commands, ,Defining Empty Commands}).@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, Search Algorithm, 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 dependency 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
|
|
dependency name is made by appending the source suffix. A single-suffix
|
|
rule whose source suffix is @samp{.c} is equivalent to the pattern rule
|
|
@samp{% : %.c}.
|
|
|
|
Suffix rule definitions are recognized by comparing each rule's target
|
|
against a defined list of known suffixes. When @code{make} sees a rule
|
|
whose target is a known suffix, this rule is considered a single-suffix
|
|
rule. When @code{make} sees a rule whose target is two known suffixes
|
|
concatenated, this rule is taken as a double-suffix rule.
|
|
|
|
For example, @samp{.c} and @samp{.o} are both on the default list of
|
|
known suffixes. Therefore, if you define a rule whose target is
|
|
@samp{.c.o}, @code{make} takes it to be a double-suffix rule with source
|
|
suffix @samp{.c} and target suffix @samp{.o}. 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 dependencies 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 dependency 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 commands are also meaningless. They do not remove
|
|
previous rules as do pattern rules with no commands (@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 dependencies of the special
|
|
target @code{.SUFFIXES}. You can add your own suffixes by writing a rule
|
|
for @code{.SUFFIXES} that adds more dependencies, as in:
|
|
|
|
@example
|
|
.SUFFIXES: .hack .win
|
|
@end example
|
|
|
|
@noindent
|
|
which adds @samp{.hack} and @samp{.win} to the end of the list of suffixes.
|
|
|
|
If you wish to eliminate the default known suffixes instead of just adding
|
|
to them, write a rule for @code{.SUFFIXES} with no dependencies. By
|
|
special dispensation, this eliminates all existing dependencies of
|
|
@code{.SUFFIXES}. You can then write another rule to add the suffixes you
|
|
want. For example,
|
|
|
|
@example
|
|
@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 Search Algorithm, , 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 commands, for each target of ordinary rules none of which have
|
|
commands, and for each dependency that is not the target of any rule. It
|
|
is also followed recursively for dependencies that come from implicit
|
|
rules, in the search for a chain of rules.
|
|
|
|
Suffix rules are not mentioned in this algorithm because suffix rules are
|
|
converted to equivalent pattern rules 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 commands.
|
|
|
|
@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 dependency names by substituting @var{s} for @samp{%}; if
|
|
the target pattern does not contain a slash, append @var{d} to
|
|
the front of each dependency name.@refill
|
|
|
|
@item
|
|
Test whether all the dependencies exist or ought to exist. (If a
|
|
file name is mentioned in the makefile as a target or as an explicit
|
|
dependency, then we say it ought to exist.)
|
|
|
|
If all dependencies exist or ought to exist, or there are no dependencies,
|
|
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 dependency names as before.
|
|
|
|
@item
|
|
Test whether all the dependencies exist or ought to exist.
|
|
|
|
@item
|
|
For each dependency that does not exist, follow this algorithm
|
|
recursively to see if the dependency can be made by an implicit
|
|
rule.
|
|
|
|
@item
|
|
If all dependencies exist, ought to exist, or can be
|
|
made by implicit rules, then this rule applies.
|
|
@end enumerate
|
|
|
|
@item
|
|
If no implicit rule applies, the rule for @code{.DEFAULT}, if any,
|
|
applies. In that case, give @var{t} the same commands that
|
|
@code{.DEFAULT} has. Otherwise, there are no commands for @var{t}.
|
|
@end enumerate
|
|
|
|
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 commands to remake the target file @var{t} are executed. After
|
|
these commands are 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 commands of a pattern rule are executed for @var{t}, the automatic
|
|
variables are set corresponding to the target and dependencies.
|
|
@xref{Automatic, ,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 Suffix Rules:: You can write a special kind of suffix rule
|
|
for updating archives.
|
|
@end menu
|
|
|
|
@node Archive Members, Archive Update, , Archives
|
|
@section Archive Members as Targets
|
|
@cindex archive member targets
|
|
|
|
An individual member of an archive file can be used as a target or
|
|
dependency in @code{make}. You specify the member named @var{member} in
|
|
archive file @var{archive} as follows:
|
|
|
|
@example
|
|
@var{archive}(@var{member})
|
|
@end example
|
|
|
|
@noindent
|
|
This construct is available only in targets and dependencies, not in
|
|
commands! Most programs that you might use in commands do not support this
|
|
syntax and cannot act directly on archive members. Only @code{ar} and
|
|
other programs specifically designed to operate on archives can do so.
|
|
Therefore, valid commands to update an archive member target probably must
|
|
use @code{ar}. For example, this rule says to create a member
|
|
@file{hack.o} in archive @file{foolib} by copying the file @file{hack.o}:
|
|
|
|
@example
|
|
foolib(hack.o) : hack.o
|
|
ar 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{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 Suffix Rules, 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
|
|
commands to be run, even without a makefile:
|
|
|
|
@example
|
|
cc -c bar.c -o bar.o
|
|
ar r foo.a bar.o
|
|
rm -f bar.o
|
|
@end example
|
|
|
|
@noindent
|
|
Here @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, ,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 command:
|
|
|
|
@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
|
|
@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 dependencies 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 Suffix Rules, , Archive Update, 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 dependency 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 use only the
|
|
features of @code{make} @emph{not} listed here or 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 Dependencies}.
|
|
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, ,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, ,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
|
|
commands is retained when the commands 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 dependencies
|
|
of the current target. We did not invent this, but we have no idea who did.
|
|
@xref{Automatic, ,Automatic Variables}.
|
|
|
|
@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 Commands}.
|
|
|
|
@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, ,Command 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 command lines
|
|
(@pxref{Instead of Execution, ,Instead of Executing the Commands}) 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.)
|
|
@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 dependencies 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
|
|
Specify static pattern rules. @xref{Static Pattern, ,Static Pattern Rules}.
|
|
|
|
@item
|
|
Provide selective @code{vpath} search.
|
|
@xref{Directory Search, ,Searching Directories for Dependencies}.
|
|
|
|
@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}.
|
|
@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 @code{make}, the string @samp{$$@@} has the strange meaning
|
|
that, in the dependencies of a rule with multiple targets, it stands
|
|
for the particular target that is being processed.
|
|
|
|
This is not defined in GNU @code{make} because @samp{$$} should always
|
|
stand for an ordinary @samp{$}.
|
|
|
|
It is possible to get this functionality through the use of static pattern
|
|
rules (@pxref{Static Pattern, ,Static Pattern Rules}).
|
|
The System V @code{make} rule:
|
|
|
|
@example
|
|
$(targets): $$@@.o lib.a
|
|
@end example
|
|
|
|
@noindent
|
|
can be replaced with the GNU @code{make} static pattern rule:
|
|
|
|
@example
|
|
$(targets): %: %.o lib.a
|
|
@end example
|
|
|
|
@item
|
|
In System V and 4.3 BSD @code{make}, files found by @code{VPATH} search
|
|
(@pxref{Directory Search, ,Searching Directories for Dependencies}) have their names changed inside command
|
|
strings. 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 dependencies 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 commands. 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 dependency 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 commands, and it is treated as if it had empty commands
|
|
(@pxref{Empty Commands}). 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 commands to always simply
|
|
add to the dependency 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 shell command line 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, Complex Makefile, 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}
|
|
|
|
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 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 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 text manipulation 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 $(dir @var{names}@dots{})
|
|
Extract the directory part of each file name.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(notdir @var{names}@dots{})
|
|
Extract the non-directory part of each file name.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(suffix @var{names}@dots{})
|
|
Extract the suffix (the last @samp{.} and following characters) of each file name.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(basename @var{names}@dots{})
|
|
Extract the base name (name without suffix) of each file name.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(addsuffix @var{suffix},@var{names}@dots{})
|
|
Append @var{suffix} to each word in @var{names}.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(addprefix @var{prefix},@var{names}@dots{})
|
|
Prepend @var{prefix} to each word in @var{names}.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(join @var{list1},@var{list2})
|
|
Join two parallel lists of words.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(word @var{n},@var{text})
|
|
Extract the @var{n}th word (one-origin) of @var{text}.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(words @var{text})
|
|
Count the number of words in @var{text}.@*
|
|
@xref{Filename Functions, ,Functions for File Names}.
|
|
|
|
@item $(firstword @var{names}@dots{})
|
|
Extract the first word of @var{names}.@*
|
|
@xref{Filename 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 $(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 $(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}.
|
|
@end table
|
|
|
|
Here is a summary of the automatic variables.
|
|
@xref{Automatic, ,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 dependency.
|
|
|
|
@item $?
|
|
The names of all the dependencies that are
|
|
newer than the target, with spaces between them.
|
|
For dependencies which are archive members, only
|
|
the member named is used (@pxref{Archives}).
|
|
|
|
@item $^
|
|
The names of all the dependencies, with spaces between them. For
|
|
dependencies which are archive members, only the member named is used
|
|
(@pxref{Archives}).
|
|
|
|
@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{$?}.
|
|
@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 Dependencies}.
|
|
|
|
@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
|
|
commands. @xref{Execution, ,Command Execution}.
|
|
|
|
@item MAKE
|
|
|
|
The name with which @code{make} was invoked.
|
|
Using this variable in commands 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}}.
|
|
|
|
@item SUFFIXES
|
|
|
|
The default list of suffixes before @code{make} reads any makefiles.
|
|
@end table
|
|
|
|
@node Complex Makefile, Concept Index, Quick Reference, 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
|
|
|
|
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
|
|
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
|
|
clean:
|
|
rm -f *.o tar rmt testpad testpad.h core
|
|
@end group
|
|
|
|
@group
|
|
distclean: clean
|
|
rm -f TAGS Makefile config.status
|
|
@end group
|
|
|
|
@group
|
|
realclean: distclean
|
|
rm -f tar.info*
|
|
@end group
|
|
|
|
@group
|
|
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
|
|
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`
|
|
-rm -rf `cat .fname` .fname
|
|
tar chZf `cat .fname`.tar.Z `cat .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 Concept Index, Name Index, Complex Makefile, Top
|
|
@unnumbered Index of Concepts
|
|
|
|
@printindex cp
|
|
|
|
@node Name Index, , Concept Index, Top
|
|
@unnumbered Index of Functions, Variables, & Directives
|
|
|
|
@printindex fn
|
|
|
|
@summarycontents
|
|
@contents
|
|
@bye
|