mirror of
https://salsa.debian.org/srivasta/make-dfsg.git
synced 2025-02-12 07:07:39 +00:00
Initial upstream version git-archimport-id: srivasta@debian.org--2003-primary/make--upstream--3.0--base-0
1063 lines
46 KiB
Text
1063 lines
46 KiB
Text
This is make.info, produced by makeinfo version 4.2 from make.texi.
|
||
|
||
INFO-DIR-SECTION GNU Packages
|
||
START-INFO-DIR-ENTRY
|
||
* Make: (make). Remake files automatically.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
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 0.60, last updated 08 July 2002, of `The GNU Make
|
||
Manual', for `make', Version 3.80.
|
||
|
||
Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
|
||
1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||
any later version published by the Free Software Foundation; with no
|
||
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
||
Texts. A copy of the license is included in the section entitled "GNU
|
||
Free Documentation License".
|
||
|
||
|
||
File: make.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
|
||
|
||
Make
|
||
****
|
||
|
||
The GNU `make' utility automatically determines which pieces of a
|
||
large program need to be recompiled, and issues the commands to
|
||
recompile them.
|
||
|
||
This edition of the `GNU Make Manual', last updated 08 July 2002,
|
||
documents GNU `make' Version 3.80.
|
||
|
||
This manual describes `make' and contains the following chapters:
|
||
|
||
* Menu:
|
||
|
||
* Overview:: Overview of `make'.
|
||
* Introduction:: An introduction to `make'.
|
||
* Makefiles:: Makefiles tell `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.
|
||
* Invoking make: Running. How to invoke `make' on the command line.
|
||
* Implicit Rules:: Use implicit rules to treat many files alike,
|
||
based on their file names.
|
||
* Archives:: How `make' can update library archives.
|
||
* Features:: Features GNU `make' has over other `make's.
|
||
* Missing:: What GNU `make' lacks from other `make's.
|
||
* Makefile Conventions:: Conventions for writing makefiles for
|
||
GNU programs.
|
||
* Quick Reference:: A quick reference for experienced users.
|
||
* Error Messages:: A list of common errors generated by `make'.
|
||
* Complex Makefile:: A real example of a straightforward,
|
||
but nontrivial, makefile.
|
||
|
||
* GNU Free Documentation License:: License for copying this manual
|
||
* Concept Index:: Index of Concepts
|
||
* Name Index:: Index of Functions, Variables, & Directives
|
||
|
||
--- The Detailed Node Listing ---
|
||
|
||
Overview of `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 `make' Processes This Makefile
|
||
* Variables Simplify:: Variables Make Makefiles Simpler
|
||
* make Deduces:: Letting `make' Deduce the Commands
|
||
* Combine By Prerequisite:: Another Style of Makefile
|
||
* Cleanup:: Rules for Cleaning the Directory
|
||
|
||
Writing Makefiles
|
||
|
||
* Makefile Contents:: What makefiles contain.
|
||
* Makefile Names:: How to name your makefile.
|
||
* Include:: How one makefile can use another makefile.
|
||
* MAKEFILES Variable:: The environment can specify extra makefiles.
|
||
* MAKEFILE_LIST Variable:: Discover which makefiles have been read.
|
||
* Special Variables:: Other special variables.
|
||
* Remaking Makefiles:: How makefiles get remade.
|
||
* Overriding Makefiles:: How to override part of one makefile
|
||
with another makefile.
|
||
* Reading Makefiles:: How makefiles are parsed.
|
||
|
||
Writing Rules
|
||
|
||
* Rule Example:: An example explained.
|
||
* Rule Syntax:: General syntax explained.
|
||
* Prerequisite Types:: There are two types of prerequisites.
|
||
* Wildcards:: Using wildcard characters such as `*'.
|
||
* Directory Search:: Searching other directories for source files.
|
||
* Phony Targets:: Using a target that is not a real file's name.
|
||
* Force Targets:: You can use a target without commands
|
||
or prerequisites to mark other
|
||
targets as phony.
|
||
* Empty Targets:: When only the date matters and the
|
||
files are empty.
|
||
* Special Targets:: Targets with special built-in meanings.
|
||
* Multiple Targets:: When to make use of several targets in a rule.
|
||
* Multiple Rules:: How to use several rules with the same target.
|
||
* Static Pattern:: Static pattern rules apply to multiple targets
|
||
and can vary the prerequisites according to
|
||
the target name.
|
||
* Double-Colon:: How to use a special kind of rule to allow
|
||
several independent rules for one target.
|
||
* Automatic Prerequisites:: How to automatically generate rules giving
|
||
prerequisites from source files themselves.
|
||
|
||
Using Wildcard Characters in File Names
|
||
|
||
* Wildcard Examples:: Several examples
|
||
* Wildcard Pitfall:: Problems to avoid.
|
||
* Wildcard Function:: How to cause wildcard expansion where
|
||
it does not normally take place.
|
||
|
||
Searching Directories for Prerequisites
|
||
|
||
* General Search:: Specifying a search path that applies
|
||
to every prerequisite.
|
||
* Selective Search:: Specifying a search path
|
||
for a specified class of names.
|
||
* Search Algorithm:: When and how search paths are applied.
|
||
* 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 `make' from makefiles.
|
||
* Sequences:: Defining canned sequences of commands.
|
||
* Empty Commands:: Defining useful, do-nothing commands.
|
||
|
||
Recursive Use of `make'
|
||
|
||
* MAKE Variable:: The special effects of using `$(MAKE)'.
|
||
* Variables/Recursion:: How to communicate variables to a sub-`make'.
|
||
* Options/Recursion:: How to communicate options to a sub-`make'.
|
||
* -w Option:: How the `-w' or `--print-directory' option
|
||
helps debug use of recursive `make' commands.
|
||
|
||
How to Use Variables
|
||
|
||
* Reference:: How to use the value of a variable.
|
||
* Flavors:: Variables come in two flavors.
|
||
* Advanced:: Advanced features for referencing a variable.
|
||
* Values:: All the ways variables get their values.
|
||
* Setting:: How to set a variable in the makefile.
|
||
* Appending:: How to append more text to the old value
|
||
of a variable.
|
||
* Override Directive:: How to set a variable in the makefile even if
|
||
the user has set it with a command argument.
|
||
* Defining:: An alternate way to set a variable
|
||
to a verbatim string.
|
||
* Environment:: Variable values can come from the environment.
|
||
* Target-specific:: Variable values can be defined on a per-target
|
||
basis.
|
||
* Pattern-specific:: Target-specific variable values can be applied
|
||
to a group of targets that match a pattern.
|
||
|
||
Advanced Features for Reference to Variables
|
||
|
||
* Substitution Refs:: Referencing a variable with
|
||
substitutions on the value.
|
||
* Computed Names:: Computing the name of the variable to refer to.
|
||
|
||
Conditional Parts of Makefiles
|
||
|
||
* Conditional Example:: Example of a conditional
|
||
* Conditional Syntax:: The syntax of conditionals.
|
||
* Testing Flags:: Conditionals that test flags.
|
||
|
||
Functions for Transforming Text
|
||
|
||
* Syntax of Functions:: How to write a function call.
|
||
* Text Functions:: General-purpose text manipulation functions.
|
||
* File Name Functions:: Functions for manipulating file names.
|
||
* Foreach Function:: Repeat some text with controlled variation.
|
||
* If Function:: Conditionally expand a value.
|
||
* Call Function:: Expand a user-defined function.
|
||
* Value Function:: Return the un-expanded value of a variable.
|
||
* Eval Function:: Evaluate the arguments as makefile syntax.
|
||
* Origin Function:: Find where a variable got its value.
|
||
* Shell Function:: Substitute the output of a shell command.
|
||
* Make Control Functions:: Functions that control how make runs.
|
||
|
||
How to Run `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.
|
||
* Implicit Rule Search:: The precise algorithm for applying
|
||
implicit rules.
|
||
|
||
Defining and Redefining Pattern Rules
|
||
|
||
* Pattern Intro:: An introduction to pattern rules.
|
||
* Pattern Examples:: Examples of pattern rules.
|
||
* Automatic:: 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 `make' to Update Archive Files
|
||
|
||
* Archive Members:: Archive members as targets.
|
||
* Archive Update:: The implicit rule for archive member targets.
|
||
* Archive Pitfalls:: Dangers to watch out for when using archives.
|
||
* Archive Suffix Rules:: You can write a special kind of suffix rule
|
||
for updating archives.
|
||
|
||
Implicit Rule for Archive Member Targets
|
||
|
||
* Archive Symbols:: How to update archive symbol directories.
|
||
|
||
Makefile Conventions
|
||
|
||
* Makefile Basics:: General Conventions for Makefiles
|
||
* Utilities in Makefiles:: Utilities in Makefiles
|
||
* Command Variables:: Variables for Specifying Commands
|
||
* Directory Variables:: Variables for Installation Directories
|
||
* Standard Targets:: Standard Targets for Users
|
||
* Install Command Categories:: Three categories of commands in the `install'
|
||
|
||
Copying This Manual
|
||
|
||
|
||
File: make.info, Node: Overview, Next: Introduction, Prev: Top, Up: Top
|
||
|
||
Overview of `make'
|
||
******************
|
||
|
||
The `make' utility automatically determines which pieces of a large
|
||
program need to be recompiled, and issues commands to recompile them.
|
||
This manual describes GNU `make', which was implemented by Richard
|
||
Stallman and Roland McGrath. Development since Version 3.76 has been
|
||
handled by Paul Smith.
|
||
|
||
GNU `make' conforms to section 6.2 of `IEEE Standard 1003.2-1992'
|
||
(POSIX.2).
|
||
|
||
Our examples show C programs, since they are most common, but you
|
||
can use `make' with any programming language whose compiler can be run
|
||
with a shell command. Indeed, `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
|
||
|
||
|
||
File: make.info, Node: Preparing, Next: Reading, Prev: Overview, Up: Overview
|
||
|
||
Preparing and Running Make
|
||
==========================
|
||
|
||
To prepare to use `make', you must write a file called the
|
||
"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.
|
||
|
||
Once a suitable makefile exists, each time you change some source
|
||
files, this simple shell command:
|
||
|
||
make
|
||
|
||
suffices to perform all necessary recompilations. The `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 `make' to control which
|
||
files should be recompiled, or how. *Note How to Run `make': Running.
|
||
|
||
|
||
File: make.info, Node: Reading, Next: Bugs, Prev: Preparing, Up: Overview
|
||
|
||
How to Read This Manual
|
||
=======================
|
||
|
||
If you are new to `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. The exception is the second chapter, *Note An
|
||
Introduction to Makefiles: Introduction, all of which is introductory.
|
||
|
||
If you are familiar with other `make' programs, see *Note Features
|
||
of GNU `make': Features, which lists the enhancements GNU `make' has,
|
||
and *Note Incompatibilities and Missing Features: Missing, which
|
||
explains the few things GNU `make' lacks that others have.
|
||
|
||
For a quick summary, see *Note Options Summary::, *Note Quick
|
||
Reference::, and *Note Special Targets::.
|
||
|
||
|
||
File: make.info, Node: Bugs, Prev: Reading, Up: Overview
|
||
|
||
Problems and Bugs
|
||
=================
|
||
|
||
If you have problems with GNU `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 `make' gave you, including
|
||
any error or warning messages. Please don't paraphrase these messages:
|
||
it's best to cut and paste them into your report. When generating this
|
||
small makefile, be sure to not use any non-free or unusual tools in
|
||
your commands: you can almost always emulate what such a tool would do
|
||
with simple shell commands. Finally, be sure to explain what you
|
||
expected to occur; this will help us decide whether the problem was
|
||
really in the documentation.
|
||
|
||
Once you have a precise problem you can report it in one of two ways.
|
||
Either send electronic mail to:
|
||
|
||
bug-make@gnu.org
|
||
|
||
or use our Web-based project management tool, at:
|
||
|
||
http://savannah.gnu.org/projects/make/
|
||
|
||
In addition to the information above, please be careful to include the
|
||
version number of `make' you are using. You can get this information
|
||
with the command `make --version'. Be sure also to include the type of
|
||
machine and operating system you are using. One way to obtain this
|
||
information is by looking at the final lines of output from the command
|
||
`make --help'.
|
||
|
||
|
||
File: make.info, Node: Introduction, Next: Makefiles, Prev: Overview, Up: Top
|
||
|
||
An Introduction to Makefiles
|
||
****************************
|
||
|
||
You need a file called a "makefile" to tell `make' what to do. Most
|
||
often, the makefile tells `make' how to compile and link a program.
|
||
|
||
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 `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 *Note Complex Makefile::.
|
||
|
||
When `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.
|
||
|
||
* Menu:
|
||
|
||
* Rule Introduction:: What a rule looks like.
|
||
* Simple Makefile:: A Simple Makefile
|
||
* How Make Works:: How `make' Processes This Makefile
|
||
* Variables Simplify:: Variables Make Makefiles Simpler
|
||
* make Deduces:: Letting `make' Deduce the Commands
|
||
* Combine By Prerequisite:: Another Style of Makefile
|
||
* Cleanup:: Rules for Cleaning the Directory
|
||
|
||
|
||
File: make.info, Node: Rule Introduction, Next: Simple Makefile, Prev: Introduction, Up: Introduction
|
||
|
||
What a Rule Looks Like
|
||
======================
|
||
|
||
A simple makefile consists of "rules" with the following shape:
|
||
|
||
TARGET ... : PREREQUISITES ...
|
||
COMMAND
|
||
...
|
||
...
|
||
|
||
A "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 `clean' (*note
|
||
Phony Targets::).
|
||
|
||
A "prerequisite" is a file that is used as input to create the
|
||
target. A target often depends on several files.
|
||
|
||
A "command" is an action that `make' carries out. A rule may have
|
||
more than one command, each on its own line. *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 prerequisites and serves to
|
||
create a target file if any of the prerequisites change. However, the
|
||
rule that specifies commands for the target need not have
|
||
prerequisites. For example, the rule containing the delete command
|
||
associated with the target `clean' does not have prerequisites.
|
||
|
||
A "rule", then, explains how and when to remake certain files which
|
||
are the targets of the particular rule. `make' carries out the
|
||
commands on the prerequisites to create or update the target. A rule
|
||
can also explain how and when to carry out an action. *Note Writing
|
||
Rules: 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.
|
||
|
||
|
||
File: make.info, Node: Simple Makefile, Next: How Make Works, Prev: Rule Introduction, Up: Introduction
|
||
|
||
A Simple Makefile
|
||
=================
|
||
|
||
Here is a straightforward makefile that describes the way an
|
||
executable file called `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 `defs.h', but only those
|
||
defining editing commands include `command.h', and only low level files
|
||
that change the editor buffer include `buffer.h'.
|
||
|
||
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
|
||
|
||
We split each long line into two lines using backslash-newline; this is
|
||
like using one long line, but is easier to read.
|
||
|
||
To use this makefile to create the executable file called `edit',
|
||
type:
|
||
|
||
make
|
||
|
||
To use this makefile to delete the executable file and all the object
|
||
files from the directory, type:
|
||
|
||
make clean
|
||
|
||
In the example makefile, the targets include the executable file
|
||
`edit', and the object files `main.o' and `kbd.o'. The prerequisites
|
||
are files such as `main.c' and `defs.h'. In fact, each `.o' file is
|
||
both a target and a prerequisite. Commands include `cc -c main.c' and
|
||
`cc -c kbd.c'.
|
||
|
||
When a target is a file, it needs to be recompiled or relinked if any
|
||
of its prerequisites change. In addition, any prerequisites that are
|
||
themselves automatically generated should be updated first. In this
|
||
example, `edit' depends on each of the eight object files; the object
|
||
file `main.o' depends on the source file `main.c' and on the header
|
||
file `defs.h'.
|
||
|
||
A shell command follows each line that contains a target and
|
||
prerequisites. 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 `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 `make' does is execute the commands in the rule you have
|
||
specified when the target file needs to be updated.)
|
||
|
||
The target `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,
|
||
`clean' is not a prerequisite of any other rule. Consequently, `make'
|
||
never does anything with it unless you tell it specifically. Note that
|
||
this rule not only is not a prerequisite, it also does not have any
|
||
prerequisites, so the only purpose of the rule is to run the specified
|
||
commands. Targets that do not refer to files but are just actions are
|
||
called "phony targets". *Note Phony Targets::, for information about
|
||
this kind of target. *Note Errors in Commands: Errors, to see how to
|
||
cause `make' to ignore errors from `rm' or any other command.
|
||
|
||
|
||
File: make.info, Node: How Make Works, Next: Variables Simplify, Prev: Simple Makefile, Up: Introduction
|
||
|
||
How `make' Processes a Makefile
|
||
===============================
|
||
|
||
By default, `make' starts with the first target (not targets whose
|
||
names start with `.'). This is called the "default goal". ("Goals"
|
||
are the targets that `make' strives ultimately to update. *Note
|
||
Arguments to Specify the Goals: Goals.)
|
||
|
||
In the simple example of the previous section, the default goal is to
|
||
update the executable program `edit'; therefore, we put that rule first.
|
||
|
||
Thus, when you give the command:
|
||
|
||
make
|
||
|
||
`make' reads the makefile in the current directory and begins by
|
||
processing the first rule. In the example, this rule is for relinking
|
||
`edit'; but before `make' can fully process this rule, it must process
|
||
the rules for the files that `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 `.o' file by compiling its
|
||
source file. The recompilation must be done if the source file, or any
|
||
of the header files named as prerequisites, is more recent than the
|
||
object file, or if the object file does not exist.
|
||
|
||
The other rules are processed because their targets appear as
|
||
prerequisites of the goal. If some other rule is not depended on by the
|
||
goal (or anything it depends on, etc.), that rule is not processed,
|
||
unless you tell `make' to do so (with a command such as `make clean').
|
||
|
||
Before recompiling an object file, `make' considers updating its
|
||
prerequisites, the source file and header files. This makefile does not
|
||
specify anything to be done for them--the `.c' and `.h' files are not
|
||
the targets of any rules--so `make' does nothing for these files. But
|
||
`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, `make' decides
|
||
whether to relink `edit'. This must be done if the 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 `edit', so `edit'
|
||
is relinked.
|
||
|
||
Thus, if we change the file `insert.c' and run `make', `make' will
|
||
compile that file to update `insert.o', and then link `edit'. If we
|
||
change the file `command.h' and run `make', `make' will recompile the
|
||
object files `kbd.o', `command.o' and `files.o' and then link the file
|
||
`edit'.
|
||
|
||
|
||
File: make.info, Node: Variables Simplify, Next: make Deduces, Prev: How Make Works, Up: Introduction
|
||
|
||
Variables Make Makefiles Simpler
|
||
================================
|
||
|
||
In our example, we had to list all the object files twice in the
|
||
rule for `edit' (repeated here):
|
||
|
||
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
|
||
|
||
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.
|
||
"Variables" allow a text string to be defined once and substituted in
|
||
multiple places later (*note How to Use Variables: Using Variables.).
|
||
|
||
It is standard practice for every makefile to have a variable named
|
||
`objects', `OBJECTS', `objs', `OBJS', `obj', or `OBJ' which is a list
|
||
of all object file names. We would define such a variable `objects'
|
||
with a line like this in the makefile:
|
||
|
||
objects = main.o kbd.o command.o display.o \
|
||
insert.o search.o files.o utils.o
|
||
|
||
Then, each place we want to put a list of the object file names, we can
|
||
substitute the variable's value by writing `$(objects)' (*note How to
|
||
Use Variables: Using Variables.).
|
||
|
||
Here is how the complete simple makefile looks when you use a
|
||
variable for the object files:
|
||
|
||
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)
|
||
|
||
|
||
File: make.info, Node: make Deduces, Next: Combine By Prerequisite, Prev: Variables Simplify, Up: Introduction
|
||
|
||
Letting `make' Deduce the Commands
|
||
==================================
|
||
|
||
It is not necessary to spell out the commands for compiling the
|
||
individual C source files, because `make' can figure them out: it has an
|
||
"implicit rule" for updating a `.o' file from a correspondingly named
|
||
`.c' file using a `cc -c' command. For example, it will use the
|
||
command `cc -c main.c -o main.o' to compile `main.c' into `main.o'. We
|
||
can therefore omit the commands from the rules for the object files.
|
||
*Note Using Implicit Rules: Implicit Rules.
|
||
|
||
When a `.c' file is used automatically in this way, it is also
|
||
automatically added to the list of prerequisites. We can therefore omit
|
||
the `.c' files from the prerequisites, provided we omit the commands.
|
||
|
||
Here is the entire example, with both of these changes, and a
|
||
variable `objects' as suggested above:
|
||
|
||
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)
|
||
|
||
This is how we would write the makefile in actual practice. (The
|
||
complications associated with `clean' are described elsewhere. See
|
||
*Note Phony Targets::, and *Note Errors in Commands: Errors.)
|
||
|
||
Because implicit rules are so convenient, they are important. You
|
||
will see them used frequently.
|
||
|
||
|
||
File: make.info, Node: Combine By Prerequisite, Next: Cleanup, Prev: make Deduces, Up: Introduction
|
||
|
||
Another Style of Makefile
|
||
=========================
|
||
|
||
When the objects of a makefile are created only by implicit rules, an
|
||
alternative style of makefile is possible. In this style of makefile,
|
||
you group entries by their prerequisites instead of by their targets.
|
||
Here is what one looks like:
|
||
|
||
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
|
||
|
||
Here `defs.h' is given as a prerequisite of all the object files;
|
||
`command.h' and `buffer.h' are prerequisites of the specific object
|
||
files listed for them.
|
||
|
||
Whether this is better is a matter of taste: it is more compact, but
|
||
some people dislike it because they find it clearer to put all the
|
||
information about each target in one place.
|
||
|
||
|
||
File: make.info, Node: Cleanup, Prev: Combine By Prerequisite, Up: Introduction
|
||
|
||
Rules for Cleaning the Directory
|
||
================================
|
||
|
||
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 `clean'.
|
||
|
||
Here is how we could write a `make' rule for cleaning our example
|
||
editor:
|
||
|
||
clean:
|
||
rm edit $(objects)
|
||
|
||
In practice, we might want to write the rule in a somewhat more
|
||
complicated manner to handle unanticipated situations. We would do
|
||
this:
|
||
|
||
.PHONY : clean
|
||
clean :
|
||
-rm edit $(objects)
|
||
|
||
This prevents `make' from getting confused by an actual file called
|
||
`clean' and causes it to continue in spite of errors from `rm'. (See
|
||
*Note Phony Targets::, and *Note Errors in Commands: Errors.)
|
||
|
||
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 `edit', which recompiles the
|
||
editor, to remain the default goal.
|
||
|
||
Since `clean' is not a prerequisite of `edit', this rule will not
|
||
run at all if we give the command `make' with no arguments. In order
|
||
to make the rule run, we have to type `make clean'. *Note How to Run
|
||
`make': Running.
|
||
|
||
|
||
File: make.info, Node: Makefiles, Next: Rules, Prev: Introduction, Up: Top
|
||
|
||
Writing Makefiles
|
||
*****************
|
||
|
||
The information that tells `make' how to recompile a system comes
|
||
from reading a data base called the "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.
|
||
* MAKEFILE_LIST Variable:: Discover which makefiles have been read.
|
||
* Special Variables:: Other special variables.
|
||
* Remaking Makefiles:: How makefiles get remade.
|
||
* Overriding Makefiles:: How to override part of one makefile
|
||
with another makefile.
|
||
* Reading Makefiles:: How makefiles are parsed.
|
||
|
||
|
||
File: make.info, Node: Makefile Contents, Next: Makefile Names, Prev: Makefiles, Up: Makefiles
|
||
|
||
What Makefiles Contain
|
||
======================
|
||
|
||
Makefiles contain five kinds of things: "explicit rules", "implicit
|
||
rules", "variable definitions", "directives", and "comments". Rules,
|
||
variables, and directives are described at length in later chapters.
|
||
|
||
* An "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 depend on, call the "prerequisites" of the target, and may
|
||
also give commands to use to create or update the targets. *Note
|
||
Writing Rules: Rules.
|
||
|
||
* An "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. *Note Using Implicit Rules:
|
||
Implicit Rules.
|
||
|
||
* A "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
|
||
`objects' as a list of all object files (*note Variables Make
|
||
Makefiles Simpler: Variables Simplify.).
|
||
|
||
* A "directive" is a command for `make' to do something special while
|
||
reading the makefile. These include:
|
||
|
||
* Reading another makefile (*note Including Other Makefiles:
|
||
Include.).
|
||
|
||
* Deciding (based on the values of variables) whether to use or
|
||
ignore a part of the makefile (*note Conditional Parts of
|
||
Makefiles: Conditionals.).
|
||
|
||
* Defining a variable from a verbatim string containing
|
||
multiple lines (*note Defining Variables Verbatim: Defining.).
|
||
|
||
* `#' in a line of a makefile starts a "comment". It and the rest
|
||
of the line are ignored, except that a trailing backslash not
|
||
escaped by another backslash will continue the comment across
|
||
multiple lines. A line containing just a comment (with perhaps
|
||
spaces before it) is effectively blank, and is ignored. If you
|
||
want a literal `#', escape it with a backslash (e.g., `\#').
|
||
Comments may appear on any line in the makefile, although they are
|
||
treated specially in certain situations.
|
||
|
||
Within a command script (if the line begins with a TAB character)
|
||
the entire line is passed to the shell, just as with any other
|
||
line that begins with a TAB. The shell decides how to interpret
|
||
the text: whether or not this is a comment is up to the shell.
|
||
|
||
Within a `define' directive, comments are not ignored during the
|
||
definition of the variable, but rather kept intact in the value of
|
||
the variable. When the variable is expanded they will either be
|
||
treated as `make' comments or as command script text, depending on
|
||
the context in which the variable is evaluated.
|
||
|
||
|
||
File: make.info, Node: Makefile Names, Next: Include, Prev: Makefile Contents, Up: Makefiles
|
||
|
||
What Name to Give Your Makefile
|
||
===============================
|
||
|
||
By default, when `make' looks for the makefile, it tries the
|
||
following names, in order: `GNUmakefile', `makefile' and `Makefile'.
|
||
|
||
Normally you should call your makefile either `makefile' or
|
||
`Makefile'. (We recommend `Makefile' because it appears prominently
|
||
near the beginning of a directory listing, right near other important
|
||
files such as `README'.) The first name checked, `GNUmakefile', is not
|
||
recommended for most makefiles. You should use this name if you have a
|
||
makefile that is specific to GNU `make', and will not be understood by
|
||
other versions of `make'. Other `make' programs look for `makefile' and
|
||
`Makefile', but not `GNUmakefile'.
|
||
|
||
If `make' finds none of these names, it does not use any makefile.
|
||
Then you must specify a goal with a command argument, and `make' will
|
||
attempt to figure out how to remake it using only its built-in implicit
|
||
rules. *Note Using Implicit Rules: Implicit Rules.
|
||
|
||
If you want to use a nonstandard name for your makefile, you can
|
||
specify the makefile name with the `-f' or `--file' option. The
|
||
arguments `-f NAME' or `--file=NAME' tell `make' to read the file NAME
|
||
as the makefile. If you use more than one `-f' or `--file' option, you
|
||
can specify several makefiles. All the makefiles are effectively
|
||
concatenated in the order specified. The default makefile names
|
||
`GNUmakefile', `makefile' and `Makefile' are not checked automatically
|
||
if you specify `-f' or `--file'.
|
||
|
||
|
||
File: make.info, Node: Include, Next: MAKEFILES Variable, Prev: Makefile Names, Up: Makefiles
|
||
|
||
Including Other Makefiles
|
||
=========================
|
||
|
||
The `include' directive tells `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:
|
||
|
||
include FILENAMES...
|
||
|
||
FILENAMES can contain shell file name patterns.
|
||
|
||
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 `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 `#' is
|
||
allowed at the end of the line. If the file names contain any variable
|
||
or function references, they are expanded. *Note How to Use Variables:
|
||
Using Variables.
|
||
|
||
For example, if you have three `.mk' files, `a.mk', `b.mk', and
|
||
`c.mk', and `$(bar)' expands to `bish bash', then the following
|
||
expression
|
||
|
||
include foo *.mk $(bar)
|
||
|
||
is equivalent to
|
||
|
||
include foo a.mk b.mk c.mk bish bash
|
||
|
||
When `make' processes an `include' directive, it suspends reading of
|
||
the containing makefile and reads from each listed file in turn. When
|
||
that is finished, `make' resumes reading the makefile in which the
|
||
directive appears.
|
||
|
||
One occasion for using `include' directives is when several programs,
|
||
handled by individual makefiles in various directories, need to use a
|
||
common set of variable definitions (*note Setting Variables: Setting.)
|
||
or pattern rules (*note Defining and Redefining Pattern Rules: Pattern
|
||
Rules.).
|
||
|
||
Another such occasion is when you want to generate prerequisites from
|
||
source files automatically; the prerequisites can be put in a file that
|
||
is included by the main makefile. This practice is generally cleaner
|
||
than that of somehow appending the prerequisites to the end of the main
|
||
makefile as has been traditionally done with other versions of `make'.
|
||
*Note Automatic Prerequisites::.
|
||
|
||
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 `-I' or
|
||
`--include-dir' option are searched (*note Summary of Options: Options
|
||
Summary.). Then the following directories (if they exist) are
|
||
searched, in this order: `PREFIX/include' (normally `/usr/local/include'
|
||
(1)) `/usr/gnu/include', `/usr/local/include', `/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 `include' continues.
|
||
Once it has finished reading makefiles, `make' will try to remake any
|
||
that are out of date or don't exist. *Note How Makefiles Are Remade:
|
||
Remaking Makefiles. Only after it has tried to find a way to remake a
|
||
makefile and failed, will `make' diagnose the missing makefile as a
|
||
fatal error.
|
||
|
||
If you want `make' to simply ignore a makefile which does not exist
|
||
and cannot be remade, with no error message, use the `-include'
|
||
directive instead of `include', like this:
|
||
|
||
-include FILENAMES...
|
||
|
||
This acts like `include' in every way except that there is no error
|
||
(not even a warning) if any of the FILENAMES do not exist. For
|
||
compatibility with some other `make' implementations, `sinclude' is
|
||
another name for `-include'.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) GNU Make compiled for MS-DOS and MS-Windows behaves as if PREFIX
|
||
has been defined to be the root of the DJGPP tree hierarchy.
|
||
|
||
|
||
File: make.info, Node: MAKEFILES Variable, Next: MAKEFILE_LIST Variable, Prev: Include, Up: Makefiles
|
||
|
||
The Variable `MAKEFILES'
|
||
========================
|
||
|
||
If the environment variable `MAKEFILES' is defined, `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
|
||
`include' directive: various directories are searched for those files
|
||
(*note Including Other Makefiles: Include.). In addition, the default
|
||
goal is never taken from one of these makefiles and it is not an error
|
||
if the files listed in `MAKEFILES' are not found.
|
||
|
||
The main use of `MAKEFILES' is in communication between recursive
|
||
invocations of `make' (*note Recursive Use of `make': Recursion.). It
|
||
usually is not desirable to set the environment variable before a
|
||
top-level invocation of `make', because it is usually better not to
|
||
mess with a makefile from outside. However, if you are running `make'
|
||
without a specific makefile, a makefile in `MAKEFILES' can do useful
|
||
things to help the built-in implicit rules work better, such as
|
||
defining search paths (*note Directory Search::).
|
||
|
||
Some users are tempted to set `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 `include'
|
||
directives in the makefiles. *Note Including Other Makefiles: Include.
|
||
|
||
|
||
File: make.info, Node: MAKEFILE_LIST Variable, Next: Special Variables, Prev: MAKEFILES Variable, Up: Makefiles
|
||
|
||
The Variable `MAKEFILE_LIST'
|
||
============================
|
||
|
||
As `make' reads various makefiles, including any obtained from the
|
||
`MAKEFILES' variable, the command line, the default files, or from
|
||
`include' directives, their names will be automatically appended to the
|
||
`MAKEFILE_LIST' variable. They are added right before `make' begins to
|
||
parse them.
|
||
|
||
This means that if the first thing a makefile does is examine the
|
||
last word in this variable, it will be the name of the current makefile.
|
||
Once the current makefile has used `include', however, the last word
|
||
will be the just-included makefile.
|
||
|
||
If a makefile named `Makefile' has this content:
|
||
|
||
name1 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
||
|
||
include inc.mk
|
||
|
||
name2 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
||
|
||
all:
|
||
@echo name1 = $(name1)
|
||
@echo name2 = $(name2)
|
||
|
||
then you would expect to see this output:
|
||
|
||
name1 = Makefile
|
||
name2 = inc.mk
|
||
|
||
*Note Text Functions::, for more information on the `word' and
|
||
`words' functions used above. *Note The Two Flavors of Variables:
|
||
Flavors, for more information on simply-expanded (`:=') variable
|
||
definitions.
|
||
|
||
|
||
File: make.info, Node: Special Variables, Next: Remaking Makefiles, Prev: MAKEFILE_LIST Variable, Up: Makefiles
|
||
|
||
Other Special Variables
|
||
=======================
|
||
|
||
GNU `make' also supports a special variable. Note that any value
|
||
you assign to this variable will be ignored; it will always return its
|
||
special value.
|
||
|
||
The first special variable is `.VARIABLES'. When expanded, the
|
||
value consists of a list of the _names_ of all global variables defined
|
||
in all makefiles read up until that point. This includes variables
|
||
which have empty values, as well as built-in variables (*note Variables
|
||
Used by Implicit Rules: Implicit Variables.), but does not include any
|
||
variables which are only defined in a target-specific context.
|
||
|