| \input texinfo @c -*- Texinfo -*- | |
| @setfilename make.info | |
| @synindex vr fn | |
| @c $Header$ | |
| @ifinfo | |
| This file documents the GNU Make utility. | |
| Copyright (C) 1988 Free Software Foundation, Inc. | |
| Permission is granted to make and distribute verbatim copies of | |
| this manual provided the copyright notice and this permission notice | |
| are preserved on all copies. | |
| @ignore | |
| Permission is granted to process this file through TeX and print the | |
| results, provided the printed document carries copying permission | |
| notice identical to this one except for the removal of this paragraph | |
| (this paragraph not being relevant to the printed manual). | |
| @end ignore | |
| Permission is granted to copy and distribute modified versions of this | |
| manual under the conditions for verbatim copying, provided that the entire | |
| resulting derived work is distributed under the terms of a permission | |
| notice identical to this one. | |
| Permission is granted to copy and distribute translations of this manual | |
| into another language, under the above conditions for modified versions. | |
| @end ifinfo | |
| @c | |
| @setchapternewpage odd | |
| @settitle Make | |
| @titlepage | |
| @sp 6 | |
| @center @titlefont{GNU Make} | |
| @sp 1 | |
| @center A Program for Directing Recompilation | |
| @sp 2 | |
| @center April 1988 | |
| @sp 5 | |
| @center Richard M. Stallman, Roland McGrath | |
| @page | |
| @vskip 0pt plus 1filll | |
| Copyright @copyright{} 1988 Free Software Foundation, Inc. | |
| Permission is granted to make and distribute verbatim copies of | |
| this manual provided the copyright notice and this permission notice | |
| are preserved on all copies. | |
| Permission is granted to copy and distribute modified versions of this | |
| manual under the conditions for verbatim copying, provided that the entire | |
| resulting derived work is distributed under the terms of a permission | |
| notice identical to this one. | |
| Permission is granted to copy and distribute translations of this manual | |
| into another language, under the above conditions for modified versions. | |
| @end titlepage | |
| @page | |
| @node Top, Bugs,, (DIR) | |
| @chapter Overview of @code{make} | |
| The purpose of the @code{make} utility is to determine automatically which | |
| pieces of a large program need to be recompiled, and issue the commands to | |
| recompile them. This manual describes the GNU implementation of | |
| @code{make}, which was implemented by Richard Stallman and Roland McGrath. | |
| Our examples show C programs, since they are most common, but you can use | |
| @code{make} with any programming language whose compiler can be run with a | |
| shell command. In fact, @code{make} is not limited to programs. You can | |
| use it to describe any task where some files must be updated automatically | |
| from others whenever the others change. | |
| To prepare to use @code{make}, you must write a file called | |
| the @dfn{makefile} that describes the relationships among files | |
| in your program, and the states the commands for updating each file. | |
| In a program, typically the executable file is updated from object | |
| files, which are in turn made by compiling source files.@refill | |
| Once a suitable makefile exists, each time you change some source files, | |
| this simple shell command: | |
| @example | |
| make | |
| @end example | |
| @noindent | |
| suffices to perform all necessary recompilations. The @code{make} program | |
| uses the makefile data base and the last-modification times of the files to | |
| decide which of the files need to be updated. For each of those files, it | |
| issues the commands recorded in the data base. | |
| @iftex | |
| Command arguments to @code{make} can be used to control which files should | |
| be recompiled, or how. @xref{Running}. | |
| @end iftex | |
| @menu | |
| * Bugs:: If you have problems, or think you've found a bug. | |
| * Simple:: A simple example explained. | |
| * Makefiles:: The data base contains rules and variable definitions. | |
| * Rules:: A rule says how and when to remake one file. | |
| * Commands:: A rule contains shell commands that say how to remake. | |
| * Variables:: A variable holds a text string for substitution into rules. | |
| * Conditionals::Makefiles that do one thing or another depending on | |
| variable values. | |
| * Functions:: Functions can do text-processing within @code{make}. | |
| * Running:: How to run @code{make}; how you can adjust the way | |
| @code{make} uses the makefile. | |
| * Implicit:: Implicit rules take over if the makefile doesn't say | |
| how a file is to be remade. | |
| * Archives:: How to use @code{make} to update archive files. | |
| * Features:: GNU @code{make}'s advanced features and how GNU @code{make} | |
| relates to other versions of @code{make}. | |
| * Missing:: Features of other @code{make}s not supported | |
| by GNU @code{make}. | |
| * Concept Index::Index of cross-references to where concepts are discussed. | |
| * Name Index:: Index of cross-references for names of @code{make}'s | |
| variables, functions, special targets and directives. | |
| @end menu | |
| @node Bugs, Simple, Top, Top | |
| @section Problems and Bugs | |
| If you have problems with GNU @code{make} or think you've found a bug, | |
| please report it to Roland McGrath; he doesn't promise to do anything | |
| but he might well want to fix it. | |
| Before reporting a bug, make sure you've actually found a real bug. | |
| Carefully re-read the documentation and see if it really says you can do | |
| what you're trying to do. If it's not clear whether you should be able | |
| to do something or not, report that too; it's a bug in the documentation! | |
| Before reporting a bug or trying to fix it yourself, try to isolate it to | |
| the smallest possible makefile that reproduces the problem. Then send | |
| us the makefile and the exact results @code{make} gave you. Also say what | |
| you expected to occur; this will help us decide whether the problem | |
| was really in the documentation. | |
| Once you've got a precise problem, send email to (Internet) | |
| @samp{bug-gnu-utils@@prep.ai.mit.edu} or (UUCP) | |
| @samp{mit-eddie!prep.ai.mit.edu!bug-gnu-utils}. Please include the version | |
| number of @code{make} you are using. You can get this information with the | |
| command @samp{make -v -f /dev/null}.@refill | |
| Non-bug suggestions are always welcome as well. | |
| If you have questions about things that are unclear in the documentation | |
| or are just obscure features, ask Roland McGrath; he'll be happy to help | |
| you out (but no promises). You can send him electronic mail at Internet | |
| address @samp{roland@@wheaties.ai.mit.edu} or UUCP path | |
| @samp{mit-eddie!wheaties.ai.mit.edu!roland}. | |
| @node Simple, Makefiles, Bugs, Top | |
| @section Simple Example of @code{make} | |
| Suppose we have a text editor consisting of eight C source files and three | |
| header files. We need a makefile to tell @code{make} how to compile and | |
| link the editor. Assume that all the C files include @file{defs.h}, but | |
| only those defining editing commands include @file{commands.h} and only low | |
| level files that change the editor buffer include @file{buffer.h}. | |
| To recompile the editor, each changed C source file must be recompiled. If | |
| a header file has changed, to be safe each C source file that | |
| includes the header file must be recompiled. Each compilation produces an | |
| object file corresponding to the source file. Finally, if any source file | |
| has been recompiled, all the object files, whether newly made or saved from | |
| previous compilations, must be linked together to produce the new | |
| executable editor. | |
| Here is a straightforward makefile that describes these criteria and says | |
| how to compile and link when the time comes: | |
| @example | |
| edit : main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| cc -o edit main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| main.o : main.c defs.h | |
| cc -c main.c | |
| kbd.o : kbd.c defs.h command.h | |
| cc -c kbd.c | |
| commands.o : command.c defs.h command.h | |
| cc -c commands.c | |
| display.o : display.c defs.h buffer.h | |
| cc -c display.c | |
| insert.o : insert.c defs.h buffer.h | |
| cc -c insert.c | |
| search.o : search.c defs.h buffer.h | |
| cc -c search.c | |
| files.o : files.c defs.h buffer.h command.h | |
| cc -c files.c | |
| utils.o : utils.c defs.h | |
| cc -c utils.c | |
| @end example | |
| We split each long line into two lines using a backslash-newline; this is | |
| like using one long line, but is easier to read. | |
| Each file that is generated by a program---that is to say, each file except | |
| for source files---is the @dfn{target} of a @dfn{rule} (@pxref{Rules}). | |
| (In this example, these are the object files such as @file{main.o}, | |
| @file{kbd.o}, etc., and the executable file @file{edit}.) The target | |
| appears at the beginning of a line, followed by a colon. | |
| After the colon come the target's @dfn{dependencies}: all the files that | |
| are used as input when the target file is updated. A target file needs to | |
| be recompiled or relinked if any of its dependencies changes. In addition, | |
| any dependencies that are themselves automatically generated should be | |
| updated first. In this example, @file{edit} depends on each of the eight | |
| object files; the object file @file{main.o} depends on the source file | |
| @file{main.c} and on the header file @file{defs.h}. | |
| By default, @code{make} starts with the first rule (not counting rules | |
| whose target names start with @samp{.}). This is called the @dfn{default | |
| goal}. Therefore, we put the rule for the executable program @file{edit} | |
| first. The other rules are processed because their targets appear as | |
| dependencies of the goal. | |
| After each line containing a target and dependencies come one or more lines | |
| of shell commands that say how to update the target file. These lines | |
| start with a tab to tell @code{make} that they are command lines. But | |
| @code{make} does not know anything about how the commands work. It is up | |
| to you to supply commands that will update the target file properly. | |
| All @code{make} does is execute the commands you have specified when the | |
| target file needs to be updated. | |
| @subsection How @code{make} Processes This Makefile | |
| After reading the makefile, @code{make} begins its real work by processing | |
| the first rule, the one for relinking @file{edit}; but before it can fully | |
| process this rule, it must process the rules for the files @file{edit} | |
| depends on: all the object files. Each of these files is processed | |
| according to its own rule. These rules say to update the @samp{.o} file by | |
| compiling its source file. The recompilation must be done if the source | |
| file, or any of the header files named as dependencies, is more recent than | |
| the object file, or if the object file does not exist. | |
| Before recompiling an object file, @code{make} considers updating its | |
| dependencies, the source file and header files. This makefile does not | |
| specify anything to be done for them---the @samp{.c} and @samp{.h} files | |
| are not the targets of any rules---so nothing needs to be done. But | |
| automatically generated C programs, such as made by Yacc (or Bison), would | |
| be updated by their own rules at this time. | |
| After recompiling whichever object files need it, @code{make} can now | |
| decide whether to relink @file{edit}. This must be done if the file | |
| @file{edit} does not exist, or if any of the object files are newer than | |
| it. If an object file was just recompiled, it is now newer than | |
| @file{edit}, so @file{edit} will be relinked. | |
| @subsection Variables Make Makefiles Simpler | |
| In our example, we had to list all the object files twice in the rule for | |
| @file{edit} (repeated here): | |
| @example | |
| edit : main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| cc -o edit main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| @end example | |
| @vindex objects | |
| Such duplication is error-prone; if a new object file is added to the | |
| system, we might add it to one list and forget the other. We can eliminate | |
| the risk and simplify the makefile by using a @dfn{variable}. Variables | |
| allow a text string to be defined once and substituted in multiple places | |
| later (@pxref{Variables}). | |
| It's standard practice for every makefile to have a variable named | |
| @code{objects}, @code{OBJECTS}, @code{objs}, @code{OBJS}, @code{obj} or | |
| @code{OBJ} which is a list of all object file names. We would define | |
| such a variable @code{objects} with a line like this in the makefile:@refill | |
| @example | |
| objects = main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| @end example | |
| @noindent | |
| Then, each place we want to put a list of the object file names, we can | |
| substitute the variable's value by writing @samp{$(objects)} | |
| (@pxref{Variables}). Here is how the rule for @code{edit} looks as a | |
| result: | |
| @example | |
| edit : $(objects) | |
| cc -o edit $(objects) | |
| @end example | |
| @subsection Letting @code{make} Deduce the Commands | |
| It is not necessary to spell out the commands for compiling the individual | |
| C source files, because @code{make} can figure them out: it has an | |
| @dfn{implicit rule} for updating a @samp{.o} file from a correspondingly | |
| named @samp{.c} file using a @samp{cc -c} command. For example, it will | |
| use the command @samp{cc -c main.c -o main.o} to compile @file{main.c} into | |
| @file{main.o}. We can therefore omit the commands from the rules for the | |
| object files. @xref{Implicit}.@refill | |
| When a @samp{.c} file is used automatically in this way, it is also | |
| automatically added to the list of dependencies. We can therefore omit | |
| the @samp{.c} files from the dependencies, provided we omit the commands. | |
| Here is the entire example, with both of these changes, and a variable | |
| @code{objects} as suggested above: | |
| @example | |
| objects = main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| edit : $(objects) | |
| cc -o edit $(objects) | |
| main.o : defs.h | |
| kbd.o : defs.h command.h | |
| commands.o : defs.h command.h | |
| display.o : defs.h buffer.h | |
| insert.o : defs.h buffer.h | |
| search.o : defs.h buffer.h | |
| files.o : defs.h buffer.h command.h | |
| utils.o : defs.h | |
| @end example | |
| @noindent | |
| This is how we would write the makefile in actual practice. | |
| @subsection Another Style of Makefile | |
| Since the rules for the object files specify only dependencies, no | |
| commands, one can alternatively combine them by dependency instead of by | |
| target. Here is what it looks like: | |
| @example | |
| objects = main.o kbd.o commands.o display.o \ | |
| insert.o search.o files.o utils.o | |
| edit : $(objects) | |
| cc -o edit $(objects) | |
| $(objects) : defs.h | |
| kbd.o commands.o files.o : command.h | |
| display.o insert.o search.o files.o : buffer.h | |
| @end example | |
| @noindent | |
| Here @file{defs.h} is given as a dependency of all the object files; | |
| @file{commands.h} and @file{buffer.h} are dependencies of the specific | |
| object files listed for them. | |
| Whether this is better is a matter of taste: it is more compact, but some | |
| people dislike it because they find it clearer to put all the information | |
| about each target in one place. | |
| @node Makefiles, Rules, Simple, Top | |
| @chapter Writing Makefiles | |
| @cindex makefile | |
| The information that tells @code{make} how to recompile a system comes from | |
| reading a data base called the @dfn{makefile}. | |
| @menu | |
| * Contents: Makefile Contents. Overview of what you put in a makefile. | |
| * Names: Makefile Names. Where @code{make} finds the makefile. | |
| * MAKEFILES Variable:: The environment can specify extra makefiles. | |
| * Include:: How one makefile can use another makefile. | |
| @end menu | |
| @node Makefile Contents, Makefile Names, Makefiles, Makefiles | |
| @section What Makefiles Contain | |
| Makefiles contain four kinds of things: @dfn{rules}, @dfn{variable | |
| definitions}, @dfn{directives} and @dfn{comments}. Rules, variables and | |
| directives are described at length in later chapters.@refill | |
| @itemize @bullet | |
| @item | |
| A rule says when and how to remake one or more files, called the rule's | |
| @dfn{targets}. It lists the other files that the targets @dfn{depend on}, | |
| and may also give commands to use to create or update the targets. | |
| @xref{Rules}. | |
| @item | |
| A variable definition is a line that specifies a text string value for | |
| a @dfn{variable} that can be substituted into the text later. The | |
| simple makefile example (@pxref{Simple}) shows a variable definition | |
| for @code{objects} as a list of all object files. @xref{Variables}, | |
| for full details. | |
| @item | |
| A directive is a command for @code{make} to do something special while | |
| reading the makefile. These include: | |
| @itemize @bullet | |
| @item | |
| Reading another makefile (@pxref{Include}). | |
| @item | |
| Deciding (based on the values of variables) whether to use or | |
| ignore a part of the makefile (@pxref{Conditionals}). | |
| @item | |
| Defining a variable from a verbatim string containing multiple lines | |
| (@pxref{Defining}). | |
| @end itemize | |
| @item | |
| @cindex comments | |
| @samp{#} in a line of a makefile starts a comment. It and the rest of | |
| the line are ignored. Comments may appear on any of the lines in the | |
| makefile, except within a @code{define} directive, and perhaps within | |
| commands (where the shell decides what is a comment). A line | |
| containing just a comment (with perhaps spaces before it) is | |
| effectively blank, and is ignored. | |
| @end itemize | |
| @node Makefile Names, MAKEFILES Variable, Makefile Contents, Makefiles | |
| @section What Name to Give Your Makefile | |
| By default, when @code{make} looks for the makefile, it tries the names | |
| @file{./makefile} and @file{./Makefile} in that order. So normally you call | |
| your makefile by one of these two names, and @code{make} finds it | |
| automatically. We recommend @file{Makefile} because it appears prominently | |
| near the beginning of a directory listing (right near other important | |
| files such as @file{README}).@refill | |
| If @code{make} finds neither of these two names, it does not use any | |
| makefile. Then you must specify a goal with a command argument, and | |
| @code{make} will attempt to figure out how to remake it using only its | |
| built-in implicit rules. @xref{Implicit}. | |
| If you want to use a nonstandard name for your makefile, you can specify | |
| the makefile name with the @samp{-f} option. The arguments @samp{-f | |
| @var{name}} tell @code{make} to read the file @var{name} as the makefile. | |
| If you use more than one @samp{-f} option, you can specify several | |
| makefiles. All the makefiles are effectively concatenated in the order | |
| specified. The default makefile names @file{./makefile} and | |
| @file{./Makefile} are not used if you specify @samp{-f}.@refill | |
| @node MAKEFILES Variable, Include, Makefile Names, Makefiles | |
| @section The Variable @code{MAKEFILES} | |
| @vindex MAKEFILES | |
| If the environment variable @code{MAKEFILES} is defined, @code{make} | |
| considers its value as a list of names (separated by whitespace) of | |
| additional makefiles to be read before the others. This works much like | |
| the @code{include} directive: various directories are searched for those | |
| files and the default goal is never taken from them. @xref{Include}. In | |
| addition, it is not an error if the files listed in @code{MAKEFILES} are | |
| not found.@refill | |
| The main use of @code{MAKEFILES} is in communication between recursive | |
| invocations of @code{make} (@pxref{Recursion}). It usually isn't | |
| desirable to set the environment variable before a top-level invocation | |
| of @code{make}, because it is usually better not to mess with a makefile | |
| from outside. However, if you are running @code{make} without a specific | |
| makefile, a makefile in @code{MAKEFILES} can do useful things to help the | |
| built-in implicit rules work better, such as defining search paths. | |
| Some users are tempted to set @code{MAKEFILES} in the environment | |
| automatically on login, and program makefiles to expect this to be done. | |
| This is a very bad idea, because such makefiles will fail to work if run by | |
| anyone else. It is much better to write explicit @code{include} directives | |
| in the makefiles. | |
| @node Include,, MAKEFILES Variable, Makefiles | |
| @section Including Other Makefiles | |
| @findex include | |
| The @code{include} directive tells @code{make} to suspend reading the | |
| current makefile and read another makefile before continuing. The | |
| directive is a line in the makefile that looks like this: | |
| @example | |
| include @var{filename} | |
| @end example | |
| Extra spaces are allowed and ignored at the beginning of the line, but a | |
| tab is not allowed. (If the line begins with a tab, it will be considered | |
| a command line.) Whitespace is required between @code{include} and | |
| @var{filename}; extra whitespace is ignored there and at the end of the | |
| directive. A comment starting with @samp{#} is allowed at the end of the | |
| line. | |
| Reading of the containing makefile is temporarily suspended while the file | |
| @var{filename} is read as a makefile. When that is finished, @code{make} | |
| goes on with reading the makefile in which the directive appears. | |
| The default goal target is never taken from an included makefile | |
| (@pxref{Goals}). | |
| One occasion for using @code{include} directives is when several programs, | |
| handled by individual makefiles in various directories, need to use a | |
| common set of variable definitions (@pxref{Setting}) or pattern rules | |
| (@pxref{Pattern Rules}). | |
| Another such occasion is when you want to automatically generate | |
| dependencies from source files; the dependencies can be put in a file that | |
| is included by the main makefile. This practice is generally cleaner than | |
| that of somehow appending the dependencies to the end of the main makefile | |
| as has been traditionally done with other versions of @code{make}. | |
| If the specified name does not start with a slash, and the file is not | |
| found in the current directory, several other directories are searched. | |
| First, any directories you have specified with the @samp{-I} option are | |
| searched (@pxref{Options}). Then the following directories (if they | |
| exist) are searched, in this order: @file{/usr/gnu/include}, | |
| @file{/usr/local/include}, @file{/usr/include}. | |
| If an included makefile cannot be found in any of these directories, a | |
| warning message is generated, but it is not a fatal error.@refill | |
| @node Rules, Commands, Makefiles, Top | |
| @chapter Writing Rules | |
| @cindex rule | |
| @cindex target | |
| @cindex dependency | |
| A @dfn{rule} appears in the makefile and says when and how to remake | |
| certain files, called the rule's @dfn{targets} (usually only one per rule). | |
| It lists the other files that are the @dfn{dependencies} of the target, and | |
| @dfn{commands} to use to create or update the target. | |
| The order of rules is not significant, except for determining the | |
| @dfn{default goal}: the target for @code{make} to consider, if you do not | |
| otherwise specify one. The default goal comes from the first rule (not | |
| counting included makefiles) whose target does not start with a period. | |
| Therefore, the first rule is normally one for compiling the entire program | |
| or all the programs described by the makefile. @xref{Goals}. | |
| @menu | |
| * Rule Example:: An explained example of a rule. | |
| * Rule Syntax:: General syntax of rules, with explanation. | |
| * Wildcards:: Using wildcard characters like `*' in file names. | |
| * Directory Search:: Searching other directories for source files. | |
| * Phony Targets:: Using a target that isn't a real file's name. | |
| * Special Targets:: Targets with special built-in meanings. | |
| * Empty Targets:: Real files that are empty--only the date matters. | |
| * Multiple Targets:: When it is useful to have several targets in a rule. | |
| * Static Pattern:: Static pattern rules apply to multiple targets | |
| and can vary the dependencies according to the | |
| target name. | |
| * Multiple Rules:: Using several rules with the same target. | |
| * Double-Colon:: Special kind of rule allowing | |
| several independent rules for one target. | |
| * Commands:: Special features and details of how commands | |
| in a rule are executed. | |
| @end menu | |
| @ifinfo | |
| @node Rule Example, Rule Syntax, Rules, Rules | |
| @isubsection Rule Example | |
| Here is an example of a rule: | |
| @example | |
| foo.o : foo.c defs.h # module for twiddling the frobs | |
| cc -c -g foo.c | |
| @end example | |
| Its target is @file{foo.o} and its dependencies are @file{foo.c} and | |
| @file{defs.h}. It has one command, which is @samp{cc -c -g foo.c}. | |
| The command line starts with a tab to identify it as a command. | |
| This rule says two things: | |
| @itemize @bullet | |
| @item | |
| How to decide whether @file{foo.o} is out of date: it is out of date | |
| if it does not exist, or if either @file{foo.c} or @file{defs.h} is | |
| more recent than it. | |
| @item | |
| How to update the file @file{foo.o}: by running @code{cc} as stated. | |
| The command does not explicitly mention @file{defs.h}, but we presume | |
| that @file{foo.c} includes it, and that that is why @file{defs.h} was | |
| added to the dependencies. | |
| @end itemize | |
| @end ifinfo | |
| @node Rule Syntax, Wildcards, Rule Example, Rules | |
| @section Rule Syntax | |
| In general, a rule looks like this: | |
| @example | |
| @var{targets} : @var{dependencies} | |
| @var{command} | |
| @var{command} | |
| ... | |
| @end example | |
| @noindent | |
| or like this: | |
| @example | |
| @var{targets} : @var{dependencies} ; @var{command} | |
| @var{command} | |
| @var{command} | |
| ... | |
| @end example | |
| The @var{targets} are file names, separated by spaces. Wild card | |
| characters may be used (@pxref{Wildcards}) and a name of the form | |
| @file{@var{a}(@var{m})} represents member @var{m} in archive file @var{a} | |
| (@pxref{Archive Members}). Usually there is only one target per rule, but | |
| occasionally there is a reason to have more (@pxref{Multiple Targets}). | |
| The @var{command} lines start with a tab character. The first command may | |
| appear on the line after the dependencies, with a tab character, or may | |
| appear on the same line, with a semicolon. Either way, the effect is the | |
| same. @xref{Commands}. | |
| Because dollar signs are used to start variable references, if you really | |
| want a dollar sign in the rule you must write two of them (@samp{$$}). | |
| @xref{Variables}. A long line may be split by inserting a backslash | |
| followed by a newline, but this is not required, as there is no limit on | |
| the length of a line. | |
| A rule tells @code{make} two things: when the targets are out of date, | |
| and how to update them when necessary. | |
| The criterion for being out of date is specified in terms of the | |
| @var{dependencies}, which consist of file names separated by spaces. | |
| (Wildcards and archive members are allowed here too.) A target is out of | |
| date if it does not exist or if it is older than any of the dependencies | |
| (by comparison of last-modification times). The idea is that the contents | |
| of the target file are computed based on information in the dependencies, | |
| so if any of the dependencies changes the contents of the existing target | |
| file are no longer necessarily valid. | |
| How to 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}). | |
| @node Wildcards, Directory Search, Rule Syntax, Rules | |
| @section Using Wildcards Characters in File Names | |
| @cindex wildcard | |
| @cindex file name | |
| A single file name can specify many files using @dfn{wildcard characters}. | |
| The wildcard characters in @code{make} are @samp{*}, @samp{?} and | |
| @samp{[@dots{}]}, the same as in the Bourne shell. For example, @file{*.c} | |
| specifies a list of all the files (in the working directory) whose names | |
| end in @samp{.c}.@refill | |
| Wildcard expansion happens automatically in targets, in dependencies, and | |
| in commands. In other contexts, wildcard expansion happens only if you | |
| request it explicitly with the @code{wildcard} function. | |
| The special significance of a wildcard character can be turned off by | |
| preceding it with a backslash. Thus, @file{foo\*bar} would refer to a | |
| specific file whose name consists of @samp{foo}, an asterisk, and | |
| @samp{bar}.@refill | |
| @menu | |
| * Examples: Wildcard Examples. Some simple examples. | |
| * Pitfall: Wildcard Pitfall. @code{*.o} won't do what you want! | |
| * Function: Wildcard Function. | |
| How to do wildcard expansion when defining a variable | |
| using the function @code{wildcard}. | |
| @end menu | |
| @node Wildcard Examples, Wildcard Function, Wildcards, Wildcards | |
| @subsection Wildcard Examples | |
| Wildcards can be used in the commands of a rule. For example, here is a | |
| rule to delete all the object files: | |
| @example | |
| clean: | |
| rm -f *.o | |
| @end example | |
| Wildcards are also useful in the dependencies of a rule. With the | |
| following rule in the makefile, @samp{make print} will print all the | |
| @samp{.c} files that have changed since the last time you printed them: | |
| @example | |
| print: *.c | |
| lpr -p $? | |
| touch print | |
| @end example | |
| @noindent | |
| This rule uses @file{print} as an empty target file; @pxref{Empty Targets}. | |
| Wildcard expansion does not happen when you define a variable. Thus, if | |
| you write this: | |
| @example | |
| objects=*.o | |
| @end example | |
| @noindent | |
| then the value of the variable @code{objects} is the actual string | |
| @samp{*.o}. However, if you use the value of @code{objects} in a target, | |
| dependency or command, wildcard expansion will take place at that time. | |
| @node Wildcard Pitfall, Wildcard Function, Wildcard Examples, Wildcards | |
| @subsection Pitfalls of Using Wildcards | |
| Now here is an example of a naive way of using wildcard expansion, that | |
| does not do what you would intend. Suppose you would like to say that the | |
| executable file @file{foo} is made from all the object files in the | |
| directory, and you write this: | |
| @example | |
| objects=*.o | |
| foo : $(objects) | |
| cc -o foo $(CFLAGS) $(objects) | |
| @end example | |
| @noindent | |
| The value of @code{objects} is the actual string @samp{*.o}. Wildcard | |
| expansion happens in the rule for @file{foo}, so that each @emph{existing} | |
| @samp{.o} file becomes a dependency of @file{foo} and will be recompiled if | |
| necessary. | |
| But what if you delete all the @samp{.o} files? Then @samp{*.o} will | |
| expand into @emph{nothing}. The target @file{foo} will have no | |
| dependencies and would be remade by linking no object files. This is not | |
| what you want! | |
| Actually you can use wildcard expansion for this purpose, but you need more | |
| sophisticated techniques, including the @code{wildcard} function and string | |
| substitution. | |
| @ifinfo | |
| @xref{Wildcard Function}. | |
| @end ifinfo | |
| @iftex | |
| These are described in the following section. | |
| @end iftex | |
| @node Wildcard Function,, Wildcard Pitfall, Wildcards | |
| @subsection The Function @code{wildcard} | |
| @findex wildcard | |
| Wildcard expansion happens automatically in rules. But wildcard expansion | |
| does not normally take place when a variable is set, or inside the | |
| arguments of a function. If you want to do wildcard expansion in such | |
| places, you need to use the @code{wildcard} function, like this: | |
| @example | |
| $(wildcard @var{pattern}) | |
| @end example | |
| This string, used anywhere in a makefile, is replaced by a space-separated | |
| list of names of existing files that match the pattern @var{pattern}. | |
| One use of the @code{wildcard} function is to get a list of all the C source | |
| files in a directory, like this: | |
| @example | |
| $(wildcard *.c) | |
| @end example | |
| We can change the list of C source files into a list of object files by | |
| substituting @samp{.o} for @samp{.c} in the result, like this: | |
| @example | |
| $(subst .c,.o,$(wildcard *.c)) | |
| @end example | |
| Here we have used another function, @code{subst} (@pxref{Text Functions}). | |
| Thus, a makefile to compile all C source files in the directory and then | |
| link them together could be written as follows: | |
| @example | |
| objects:=$(subst .c,.o,$(wildcard *.c)) | |
| foo : $(objects) | |
| cc -o foo $(LDFLAGS) $(objects) | |
| @end example | |
| @noindent | |
| (This takes advantage of the implicit rule for compiling C programs, so | |
| there is no need to write explicit rules for compiling the files.) | |
| @node Directory Search, Phony Targets, Wildcards, Rules | |
| @section Searching Directories for Dependencies | |
| @vindex VPATH | |
| @findex vpath | |
| @cindex vpath | |
| @cindex search path for dependencies | |
| @cindex directory search | |
| For large systems, it is often desirable to put sources in a separate | |
| directory from the binaries. The @dfn{directory search} features of | |
| @code{make} facilitate this by searching several directories automatically | |
| to find a dependency. When you redistribute the files among directories, | |
| you do not need to change the individual rules, just the search paths. | |
| @menu | |
| * General Search:: The @code{VPATH} variable specifies a search path | |
| that applies to every dependency. | |
| * Selective Search:: The @code{vpath} directive specifies a search path | |
| for a specified class of names. | |
| * Commands/Search:: How to write shell commands that work together | |
| with search paths. | |
| * Implicit/Search:: How search paths affect implicit rules. | |
| * Libraries/Search:: Directory search for link libraries. | |
| @end menu | |
| @node General Search, Selective Search, Directory Search, Directory Search | |
| @subsection @code{VPATH}: Search Path for All Dependencies | |
| The value of the variable @code{VPATH} is a list of directories which | |
| @code{make} should search (in the order specified) for dependency files. | |
| The directory names are separated by colons. For example: | |
| @example | |
| VPATH = src:../headers | |
| @end example | |
| @noindent | |
| specifies a path containing two directories, @file{src} and @file{../headers}. | |
| Whenever a file listed as a dependency does not exist in the current | |
| directory, the directories listed in @code{VPATH} are searched for a file | |
| with that name. If a file is found in one of them, that file becomes the | |
| dependency. Rules may then specify the names of source files as if they | |
| all existed in the current directory. | |
| Using the value of @code{VPATH} set in the previous example, a rule like this: | |
| @example | |
| foo.o : foo.c | |
| @end example | |
| @noindent | |
| is interpreted as if it were written like this: | |
| @example | |
| foo.o : src/foo.c | |
| @end example | |
| @noindent | |
| assuming the file @file{foo.c} does not exist in the current directory but | |
| is found in the directory @file{src}. | |
| @node Selective Search, Commands/Search, General Search, Directory Search | |
| @subsection The @code{vpath} Directive | |
| Similar to the @code{VPATH} variable but more selective is the @code{vpath} | |
| directive, which allows you to specify a search path for a particular class | |
| of filenames, those that match a particular pattern. Thus you can supply | |
| certain search directories for one class of filenames and other directories | |
| (or none) for other filenames. | |
| There are three forms of the @code{vpath} directive: | |
| @table @code | |
| @item vpath @var{pattern} @var{directories} | |
| Specify the search path @var{directories} for filenames that match | |
| @code{pattern}. If another path was previously specified for the same | |
| pattern, the new path replaces it. Note that it does @emph{not} add | |
| to the old path for this pattern.@refill | |
| The search path, @var{directories}, is a colon-separated list of | |
| directories to be searched, just like the search path used in the | |
| @code{VPATH} variable. | |
| @item vpath @var{pattern} | |
| Clear out the search path associated with @var{pattern}. | |
| @item vpath | |
| Clear all search paths previously specified with @code{vpath} directives. | |
| @end table | |
| A @code{vpath} pattern is a string containing a @samp{%} character. The | |
| string must match the filename of a dependency that is being searched for, | |
| the @samp{%} character matching any sequence of zero or more characters (as | |
| in pattern rules; @pxref{Pattern Rules}). (It is valid to omit the | |
| @samp{%}, but then the pattern must match the dependency exactly, which may | |
| not be very useful.) | |
| When a dependency fails to exist in the current directory, if the | |
| @var{pattern} in a @code{vpath} directive matches the name of the | |
| dependency file, then the @var{directories} in that directive are searched | |
| just like (and before) the directories in the @code{VPATH} variable.@refill | |
| If several @code{vpath} patterns match the dependency file's name, then | |
| @code{make} processes each matching @code{vpath} directive one by one, | |
| searching all the directories mentioned in each directive. The @code{vpath} | |
| directives are processed in the order in which they appear in the makefiles. | |
| @node Commands/Search, Implicit/Search, Selective Search, Directory Search | |
| @subsection Writing Shell-Commands with Directory Search | |
| When a dependency is found in another directory through directory search, | |
| this cannot change the commands of the rule; they will execute as written. | |
| Therefore, you must write the commands with care so that they will look for | |
| the dependency in the directory where @code{make} finds it. | |
| This is done with the @dfn{automatic variables} such as @samp{$^} | |
| (@pxref{Automatic}). For instance, the value of @samp{$^} is a list of all | |
| the dependencies of the rule, including the names of the directories in | |
| which they were found, and the value of @samp{$@@} is the target. Thus: | |
| @example | |
| foo.o : foo.c | |
| cc -c $(CFLAGS) $^ -o $@@ | |
| @end example | |
| @noindent | |
| The variable @code{CFLAGS} exists so you can specify flags for C | |
| compilation by implicit rule; we use it here for consistency so it will | |
| affect all C compilations uniformly (@pxref{Implicit Variables}). | |
| Often the dependencies include header files as well, which you don't want | |
| to mention in the commands. The function @code{firstword} can be used to | |
| extract just the first dependency from the entire list, as shown here | |
| (@pxref{Filename Functions}): | |
| @example | |
| VPATH = src:../headers | |
| foo.o : foo.c defs.h hack.h | |
| cc -c $(CFLAGS) $(firstword $^) -o $@@ | |
| @end example | |
| @noindent | |
| Here the value of @samp{$^} would be something like @samp{src/foo.c | |
| ../headers/defs.h hack.h}, from which @samp{$(firstword $^)} extracts just | |
| @samp{src/foo.c}.@refill | |
| @node Implicit/Search, Libraries/Search, Commands/Search, Directory Search | |
| @subsection Directory Search and Implicit Rules | |
| The search through the directories specified in @code{VPATH} or with | |
| @code{vpath} happens also during consideration of implicit rules | |
| (@pxref{Implicit}). | |
| For example, when a file @file{foo.o} has no explicit rule, @code{make} | |
| considers implicit rules, such as to compile @file{foo.c} if that file | |
| exists. If such a file is lacking in the current directory, the | |
| appropriate directories are searched for it. If @file{foo.c} exists (or is | |
| mentioned in the makefile) in any of the directories, the implicit rule for | |
| C compilation is applicable. | |
| The commands of all the built-in implicit rules normally use automatic | |
| variables as a matter of necessity; consequently they will use the file | |
| names found by directory search with no extra effort. | |
| @node Libraries/Search,, Implicit/Search, Directory Search | |
| @subsection Directory Search for Link Libraries | |
| Directory search applies in a special way to libraries used with the | |
| linker. This special feature comes into play when you write a dependency | |
| whose name is of the form @samp{-l@var{name}}. (You can tell something | |
| funny is going on here because the dependency is normally the name of a | |
| file, and the @emph{file name} of the library looks like | |
| @file{lib@var{name}.a}, not like @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 @samp{lib@var{name}.a} in | |
| the directories @samp{/lib} and @samp{/usr/lib}, and then using matching | |
| @code{vpath} search paths and the @code{VPATH} search path.@refill | |
| For example, | |
| @example | |
| foo : foo.c -lcurses | |
| cc $^ -o $@@ | |
| @end example | |
| @noindent | |
| would cause the command @samp{cc foo.c -lcurses -o foo} to be executed when | |
| @file{foo} is older than @file{foo.c} or than @file{libcurses.a} (which has | |
| probably been found by directory search in the file | |
| @file{/usr/lib/libcurses.a}).@refill | |
| As shown by the example above, the file name found by directory search is | |
| used only for comparing the file time with the target file's time. It | |
| does not replace the file's name in later usage (such as in automatic | |
| variables like @code{$^}); the name remains unchanged, still starting | |
| with @samp{-l}. This leads to the correct results because the linker | |
| will repeat the appropriate search when it processes its arguments.@refill | |
| @node Phony Targets, Empty Targets, Directory Search, Rules | |
| @section Phony Targets | |
| @cindex phony targets | |
| A phony target is one that is not really the name of a file. | |
| It is only a name for some commands to be executed when explicitly | |
| requested. | |
| If you write a rule whose commands will not create the target file, the | |
| commands will be executed every time the target comes up for remaking. | |
| Here is an example: | |
| @example | |
| clean: | |
| rm *.o temp | |
| @end example | |
| @noindent | |
| Because the @code{rm} command does not create a file named @file{clean}, | |
| probably no such file will ever exist. Therefore, the @code{rm} command | |
| will be executed every time you say @samp{make clean}. | |
| @findex .PHONY | |
| The phony target will cease to work if anything ever does create a file | |
| named @file{clean} in this directory. Since there are no dependencies, the | |
| @file{clean} would be considered up to date and its commands would not be | |
| executed. To avoid this problem, you can explicitly declare the target to | |
| be phony, using the special target @code{.PHONY} (@pxref{Special Targets}) | |
| as follows: | |
| @example | |
| .PHONY : clean | |
| @end example | |
| @noindent | |
| Once this is done, @code{make} will run the commands regardless of whether | |
| there is a file named @file{clean}. | |
| A phony target should not be a dependency of a real target file; strange | |
| things can result from that. As long as you don't do that, the phony | |
| target commands will be executed only when the phony target is a goal | |
| (@pxref{Goals}). | |
| Phony targets can have dependencies. When one directory contains multiple | |
| programs, it is most convenient to describe all of the programs in one | |
| makefile @file{./Makefile}. Since the target remade by default will be the | |
| first one in the makefile, it is common to make this a phony target named | |
| @samp{all} and give it, as dependencies, all the individual programs. For | |
| example: | |
| @example | |
| all : prog1 prog2 prog3 | |
| .PHONY : all | |
| prog1 : prog1.o utils.o | |
| cc -o prog1 prog1.o utils.o | |
| prog2 : prog2.o | |
| cc -o prog2 prog2.o | |
| prog3 : prog3.o sort.o utils.o | |
| cc -o prog3 prog3.o sort.o utils.o | |
| @end example | |
| @noindent | |
| Now you can say 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 | |
| cleanall : cleanobj cleandiff | |
| rm program | |
| cleanobj : | |
| rm *.o | |
| cleandiff : | |
| rm *.diff | |
| @end example | |
| @node Empty Targets, Special Targets, Phony Targets, Rules | |
| @section Empty Target Files to Record Events | |
| @cindex empty 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 | |
| @noindent | |
| With this rule, @samp{make print} will execute the @code{lpr} command if | |
| either source file has changed since the last @samp{make print}. The | |
| automatic variable @samp{$?} is used to print only those files that have | |
| changed (@pxref{Automatic}). | |
| @node Special Targets, Multiple Targets, Empty Targets, Rules | |
| @section Special Built-in Target Names | |
| @cindex special targets | |
| Certain names have special meanings if they appear as targets. | |
| @table @code | |
| @item .PHONY | |
| The dependencies of the special target @code{.PHONY} are considered to | |
| be phony targets. When it is time to consider such a target, | |
| @code{make} will run its commands unconditionally, regardless of | |
| whether a file with that name exists or what its last-modification | |
| time is. @xref{Phony Targets}. | |
| @item .SUFFIXES | |
| The dependencies of the special target @code{.SUFFIXES} are the list | |
| of suffixes to be used in checking for suffix rules (@pxref{Suffix | |
| Rules}). | |
| @item .DEFAULT | |
| The commands specified for @code{.DEFAULT} are used for any target for | |
| which no other commands are known (either explicitly or through an | |
| implicit rule). If @code{.DEFAULT} commands are specified, every | |
| nonexistent file mentioned as a dependency will have these commands | |
| executed on its behalf. @xref{Search Algorithm}. | |
| @item .PRECIOUS | |
| @cindex precious targets | |
| The targets which @code{.PRECIOUS} depends on are given this special | |
| treatment: if @code{make} is killed or interrupted during the | |
| execution of their commands, the target is not deleted. | |
| @xref{Interrupts}. | |
| @item .IGNORE | |
| Simply by being mentioned as a target, @code{.IGNORE} says to ignore | |
| errors in execution of commands. The dependencies and commands for | |
| @code{.IGNORE} are not meaningful. | |
| @samp{.IGNORE} exists for historical compatibility. Since | |
| @code{.IGNORE} affects every command in the makefile, it is not very | |
| useful; we recommend you use the more selective ways to ignore errors | |
| in specific commands (@pxref{Errors}). | |
| @item .SILENT | |
| Simply by being mentioned as a target, @code{.SILENT} says not to | |
| print commands before executing them. The dependencies and commands | |
| for @code{.SILENT} are not meaningful. | |
| @samp{.SILENT} exists for historical compatibility. We recommend you | |
| use the more selective ways to silence specific commands | |
| (@pxref{Echoing}). | |
| @end table | |
| An entire class of special targets have names made of the concatenation of | |
| two implicit rule suffixes (two members of the list of dependencies of | |
| @code{.SUFFIXES}). Such special targets are suffix rules, an obsolete way | |
| of defining implicit rules (but a way still widely used). In principle, | |
| any target name could be special in this way if you break it in two and add | |
| both pieces to the suffix list. In practice, suffixes normally begin with | |
| @samp{.}, so these special target names also begin with @samp{.}. | |
| @xref{Suffix Rules}. | |
| @node Multiple Targets, Multiple Rules, Special Targets, Rules | |
| @section Multiple Targets in a Rule | |
| A rule with multiple targets is equivalent to writing many rules, each with | |
| one target, and all identical aside from that. The same commands apply to | |
| all the targets, but their effects may vary because you can substitute the | |
| actual target name into the command using @samp{$@@}. The rule contributes | |
| the same dependencies to all the targets also. | |
| This is useful in two cases. | |
| @itemize @bullet | |
| @item | |
| You want just dependencies, no commands. For example: | |
| @example | |
| kbd.o commands.o files.o: command.h | |
| @end example | |
| @noindent | |
| gives an additional dependency to each of the three object files | |
| mentioned. | |
| @item | |
| Similar commands work for all the targets. The commands do not need | |
| to be absolutely identical, since the automatic variable @samp{$@@} | |
| can be used to substitute the particular target to be remade into the | |
| commands (@pxref{Automatic}). For example: | |
| @group | |
| @example | |
| bigoutput littleoutput : text.g | |
| generate text.g -$(subst output,,$@@) > $@@ | |
| @end example | |
| @end group | |
| @noindent | |
| is equivalent to | |
| @example | |
| bigoutput : text.g | |
| generate text.g -big > bigoutput | |
| littleoutput : text.g | |
| generate text.g -little > littleoutput | |
| @end example | |
| @noindent | |
| Here we assume the hypothetical program @code{generate} makes two | |
| types of output, one if given @samp{-big} and one if given | |
| @samp{-little}.@refill | |
| @end itemize | |
| @ifinfo | |
| Suppose you would like to vary the dependencies according to the target, | |
| much as the variable @samp{$@@} allows you to vary the commands. | |
| You cannot do this with multiple targets in an ordinary rule, but you can | |
| do it with a @dfn{static pattern rule}. @xref{Static Pattern}. | |
| @end ifinfo | |
| @node Static Pattern, Multiple Rules, Multiple Targets, Rules | |
| @section Static Pattern Rules | |
| @cindex static pattern rules | |
| @cindex varying dependencies | |
| @dfn{Static pattern rules} are rules which specify multiple targets and | |
| construct the dependency names for each target based on the target name. | |
| They are more general than ordinary rules with multiple targets because the | |
| targets don't have to have identical dependencies. Their dependencies must | |
| be @emph{analogous}, but not necessarily @emph{identical}. | |
| @menu | |
| * Usage: Static Usage. How to use static pattern rules. | |
| * Static vs Implicit:: When are they better than implicit rules? | |
| @end menu | |
| @node Static Usage, Static vs Implicit, Static Pattern, Static Pattern | |
| @subsection Syntax of Static Pattern Rules | |
| Here is the syntax of a static pattern rule: | |
| @example | |
| @var{targets}: @var{target-pattern}: @var{dep-patterns} @dots{} | |
| @var{commands} | |
| @dots{} | |
| @end example | |
| @noindent | |
| The @var{targets} gives the list of targets that the rule applies to. The | |
| targets can contain wildcard characters, just like the targets of ordinary | |
| rules (@pxref{Wildcards}). | |
| The @var{target-pattern} and @var{dep-patterns} say how to compute the | |
| dependencies of each target. Each target is matched against the | |
| @var{target-pattern} to extract a part of the target name, called the | |
| @dfn{stem}. This stem is substituted into each of the @var{dep-patterns} | |
| to make the dependency names (one from each @var{dep-pattern}). | |
| Each pattern normally contains the character @samp{%} just once. When the | |
| @var{target-pattern} matches a target, the @samp{%} can match any part of | |
| the target name; this part is called the @dfn{stem}. The rest of the | |
| pattern must match exactly. For example, the target @file{foo.o} matches | |
| the pattern @samp{%.o}, with @samp{foo} as the stem. The targets | |
| @file{foo.c} and @file{foo.out} don't match that pattern.@refill | |
| The dependency names for each target are made by substituting the stem for | |
| the @samp{%} in each dependency pattern. For example, if one dependency | |
| pattern is @file{%.c}, then substitution of the stem @samp{foo} gives the | |
| dependency name @file{foo.c}. It is fine to write a dependency pattern that | |
| doesn't contain @samp{%}; then this dependency is the same for all targets. | |
| Here is an example, which compiles each of @file{foo.o} and @file{bar.o} | |
| from the corresponding @file{.c} file: | |
| @example | |
| objects := foo.o bar.o | |
| $(objects): %.o: %.c | |
| $(CC) -c $(CFLAGS) $< -o $@@ | |
| @end example | |
| Each target specified must match the target pattern; a warning is issued | |
| for each that does not. If you have a list of files, only some of which | |
| will match the pattern, you can use the @code{filter} function to remove | |
| nonmatching filenames (@pxref{Text Functions}): | |
| @example | |
| files := foo.elc bar.o | |
| $(filter %.o,$(files)): %.o: %.c | |
| $(CC) -c $(CFLAGS) $< -o $@@ | |
| $(filter %.elc,$(files)): %.elc: %.el | |
| emacs -f batch-byte-compile $< | |
| @end example | |
| @noindent | |
| Here the result of @samp{$(filter %.o,$(files))} is just @file{bar.o}, and | |
| the first static pattern rule causes it to be made from @file{bar.c}. The | |
| result of @samp{$(filter %.elc,$(files))} is @file{foo.elc}, which is | |
| made from @file{foo.el}.@refill | |
| @node Static vs Implicit,, Static Usage, Static Pattern | |
| @subsection Static Pattern Rules versus Implicit Rules | |
| A static pattern rule has much in common with an implicit rule defined as a | |
| pattern rule (@pxref{Pattern Rules}). Both have a pattern for the target | |
| and patterns for constructing the names of dependencies. The difference is | |
| in how @code{make} decides @emph{when} the rule applies. | |
| An implicit rule @emph{can} apply to any target that matches its pattern, | |
| but it @emph{does} apply only when the target has no commands otherwise | |
| specified, and only when the dependencies can be found. If more than one | |
| implicit rule appears applicable, only one applies; the choice depends on | |
| the order of rules. | |
| By contrast, a static pattern rule applies to the precise list of targets | |
| that you specify in the rule. It cannot apply to any other target and it | |
| invariably does apply to each of the targets specified. If two conflicting | |
| rules apply, and both have commands, that's an error. | |
| The static pattern rule can be better than an implicit rule for these | |
| reasons: | |
| @itemize @bullet | |
| @item | |
| You may wish to override the usual implicit rule for a few files whose | |
| names cannot be categorized syntactically but can be given in an | |
| explicit list. | |
| @item | |
| If you cannot be sure of the precise contents of the directories you | |
| are using, you may not be sure which other irrelevant files might lead | |
| @code{make} to use the wrong implicit rule. The choice might depend | |
| on the order in which the implicit rule search is done. With static | |
| pattern rules, there is no uncertainty: each rule applies to precisely | |
| the targets specified. | |
| @end itemize | |
| @node Multiple Rules, Double-Colon, Static Pattern, Rules | |
| @section Multiple Rules for One Target | |
| One file can be the target of several rules if at most one rule has commands. | |
| The other rules can only have dependencies. All the dependencies mentioned | |
| in all the rules are merged into one list of dependencies for the target. | |
| If the target is older than any dependency from any rule, the commands are | |
| executed. | |
| An extra rule with just dependencies can be used to give a few extra | |
| dependencies to many files at once. For example, one usually has a | |
| variable named @code{objects} containing a list of all the compiler output | |
| files in the system being made. An easy way to say that all of them must | |
| be recompiled if @file{config.h} changes is to write | |
| @example | |
| objects = foo.o bar.o | |
| foo.o : defs.h | |
| bar.o : defs.h test.h | |
| $(objects) : config.h | |
| @end example | |
| This could be inserted or taken out without changing the rules that really | |
| say how to make the object files, making it a convenient form to use if | |
| you wish to add the additional dependency intermittently. | |
| Another wrinkle is that the additional dependencies could be specified with | |
| a variable that you could set with a command argument to @code{make} | |
| (@pxref{Overriding}). For example, | |
| @example | |
| extradeps= | |
| $(objects) : $(extradeps) | |
| @end example | |
| @noindent | |
| means that the command @samp{make extradeps=foo.h} will consider | |
| @file{foo.h} as a dependency of each object file, but plain @samp{make} | |
| will not. | |
| If none of the explicit rules for a target has commands, then @code{make} | |
| searches for an applicable implicit rule to find some commands. | |
| @xref{Implicit}. | |
| @node Double-Colon,, Multiple Rules, Rules | |
| @section Double-Colon Rules | |
| @cindex double-colon rule | |
| @dfn{Double-colon} rules are rules written with @samp{::} instead of | |
| @samp{:} after the target names. They are handled differently from | |
| ordinary rules when the same target appears in more than one rule. | |
| When a target appears in multiple rules, all the rules must be the same | |
| type: all ordinary, or all double-colon. If they are double-colon, each of | |
| them is independent of the others. Each double-colon rule's commands are | |
| executed if the target is older than any dependencies of that rule. This | |
| can result in executing none, any or all of the double-colon rules. | |
| The double-colon rules for a target are executed in the order they appear | |
| in the makefile. However, the cases where double-colon rules really make | |
| sense are those where the order of executing the commands would not matter. | |
| Each double-colon rule should specify commands; if it does not, an | |
| implicit rule will be used if one applies. @xref{Implicit}. | |
| @node Commands, Variables, Rules, Top | |
| @chapter Writing the Commands in Rules | |
| @cindex 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. | |
| Whether comments can be written on command lines, and what syntax they use, | |
| is under the control of the shell that is in use. If it is @file{/bin/sh}, | |
| a @samp{#} at the start of a word starts a comment. | |
| @menu | |
| * Echoing:: Normally commands are echoed before execution, | |
| but you can control this in several ways. | |
| * Execution:: How commands are executed. | |
| * Errors:: What happens after an error in command execution. | |
| How to ignore errors in certain commands. | |
| * Interrupts:: If a command is interrupted or killed, | |
| the target may be deleted. | |
| * Recursion:: Invoking @code{make} from commands in makefiles. | |
| * Sequences:: Defining canned sequences of commands. | |
| @end menu | |
| @node Echoing, Execution, Commands, Commands | |
| @section Command Echoing | |
| @cindex echoing (of commands) | |
| @cindex silent operation | |
| @cindex @@ (in commands) | |
| @cindex -n | |
| Normally @code{make} prints each command line before it is executed. We | |
| call this @dfn{echoing} because it gives the appearance that you are typing | |
| the commands yourself. | |
| When a line starts with @samp{@@}, it is normally not echoed. The | |
| @samp{@@} is discarded before the command is passed to the shell. Typically | |
| you would use this for a command whose only effect is to print something, | |
| such as an @code{echo} command. | |
| When @code{make} is given the flag @samp{-n}, echoing is all that happens, | |
| no execution. @xref{Options}. In this case and only this case, even the | |
| commands starting with @samp{@@} are printed. This flag is useful for | |
| finding out which commands @code{make} thinks are necessary without | |
| actually doing them. | |
| @cindex -s | |
| @findex .SILENT | |
| The @samp{-s} flag to @code{make} prevents all echoing, as if all commands | |
| started with @samp{@@}. A rule in the makefile for the special target | |
| @code{.SILENT} has the same effect (@pxref{Special Targets}). | |
| @code{.SILENT} is essentially obsolete since @samp{@@} is more | |
| general.@refill | |
| @node Execution, Errors, Echoing, Commands | |
| @section Command Execution | |
| @cindex execution | |
| @cindex shell | |
| When it is time to execute commands to update a target, they are executed | |
| one at a time by making a new subshell for each line. (In practice, | |
| @code{make} may take shortcuts that do not affect the results.) | |
| This implies that shell commands such as @code{cd} that set variables local | |
| to each process will not affect the following command lines. If you want | |
| to use @code{cd} to affect the next command, put the two on a single line | |
| with a semicolon between them. Then @code{make} will consider them a | |
| single command and pass them, together, to a shell which will execute them | |
| in sequence. For example: | |
| @example | |
| foo : bar/lose | |
| cd bar; gobble lose > ../foo | |
| @end example | |
| If you would like to split a single shell command into multiple lines of | |
| text, you must use a backslash at the end of all but the last subline. | |
| Such a sequence of lines is combined into a single line, by deleting the | |
| backslash-newline sequences, before passing it to the shell. Thus, the | |
| following is equivalent to the preceding example: | |
| @group | |
| @example | |
| foo : bar/lose | |
| cd bar; \ | |
| gobble lose > ../foo | |
| @end example | |
| @end group | |
| @vindex SHELL | |
| The program used as the shell is taken from the variable @code{SHELL}. By | |
| default, the program @file{/bin/sh} is used. | |
| Unlike most variables, the variable @code{SHELL} will not be set from the | |
| environment, except in a recursive @code{make}. This is because the | |
| environment variable @code{SHELL} is used to specify your personal choice | |
| of shell program for interactive use. It would be very bad for personal | |
| choices like this to affect the functioning of makefiles. | |
| @xref{Environment}. | |
| @node Errors, Interrupts, Execution, Commands | |
| @section Errors in Commands | |
| @cindex error (in commands) | |
| After each shell command returns, @code{make} looks at its exit status. | |
| If the command completed successfully, the next command line is executed in | |
| a new shell, or after the last command line the rule is finished. | |
| If there is an error (the exit status is nonzero), @code{make} gives up on | |
| the current rule, and perhaps on all rules. | |
| Sometimes it does not matter whether a command fails. For example, you | |
| may use the @code{mkdir} command to insure that a directory exists. If | |
| the directory already exists, @code{mkdir} will report an error, but you | |
| probably want @code{make} to continue regardless. | |
| @cindex - (in commands) | |
| To ignore errors in a command line, write a @samp{-} at the beginning of | |
| the line's text (after the initial tab). The @samp{-} is discarded before | |
| the command is passed to the shell for execution. | |
| @cindex -i | |
| @findex .IGNORE | |
| When @code{make} is run with the @samp{-i} flag, errors are ignored in | |
| all commands of all rules. A rule in the makefile for the special target | |
| @code{.IGNORE} has the same effect. These ways of ignoring errors are | |
| obsolete because @samp{-} is more general. | |
| When errors are to be ignored, because of either a @samp{-} or the | |
| @samp{-i} flag, @code{make} treats an error return just like success. | |
| @cindex -k | |
| When an error happens that @code{make} has not been told to ignore, | |
| it implies that the current target cannot be correctly remade, and neither | |
| can any other that depends on it either directly or indirectly. No further | |
| commands will be executed for these targets, since their preconditions | |
| have not been achieved. | |
| Normally @code{make} gives up immediately in this circumstance, returning a | |
| nonzero status. However, if the @samp{-k} flag is specified, @code{make} | |
| continues to consider the other dependencies of the pending targets, | |
| remaking them if necessary, before it gives up and returns nonzero status. | |
| For example, after an error in compiling one object file, @samp{make -k} | |
| will continue compiling other object files even though it already knows | |
| that linking them will be impossible. @xref{Options}. | |
| The usual behavior assumes that your purpose is to get the specified | |
| targets up to date; once @code{make} learns that this is impossible, it | |
| might as well report the failure immediately. The @samp{-k} option says | |
| that the real purpose is to test as much as possible of the changes made in | |
| the program, perhaps to find several independent problems so that you can | |
| correct them all before the next attempt to compile. This is why Emacs's | |
| @code{compile} command passes the @samp{-k} flag by default. | |
| @node Interrupts, Recursion, Errors, Commands | |
| @section Interrupting or Killing @code{make} | |
| @cindex interrupt | |
| @cindex signal | |
| @cindex deletion of target files | |
| If @code{make} gets a fatal signal while a command is executing, it may | |
| delete the target file that the command was supposed to update. This is | |
| done if the target file's 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. Otherwise, a partially written file | |
| could appear to be valid, since it is more recent than the dependencies. | |
| @findex .PRECIOUS | |
| You can prevent the deletion of a target file in this way by making the | |
| special target @code{.PRECIOUS} depend on it. Before remaking a target, | |
| @code{make} checks to see whether it appears on the dependencies of | |
| @code{.PRECIOUS}, and thereby decides whether the target should be deleted | |
| if a signal happens. Some reasons why you might do this are that the | |
| target is updated in some atomic fashion or exists only to record a | |
| modification-time (its contents do not matter) or will cause trouble if it | |
| ever fails to exist. | |
| @node Recursion, Sequences, Interrupts, Commands | |
| @section Recursive Use of @code{make} | |
| @cindex recursion | |
| Recursive use of @code{make} means using @code{make} as a command in a | |
| makefile. This technique is useful when you want separate makefiles for | |
| various subsystems that compose a larger system. For example, suppose you | |
| have a subdirectory @file{subdir} which has its own makefile, and you would | |
| like the containing directory's makefile to run @code{make} on the | |
| subdirectory. You can do it by writing this: | |
| @example | |
| subsystem: | |
| cd subdir; $(MAKE) | |
| @end example | |
| @noindent | |
| or, equivalently, this (@pxref{Options}): | |
| @example | |
| subsystem: | |
| $(MAKE) -c subdir | |
| @end example | |
| 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:: Special effects of using @samp{$(MAKE)}. | |
| * Variables/Recursion:: How variables are communicated to a sub-@code{make}. | |
| * Options/Recursion:: How options are communicated to a sub-@code{make}. | |
| * -w Option:: The @samp{-w} option facilitates debugging | |
| makefiles with recursive @code{make} commands. | |
| @end menu | |
| @node MAKE Variable, Variables/Recursion, Recursion, Recursion | |
| @subsection How the @code{MAKE} Variable Works | |
| @vindex MAKE | |
| Recursive @code{make} commands should always use the variable @code{MAKE}, | |
| not the explicit command name @samp{make}, as shown here: | |
| @example | |
| subsystem: | |
| cd subdir; $(MAKE) | |
| @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. | |
| 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 | |
| As a special feature, using the variable @code{MAKE} in the commands of a | |
| rule alters the effects of the @samp{-t}, @samp{-n} or @samp{-q} option. | |
| (@xref{Instead of Execution}.)@refill | |
| Consider the command @samp{make -t} in the above example. Following the | |
| usual definition of @samp{-t}, this would create a file named | |
| @file{subsystem} and do nothing else. What you really want it to do is run | |
| @samp{cd subdir; make -t}; but that would require executing the command, | |
| and @samp{-t} says not to execute commands.@refill | |
| The special feature makes this do what you want: whenever a rule's commands | |
| use the variable @code{MAKE}, the flags @samp{-t}, @samp{-n} or @samp{-q} | |
| do not apply to that rule. The commands of that rule are executed normally | |
| despite the presence of a flag that causes most commands not to be run. | |
| The usual @code{MAKEFLAGS} mechanism passes the flags to the | |
| sub-@code{make} (@pxref{Options/Recursion}), 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 environment and recursion | |
| Most variable values of the top-level @code{make} are passed to the | |
| sub-@code{make} through the environment. These variables are defined in | |
| the sub-@code{make} as defaults, but do not override what is specified in | |
| the sub-@code{make}'s makefile. (Variables are passed down if their names | |
| consist of letters, numbers and underscores.) | |
| The way this works is that @code{make} adds each variable and its value to | |
| the environment for running each command. (Variables whose names start | |
| with non-alphanumeric characters are left out.) The sub-@code{make}, in | |
| turn, uses the environment to initialize its table of variable values. | |
| @xref{Environment}. | |
| @vindex MAKELEVEL | |
| As a special feature, the variable @code{MAKELEVEL} is changed when it is | |
| passed down from level to level. This variable's value is a string which | |
| is the depth of the level as a decimal number. The value is @samp{0} for | |
| the top-level @code{make}; @samp{1} for a sub-@code{make}, @samp{2} for a | |
| sub-sub-@code{make}, and so on. The incrementation happens when | |
| @code{make} sets up the environment for a command.@refill | |
| The main use of @code{MAKELEVEL} is to test it in a conditional directive | |
| (@pxref{Conditionals}); this way you can write a makefile that behaves one | |
| way if run recursively and another way if run directly by you. | |
| @vindex 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 filenames. This variable, if defined in the | |
| outer-level makefile, is passed down through the environment as usual; 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}. | |
| @node Options/Recursion, -w Option, Variables/Recursion, Recursion | |
| @subsection Communicating Options to a Sub-@code{make} | |
| @cindex options and recursion | |
| @vindex MAKEFLAGS | |
| Flags such as @samp{-s} and @samp{-k} are passed automatically to the | |
| sub-@code{make} through the variable @code{MAKEFLAGS}. This variable is | |
| set up automatically by @code{make} to contain the flag letters that | |
| @code{make} received. Thus, if you do @samp{make -ks} then | |
| @code{MAKEFLAGS} gets the value @samp{ks}.@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}. | |
| The options @samp{-c}, @samp{-d}, @samp{-f}, @samp{-I}, @samp{-o}, and | |
| @samp{-p} are not put into @code{MAKEFLAGS}; these options are not passed | |
| down.@refill | |
| If you don't want to pass the other the flags down, you must change the | |
| value of @code{MAKEFLAGS}, like this: | |
| @example | |
| subsystem: | |
| cd subdir; $(MAKE) MAKEFLAGS= | |
| @end example | |
| @vindex MFLAGS | |
| A similar variable @code{MFLAGS} exists also, for historical compatibility. | |
| It has the same value as @code{MAKEFLAGS} except that a hyphen is added at | |
| the beginning if it is not empty. @code{MFLAGS} was traditionally used | |
| explicitly in the recursive @code{make} command, like this: | |
| @example | |
| subsystem: | |
| cd subdir; $(MAKE) $(MFLAGS) | |
| @end example | |
| @noindent | |
| but now @code{MAKEFLAGS} makes this usage redundant. | |
| @node -w Option,, Options/Recursion, Recursion | |
| @subsection The @samp{-w} Option | |
| If you are running @code{make} over a large directory tree, the @samp{-w} | |
| option can make the output a lot easier to understand by showing each | |
| directory as it is entered and exited. 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 this form: | |
| @example | |
| make: Leaving directory `/u/gnu/make'. | |
| @end example | |
| @noindent | |
| when processing is completed. | |
| @node Sequences,, Recursion, Commands | |
| @section Defining Canned Command Sequences | |
| @cindex sequences of commands | |
| When the same sequence of commands is useful in making various targets, you | |
| can define it as a canned sequence with the @code{define} directive, and | |
| refer to the canned sequence from the rules for those targets. The canned | |
| sequence is actually a variable, so the name must not conflict with other | |
| variable names. | |
| Here is an example of defining a canned sequence of commands: | |
| @example | |
| define run-yacc | |
| yacc $(firstword $^) | |
| mv y.tab.c $@@ | |
| endef | |
| @end example | |
| @noindent | |
| Here @code{run-yacc} is the name of the variable being defined; | |
| @code{endef} marks the end of the definition; the lines in between are the | |
| commands. The @code{define} directive does not expand variable references | |
| and function calls in the canned sequence; the @samp{$} characters, | |
| parentheses, variable names, and so on, all become part of the value of the | |
| variable you are defining. @xref{Defining}, for a complete explanation of | |
| @code{define}. | |
| The first command in this example runs Yacc on the first dependency (of | |
| whichever rule uses the canned sequence). The output file from Yacc is | |
| always named @file{y.tab.c}. The second command moves the output to the | |
| rule's target file name. | |
| To use the canned sequence, substitute the variable into the commands of a | |
| rule. You can substitute it like any other variable (@pxref{Reference}). | |
| Because variables defined by @code{define} are recursively expanded | |
| variables, all the variable references you wrote inside the @code{define} | |
| are expanded now. For example: | |
| @example | |
| foo.c : foo.y | |
| $(run-yacc) | |
| @end example | |
| @noindent | |
| @samp{foo.y} will substituted for the variable @samp{$^} when it occurs in | |
| @code{run-yacc}'s value, and @samp{foo.c} for @samp{$@@}.@refill | |
| This is a realistic example, but this particular one is not needed in | |
| practice because @code{make} has an implicit rule to figure out these | |
| commands based on the file names involved. @xref{Implicit}. | |
| @node Variables, Conditionals, Commands, Top | |
| @chapter How to Use Variables | |
| @cindex variable | |
| @cindex value | |
| @cindex recursive variable expansion | |
| @cindex simple variable expansion | |
| A @dfn{variable} is a name defined within @code{make} to represent a string | |
| of text, called the variable's @dfn{value}. These values can be | |
| substituted by explicit request into targets, dependencies, commands and | |
| other parts of the makefile. | |
| Variables can represent lists of file names, options to pass to compilers, | |
| programs to run, directories to look in for source files, directories to | |
| write output in, or anything else you can imagine. | |
| A variable name may be any sequence characters not containing @samp{:}, | |
| @samp{#}, @samp{=}, tab characters or leading or trailing spaces. However, | |
| variable names containing characters other than letters, numbers and | |
| underscores should be avoided, as they may be given special meanings in the | |
| future, and they are not passed through the environment to a | |
| sub-@code{make} (@pxref{Variables/Recursion}). | |
| It is traditional to use upper case letters in variable names, but we | |
| recommend using lower case letters for variable names that serve internal | |
| purposes in the makefile, and reserving upper case for parameters that | |
| control implicit rules or for parameters that the user should override with | |
| command options (@pxref{Overriding}). | |
| @menu | |
| * Reference:: How to use the value of a variable. | |
| * Values:: All the ways variables get their values. | |
| * Flavors:: Variables come in two flavors. | |
| * Setting:: How to set a variable in the makefile. | |
| * Override Directive:: Setting a variable in the makefile | |
| even if the user has set it with a command argument. | |
| * Defining:: An alternate way to set a variable to a verbatim string. | |
| * Environment:: Variable values can come from the environment. | |
| @end menu | |
| @node Reference, Values, Variables, Variables | |
| @section Reference to Variables | |
| @cindex reference to variables | |
| @cindex $ (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 a common kind | |
| of example, where a variable holds the names of all the object files in a | |
| program: | |
| @example | |
| objects = program.o foo.o utils.o | |
| program : $(objects) | |
| cc -o program $(objects) | |
| $(objects) : defs.h | |
| @end example | |
| Variable references work by strict textual substitution. Thus, the rule | |
| @example | |
| foo = c | |
| prog.o : prog.c | |
| $(foo)$(foo) prog.c | |
| @end example | |
| @noindent | |
| could be used to compile a C program @file{prog.c}. (Since spaces around | |
| the variable value are ignored in variable assignments, the value of | |
| @code{foo} is precisely @samp{c}.) | |
| A dollar sign followed by a character other than a dollar sign, | |
| open-parenthesis or open-brace treats that single character as the variable | |
| name. Thus, you could reference the variable @code{x} with @samp{$x}. | |
| However, this practice is strongly discouraged, except with the automatic | |
| variables (@pxref{Automatic}). | |
| @subsection Modified References | |
| @cindex modified variable reference | |
| @cindex substitution variable reference | |
| In addition to simple references, variables can be referenced in a manner | |
| which modifies the value of the reference but do not modify the value of | |
| the variable referenced. Such a reference is a @dfn{substitution reference}. | |
| A @dfn{substitution reference} is really a simplified form of the | |
| @code{patsubst} expansion function (@pxref{Functions}). It has the form | |
| @samp{$(var:a=b)} (or @samp{$@{var:a=b@}}) and is equivalent to | |
| @samp{$(patsubst %a,%b,$(var))}. This means that it replaces every | |
| @samp{a} at the end of a whitespace-separated word with a @samp{b}. | |
| For example:@refill | |
| @example | |
| foo := a.o b.o c.o | |
| bar := $(foo:.o=.c) | |
| @end example | |
| @noindent | |
| sets @samp{bar} to @samp{a.c b.c c.c}. @xref{Setting}. | |
| @node Values, Flavors, Reference, Variables | |
| @section How Variables Get Their Values | |
| Variables can get values in several different ways: | |
| @itemize @bullet | |
| @item | |
| You can specify an overriding value when you run @code{make}. | |
| @xref{Overriding}. | |
| @item | |
| You can specify a value in the makefile, either with an assignment | |
| (@pxref{Setting}) or with a verbatim definition (@pxref{Defining}). | |
| @item | |
| Values are inherited from the environment. @xref{Environment}. | |
| @item | |
| Several @dfn{automatic} variables are given new values for each rule. | |
| @xref{Automatic}. | |
| @item | |
| Several variables have constant initial values. @xref{Implicit Variables}. | |
| @end itemize | |
| @node Flavors, Setting, Values, Variables | |
| @section The Two Flavors of Variables | |
| @cindex flavors (of variables) | |
| @cindex recursive variable expansion | |
| There are two kinds of variables in GNU @code{make}. They are | |
| distinguished by two things: how they are defined and how they are expanded. | |
| The first flavor of variable is a @dfn{recursively expanded} variable. | |
| Variables of this sort are defined by lines using @samp{=} | |
| @ifinfo | |
| (@pxref{Setting}). | |
| @end ifinfo | |
| @iftex | |
| (see the next section). | |
| @end iftex | |
| The value you specify is installed verbatim; if it contains references to | |
| other variables, these references are expanded whenever this variable is | |
| substituted (in the course of expanding some other string). When this | |
| happens, it is recursive expansion. | |
| For example, | |
| @example | |
| foo = $(bar) | |
| bar = $(ugh) | |
| ugh = Huh? | |
| all:;echo $(foo) | |
| @end example | |
| @noindent | |
| will echo @samp{Huh?}: @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}. A major disadvantage is that you | |
| can't append something on the end of a variable, as in | |
| @example | |
| CFLAGS = $(CFLAGS) -O | |
| @end example | |
| @noindent | |
| because it will cause an infinite loop in the variable expansion. | |
| (Actually @code{make} detects the infinite loop and reports an error.) | |
| Another disadvantage is that any functions (@pxref{Functions}) referenced | |
| in the definition will be executed every time the variable is expanded. | |
| This makes @code{make} run slower; worse, it causes the @code{wildcard} | |
| function to give unpredictable results. | |
| To avoid all the problems and inconveniences of recursively expanded | |
| variables, there is another flavor: @dfn{simply expanded} variables. | |
| Simply expanded variables are defined by lines using @samp{:=} | |
| @ifinfo | |
| (@pxref{Setting}). | |
| @end ifinfo | |
| @iftex | |
| (see the next section). | |
| @end iftex | |
| The value of a simply expanded variable is scanned once and for all, | |
| expanding any references to other variables and functions, when the | |
| variable is defined. The actual value of the simply expanded variable is | |
| the result of expanding the value you write. It does not contain any | |
| references to other variables; it contains their values @emph{as of the | |
| time this variable was defined}. Therefore, | |
| @example | |
| x := foo | |
| y := $(x) bar | |
| x := later | |
| @end example | |
| @noindent | |
| is equivalent to | |
| @example | |
| y := foo bar | |
| x := later | |
| @end example | |
| When a simply expanded variable is referenced, its value is substituted | |
| verbatim. | |
| Simply expanded variables generally make complicated makefile programming | |
| more predictable 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}). | |
| You can also use them to introduce controlled leading or trailing spaces | |
| into variable values. Such spaces are discarded from your input before | |
| substitution of variable references and function calls; this means you can | |
| include leading or trailing spaces in a variable value by protecting them | |
| with variable references, like this: | |
| @example | |
| nullstring := | |
| space := $(nullstring) $(nullstring) | |
| @end example | |
| @noindent | |
| Here the value of the variable @code{space} is precisely one space. | |
| @node Setting, Override Directive, Flavors, Variables | |
| @section Setting Variables | |
| @cindex setting variables | |
| @cindex = | |
| @cindex := | |
| To set a variable from the makefile, write a line starting with the | |
| variable name followed by @samp{=} or @samp{:=}. Whatever follows the | |
| @samp{=} or @samp{:=} on the line becomes the value. For example, | |
| @example | |
| objects = main.o foo.o bar.o utils.o | |
| @end example | |
| @noindent | |
| defines a variable named @code{objects}. Spaces around the variable name | |
| are ignored, and so are spaces after the @samp{=} or at the end of the | |
| line. | |
| Variables defined with @samp{=} are @dfn{recursively expanded} variables. | |
| Variables defined with @samp{:=} are @dfn{simply expanded} variables; these | |
| definitions can contain variable references which will be expanded before | |
| the definition is made. @xref{Flavors}. | |
| There is no limit on the length of the value of a variable except the | |
| amount of swapping space on the computer. When a variable definition is | |
| long, it is a good idea to break it into several lines by inserting | |
| backslash-newline at convenient places in the definition. This will not | |
| affect the functioning of @code{make}, but it will make the makefile easier | |
| to read. | |
| Most variable names are considered to have the empty string as a value if | |
| you have never set them. Several variables have built-in initial values | |
| that are not empty, but can be set by you in the usual ways | |
| (@pxref{Implicit Variables}). Several special variables are set | |
| automatically to a new value for each rule; these are called the | |
| @dfn{automatic} variables (@pxref{Automatic}). | |
| @node Override Directive, Defining, Setting, Variables | |
| @section The @code{override} Directive | |
| @findex override | |
| If a variable has been set with a command argument (@pxref{Overriding}), | |
| then ordinary assignments in the makefile are ignored. If you want to set | |
| the variable in the makefile even though it was set with a command | |
| argument, you can use an @code{override} directive, which is a line that | |
| looks like this: | |
| @example | |
| override @var{variable} = @var{value} | |
| @end example | |
| or | |
| @example | |
| override @var{variable} := @var{value} | |
| @end example | |
| The @code{override} directive was not invented for escalation in the war | |
| between makefiles and command arguments. It was invented so you can alter | |
| and add to values that the user specifies with command arguments. | |
| For example, suppose you always want the @samp{-g} switch when you run the | |
| C compiler, but you would like to allow the user to specify the other | |
| switches with a command argument just as usual. You could use this | |
| @code{override} directive: | |
| @example | |
| override CFLAGS := $(CFLAGS) -g | |
| @end example | |
| @node Defining, Environment, Override Directive, Variables | |
| @section Defining Variables Verbatim | |
| @findex define | |
| @findex endef | |
| Another way to set the value of a variable is to use the @code{define} | |
| directive. This directive has a different syntax which allows newline | |
| characters to be included in the value, which is convenient for defining | |
| canned sequences of commands (@pxref{Sequences}). | |
| The @code{define} directive is followed on the same line the name of the | |
| variable and nothing more. The value to give the variable appears on the | |
| following lines. The end of the value is marked by a line containing just | |
| the word @code{endef}. Aside from this difference in syntax, @code{define} | |
| works just like @samp{=}; it creates a recursively-expanded variable | |
| (@pxref{Flavors}). | |
| @example | |
| define two-lines | |
| echo foo | |
| echo $(bar) | |
| endef | |
| @end example | |
| The value in an ordinary assignment cannot contain a newline; but the | |
| newlines that separate the lines of the value in a @code{define} become | |
| part of the variable's value (except for the final newline which precedes | |
| the @code{endef} and is not considered part of the value).@refill | |
| The previous example is functionally equivalent to this: | |
| @example | |
| two-lines = echo foo; echo $(bar) | |
| @end example | |
| @noindent | |
| since the shell will interpret the semicolon and the newline identically. | |
| @node Environment,, Defining, Variables | |
| @section Variables from the Environment | |
| @cindex environment | |
| Variables in @code{make} can come from the environment with which | |
| @code{make} is run. Every environment variable that @code{make} sees when | |
| it starts up is transformed into a @code{make} variable with the same name | |
| and value. But an explicit assignment in the makefile, or with a command | |
| argument, overrides the environment. (If the @samp{-e} flag is specified, | |
| then values from the environment override assignments in the makefile. | |
| @xref{Options}. But this is not recommended practice.) | |
| By setting the variable @code{CFLAGS} in your environment, you can cause | |
| all C compilations in most makefiles to use the compiler switches you | |
| prefer. This is safe for variables with standard or conventional meanings | |
| because you know that no makefile will use them for other things. (But | |
| this is not totally reliable; some makefiles set @code{CFLAGS} explicitly | |
| and therefore are not affected by the value in the environment.) | |
| When @code{make} is invoked recursively, variables defined in the outer | |
| invocation are automatically passed to inner invocations through the | |
| environment (@pxref{Recursion}). This is the main purpose of turning | |
| environment variables into @code{make} variables, and it requires no | |
| attention from you. | |
| Other use of variables from the environment is not recommended. It is not | |
| wise for makefiles to depend for their functioning on environment variables | |
| set up outside their control, since this would cause different users to get | |
| different results from the same makefile. This is against the whole | |
| purpose of most makefiles. | |
| Such problems would be especially likely with the variable @code{SHELL}, | |
| which is normally present in the environment to specify the user's choice | |
| of interactive shell. It would be very undesirable for this choice to | |
| affect @code{make}. So @code{make} ignores the environment value of | |
| @code{SHELL} if the value of @code{MAKELEVEL} is zero (which is normally | |
| true except in recursive invocations of @code{make}).@refill | |
| @node Conditionals, Functions, Variables, Top | |
| @chapter Conditional Parts of Makefiles | |
| @cindex conditionals | |
| A @dfn{conditional} causes part of a makefile to be obeyed or ignored | |
| depending on the values of variables. Conditionals can compare the value | |
| of one variable with another, or the value of a variable with a constant | |
| string. Conditionals control what @code{make} actually ``sees'' in the | |
| makefile, so they @emph{cannot} be used to control shell commands at the | |
| time of execution.@refill | |
| @menu | |
| * Example: Conditional Example. An annotated example. | |
| * Syntax: Conditional Syntax. Precise rules for syntax of conditionals. | |
| * Flags: Testing Flags. Conditionals testing flags such as @samp{-t}. | |
| @end menu | |
| @node Conditional Example, Conditional Syntax, Conditionals, Conditionals | |
| @section Example of a Conditional | |
| This conditional tells @code{make} to use one set of libraries if the | |
| @code{CC} variable is @samp{gcc}, and a different set of libraries | |
| otherwise. It works by controlling which of two command lines will be used | |
| as the command for a rule. The result is that @samp{CC=gcc} as an argument | |
| to @code{make} not only changes which compiler is used but also which | |
| libraries are linked. | |
| @example | |
| libs_for_gcc = -lgnu | |
| normal_libs = | |
| foo: $(objects) | |
| ifeq ($(CC),gcc) | |
| $(CC) -o foo $(objects) $(libs_for_gcc) | |
| else | |
| $(CC) -o foo $(objects) $(normal_libs) | |
| endif | |
| @end example | |
| @noindent | |
| This conditional uses three directives: one @code{ifeq}, one @code{else} | |
| and one @code{endif}. | |
| The @code{ifeq} directive contains two arguments, separated by a comma and | |
| surrounded by parentheses. Variable substitution is performed on both | |
| arguments and then they are compared. The lines of the makefile following | |
| the @code{ifeq} are obeyed if the two arguments match; otherwise they are | |
| ignored. | |
| The @code{else} directive causes the following lines to be obeyed if the | |
| previous conditional failed. In the example above, this means that the | |
| second alternative linking command is used whenever the first alternative | |
| is not used. It is optional to have an @code{else} in a conditional. | |
| The @code{endif} directive ends the conditional. Every conditional must | |
| end with an @code{endif}. Unconditional makefile text follows. | |
| When the variable @code{CC} has the value @samp{gcc}, the above example has | |
| this effect: | |
| @example | |
| foo: $(objects) | |
| $(CC) -o foo $(objects) $(libs_for_gcc) | |
| @end example | |
| @noindent | |
| When the variable @code{CC} has any other value, this effect is this: | |
| @example | |
| foo: $(objects) | |
| $(CC) -o foo $(objects) $(normal_libs) | |
| @end example | |
| Equivalent results can be obtained in another way by conditionalizing a | |
| variable assignment and then using the variable unconditionally: | |
| @example | |
| libs_for_gcc = -lgnu | |
| normal_libs = | |
| ifeq ($(CC),gcc) | |
| libs=$(libs_for_gcc) | |
| else | |
| libs=$(normal_libs) | |
| endif | |
| foo: $(objects) | |
| $(CC) -o foo $(objects) $(libs) | |
| @end example | |
| @node Conditional Syntax, Testing Flags, Conditional Example, Conditionals | |
| @section Syntax of Conditionals | |
| @findex ifdef | |
| @findex ifeq | |
| @findex else | |
| @findex endif | |
| The syntax of a simple conditional with no @code{else} is as follows: | |
| @example | |
| @var{conditional-directive} | |
| @var{text-if-true} | |
| endif | |
| @end example | |
| @noindent | |
| The @var{text-if-true} may be any lines of text, to be considered as part | |
| of the makefile if the condition is true. If the condition is false, no | |
| text is used instead. | |
| The syntax of a complex conditional is as follows: | |
| @example | |
| @var{conditional-directive} | |
| @var{text-if-true} | |
| else | |
| @var{text-if-false} | |
| endif | |
| @end example | |
| @noindent | |
| If the condition is true, @var{text-if-true} is used; otherwise, | |
| @var{text-if-false} is used instead. The @var{text-if-false} can be any | |
| number of lines of text. | |
| Conditionals work at the textual level. The lines of the | |
| @var{text-if-true} are read as part of the makefile if the condition is | |
| true; if the condition is false, those lines are ignored completely. It | |
| follows that syntactic units of the makefile, such as rules, may safely be | |
| split across the beginning or the end of the conditional.@refill | |
| You may use an @code{include} directive within a conditional, but you may | |
| not start a conditional in one file and end it in another. | |
| The syntax of the @var{conditional-directive} is the same whether the | |
| conditional is simple or complex. There are four different directives that | |
| test different conditions. Here is a table of them: | |
| @table @code | |
| @item ifeq (@var{arg1}, @var{arg2}) | |
| Expand all variable references in @var{arg1} and @var{arg2} and | |
| compare them. If they are identical, the @var{text-if-true} is | |
| effective; otherwise, the @var{text-if-false}, if any, is effective. | |
| @item ifneq (@var{arg1}, @var{arg2}) | |
| Expand all variable references in @var{arg1} and @var{arg2} and | |
| compare them. If they are different, the @var{text-if-true} is | |
| effective; otherwise, the @var{text-if-false}, if any, is effective. | |
| @item ifdef @var{variable-name} | |
| If the variable @var{variable-name} has a non-empty value, the | |
| @var{text-if-true} is effective; otherwise, the @var{text-if-false}, | |
| if any, is effective. Variables that have never been defined have an | |
| empty value. | |
| @item ifndef @var{variable-name} | |
| If the variable @var{variable-name} has an empty value, the | |
| @var{text-if-true} is effective; otherwise, the @var{text-if-false}, | |
| if any, is effective. | |
| @end table | |
| Extra spaces are allowed and ignored at the beginning of the conditional | |
| directive line, but a tab is not allowed. (If the line begins with a tab, | |
| it will be considered a command for a rule.) Aside from this, extra spaces | |
| or tabs may be inserted with no effect anywhere except within the directive | |
| name or within an argument. A comment starting with @samp{#} may appear at | |
| the end of the line. | |
| The other two directives that play a part in a conditional are @code{else} | |
| and @code{endif}. Each of these directives is written as one word, with no | |
| arguments. Extra spaces are allowed and ignored at the beginning of the | |
| line, and spaces or tabs at the end. A comment starting with @samp{#} may | |
| appear at the end of the line. | |
| @node Testing Flags,, Conditional Syntax, Conditionals | |
| @section Conditionals that Test Flags | |
| You can write a conditional that tests @code{make} command flags such as | |
| @samp{-t} by using the variable @code{MAKEFLAGS} together with the | |
| @code{findstring} function. This is useful when @code{touch} is not | |
| enough to make a file appear up to date. | |
| The @code{findstring} function determines whether one string appears as a | |
| substring of another. If you want to test for the @samp{-t} flag, | |
| use @samp{t} as the first string and the value of @code{MAKEFLAGS} as | |
| the other. | |
| For example, here is how to arrange to use @samp{ranlib -t} to finish | |
| marking an archive file up to date: | |
| @example | |
| archive.a: @dots{} | |
| ifneq (,$(findstring t,$(MAKEFLAGS))) | |
| @@echo $(MAKE) > /dev/null | |
| touch archive.a | |
| ranlib -t archive.a | |
| else | |
| ranlib archive.a | |
| endif | |
| @end example | |
| @noindent | |
| The @code{echo} command does nothing when executed; but its presence, with | |
| a reference to the variable @code{MAKE}, marks the rule as ``recursive'' so | |
| that its commands will be executed despite use of the @samp{-t} flag. | |
| @xref{Recursion}. | |
| @node Functions, Running, Conditionals, Top | |
| @chapter Functions for Transforming Text | |
| @cindex function | |
| @dfn{Functions} allow you to do text processing in the makefile to compute | |
| the files to operate on or the commands to use. 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: Function Syntax. Syntax of function calls in general. | |
| * Text Functions:: Text manipulation functions. | |
| * Foreach Function:: The @code{foreach} function. | |
| * Filename Functions:: Functions for manipulating file names. | |
| @end menu | |
| @node Function Syntax, Text Functions, Functions, Functions | |
| @section Function Call Syntax | |
| @cindex $ (function call) | |
| @cindex arguments | |
| A function call resembles a variable reference. It looks like this: | |
| @example | |
| $(@var{function} @var{arguments}) | |
| @end example | |
| @noindent | |
| or like this: | |
| @example | |
| $@{@var{function} @var{arguments}@} | |
| @end example | |
| Here @var{function} is a function name; one of a short list of names that | |
| are part of @code{make}. There is no provision for defining new functions. | |
| The @var{arguments} are the arguments of the function. They are separated | |
| from the function name by one or more spaces and/or tabs, and if there is | |
| more than one argument they are separated by commas. Such whitespace and | |
| commas are not part of any argument's value. Parentheses or braces, | |
| whichever you use to surround the function call, can appear in an argument | |
| only in matching pairs; the ones that were not used to surround the | |
| function call can appear freely. If the arguments contain other function | |
| calls or variable references, it is wisest to surround them with the same | |
| delimiters used for the containing function call. | |
| The text written for each argument is processed by substitution of | |
| variables and function calls in order to produce the argument value, which | |
| is the text on which the function acts. | |
| Commas and unmatched parentheses or braces cannot appear in the text of an | |
| argument as written; leading spaces cannot appear in the text of the first | |
| argument as written. These characters can be put into the argument value | |
| by variable substitution. First define variables @code{comma} and | |
| @code{space} whose values are isolated comma and space characters, then | |
| substitute those variables where such characters are wanted, like this: | |
| @example | |
| comma:= , | |
| space:= $(empty) $(empty) | |
| foo:= a b c | |
| bar:= $(subst $(space),$(comma),$(foo)) | |
| # @r{bar is now `a,b,c'.} | |
| @end example | |
| @noindent | |
| Here the @code{subst} function replaces each space with a comma, through | |
| the value of @code{foo}, and substitutes the result. | |
| @node Text Functions, Foreach Function, Function Syntax, Functions | |
| @section Functions for String Substitution and Analysis | |
| Here are some functions that operate on substrings of a string: | |
| @table @code | |
| @item $(subst @var{from},@var{to},@var{text}) | |
| @findex subst | |
| Performs a textual replacement on the text @var{text}: each occurrence | |
| of @var{from} is replaced by @var{to}. The result is substituted for | |
| the function call. For example, | |
| @example | |
| $(subst ee,EE,feet on the street) | |
| @end example | |
| substitutes the string @samp{fEEt on the strEEt}. | |
| @item $(patsubst @var{pattern},@var{replacement},@var{text}) | |
| @findex patsubst | |
| Finds whitespace-separated words in @var{text} that match | |
| @var{pattern} and replaces them with @var{replacement}. Here | |
| @var{pattern} may contain a @samp{%} which acts as a wildcard, | |
| matching any number of any characters within a word. If | |
| @var{replacement} also contains a @samp{%}, the @samp{%} is replaced | |
| by the text that matched the @samp{%} in @var{pattern}. | |
| Whitespace between words is folded into single space characters; | |
| leading and trailing whitespace is discarded. | |
| @item $(strip @var{string}) | |
| @findex strip | |
| Removes leading and trailing whitespace from @var{string} and replaces | |
| each internal sequence of one or more whitespace characters with a | |
| single space. | |
| @item $(findstring @var{find},@var{in}) | |
| @findex findstring | |
| Searches @var{in} for an occurrence of @var{find}. If it occurs, the | |
| value is @var{find}; otherwise, the value is empty. You can use this | |
| function in a conditional to test for the presence of a specific | |
| substring in a given string. @xref{Testing Flags}, for a practical | |
| application of @code{findstring}. | |
| @item $(filter @var{pattern},@var{text}) | |
| @findex filter | |
| Removes all whitespace-separated words in @var{text} that do @emph{not} | |
| match @var{pattern}, returning only matching words. The pattern is one | |
| using @samp{%} as used in the @code{patsubst} function. This can be used | |
| to separate out different types of strings (such as filenames) in a variable. | |
| For example:@refill | |
| @example | |
| sources := foo.c bar.c ugh.h | |
| foo: $(sources) | |
| cc $(filter %.c,$(sources)) -o foo | |
| @end example | |
| @noindent | |
| says that @file{foo} depends of @file{foo.c}, @file{bar.c} and | |
| @file{ugh.h} but only @file{foo.c} and @file{bar.c} should be specified | |
| in the command to the compiler.@refill | |
| @item $(filter-out @var{pattern},@var{text}) | |
| @findex filter-out | |
| Removes all whitespace-separated words in @var{text} that @emph{do} | |
| match @var{pattern}, returning only matching words. This is the exact | |
| opposite of the @code{filter} function.@refill | |
| @item $(sort @var{list}) | |
| @findex sort | |
| Sorts the words of @var{list} in lexical order, removing duplicate | |
| words. The output is a list of words separated by single spaces. | |
| @end table | |
| Here is a realistic example of the use of @code{subst}. Suppose that a | |
| makefile uses the @code{VPATH} variable to specify a list of directories | |
| that @code{make} should search for dependency files. This example shows | |
| how to tell the C compiler to search for header files in the same list of | |
| directories. | |
| The value of @code{VPATH} is a list of directories separated by colons, | |
| such as @samp{src:../headers}. First, the @code{subst} function is used to | |
| change the colons to spaces: | |
| @example | |
| $(subst :, ,$(VPATH)) | |
| @end example | |
| @noindent | |
| This produces @samp{src ../headers}. Then another function, | |
| @code{addprefix}, can turn each directory name into an @samp{-I} flag. | |
| These can be added to the value of the variable @code{CFLAGS}, which is | |
| passed automatically to the C compiler, like this: | |
| @example | |
| override CFLAGS:= $(CFLAGS) $(addprefix -I,$(subst :, ,$(VPATH))) | |
| @end example | |
| @noindent | |
| The effect is to append the text @samp{-Isrc -I../headers} to the | |
| previously given value of @code{CFLAGS}. The @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 function @code{strip} can be very useful when used in conjunction | |
| with conditionals. When comparing something with the null string | |
| @samp{""} using @code{ifeq} or @code{ifneq}, you usually want a string | |
| of just whitespace to match the null string. Thus, | |
| @example | |
| .PHONY: all | |
| ifneq "$(needs_made)" "" | |
| all: $(needs_made) | |
| else | |
| all:;@@echo 'Nothing to make!' | |
| endif | |
| @end example | |
| @noindent | |
| might fail to have the desired results. Replacing the variable reference | |
| @samp{"$(needs_made)"} with the function call @samp{"$(strip | |
| $(needs_made))"} in the @code{ifneq} directive would make it more robust. | |
| @node Foreach Function, Filename Functions, Text Functions, Functions | |
| @section The @code{foreach} Function | |
| @findex foreach | |
| 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 | |
| @emph{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 the expansions 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 | |
| find_files = $(wildcard $(dir)/*) | |
| dirs := a b c d | |
| files := $(foreach dir,$(dirs),$(find_files)) | |
| @end example | |
| For readability, it is a good idea to put the @var{text} part of a | |
| @code{foreach} function invokation into a variable. Here we use the | |
| variable @code{find_file} this way. We make this a recursively-expanding | |
| variable by using @samp{=} to define it. This is necessary so that when | |
| its value is substituted by @code{foreach} the value is rescanned for | |
| variable references and function calls. This is what causes the | |
| @code{wildcard} function actually to be called. | |
| This example has the same result (except for setting @samp{find_files}, | |
| @samp{dirs} and @samp{dir}) as the following example: | |
| @example | |
| files := $(wildcard a/* b/* c/* d/*) | |
| @end example | |
| The value of the variable @var{var} after the @code{foreach} function call | |
| is the same as the value beforehand. Other values 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} but is returned to the same flavor it was before the | |
| @code{foreach} when it is done. @xref{Flavors}. | |
| If @var{var} was previously undefined, then it is defined as a recursively | |
| expanded variable (@samp{=}, not @samp{:=}) during the @code{foreach} and | |
| remains so (with a null value) afterward. | |
| Because it is expanded before @code{foreach} runs, the @var{var} argument | |
| to @code{foreach} need not be a literal variable name. It can instead be a | |
| variable expression resulting in the name. Thus, | |
| @example | |
| dir := a | |
| var = $(whatsthevar) | |
| foo := dar | |
| whatsthevar := $(subst a,i,$(foo)) | |
| files := $(foreach $(var),$(dirs),$(find_files)) | |
| @end example | |
| @noindent | |
| is ultimately equivalent to the first example. You must take care when | |
| using complex variable expressions that result in variable names because | |
| many strange things are legal variable names, and these might not be what | |
| you intended. For example, | |
| @example | |
| files := $(foreach Es escrito en espanol!,b c ch,$(find_files)) | |
| @end example | |
| @noindent | |
| might be useful if @samp{find_files} references the variable @samp{Es | |
| escrito en espanol!} (es un nombre bastante largo, no?), but it is more | |
| likely to be a mistake. | |
| @node Filename Functions,, Foreach Function, Functions | |
| @section Functions for File Names | |
| Several of the built-in expansion functions relate specifically to | |
| taking apart file names or lists of file names. | |
| Each of these functions performs a specific transformation on a file name. | |
| The argument of the function is regarded as a series of file names, | |
| separated by whitespace. (Leading and trailing whitespace is ignored.) | |
| Each file name in the series is transformed in the same way and the results | |
| are concatenated with single spaces between them. | |
| @table @code | |
| @item $(dir @var{names}) | |
| @findex dir | |
| Extracts the directory-part of each file name in @var{names}. The | |
| directory-part of the file name is everything up through (and | |
| including) the last slash in it. If the file name contains no slash, | |
| the directory part is the string @samp{./}. For example, | |
| @example | |
| $(dir src/foo.c hacks) | |
| @end example | |
| @noindent | |
| produces the result @samp{src/ ./}. | |
| @item $(notdir @var{names}) | |
| @findex notdir | |
| Extracts all but the directory-part of each file name in @var{names}. | |
| If the file name contains no slash, it is left unchanged. Otherwise, | |
| everything through the last slash is removed from it. A file name | |
| that ends with a slash becomes an empty string. This is unfortunate, | |
| because it means that the result does not always have the same number | |
| of whitespace-separated file names as the argument had; but we do not | |
| see any other valid alternative. | |
| For example, | |
| @example | |
| $(notdir src/foo.c hacks) | |
| @end example | |
| @noindent | |
| produces the result @samp{foo.c hacks}. | |
| @item $(suffix @var{names}) | |
| @findex suffix | |
| Extracts the suffix of each file name in @var{names}. If the file name | |
| contains a period, the suffix is everything starting with the last | |
| period. Otherwise, the suffix is the empty string. This frequently | |
| means that the result will be empty when @var{names} is not, and if | |
| @var{names} contains multiple file names, the result may contain fewer | |
| file names. | |
| For example, | |
| @example | |
| $(suffix src/foo.c hacks) | |
| @end example | |
| @noindent | |
| produces the result @samp{.c}. | |
| @item $(basename @var{names}) | |
| @findex basename | |
| Extracts all but the suffix of each file name in @var{names}. If the | |
| file name contains a period, the basename is everything starting up to | |
| (and not including) the last period. Otherwise, the basename is the | |
| entire file name. For example, | |
| @example | |
| $(basename src/foo.c hacks) | |
| @end example | |
| @noindent | |
| produces the result @samp{src/foo hacks}. | |
| @item $(addsuffix @var{suffix},@var{names}) | |
| @findex addsuffix | |
| The argument @var{names} is regarded as a series of names, separated | |
| by whitespace; @var{suffix} is used as a unit. The value of | |
| @var{suffix} is appended to the end of each individual name and the | |
| resulting larger names are concatenated with single spaces between | |
| them. For example, | |
| @example | |
| $(addsuffix .c,foo bar) | |
| @end example | |
| @noindent | |
| produces the result @samp{foo.c bar.c}. | |
| @item $(addprefix @var{prefix},@var{names}) | |
| @findex addprefix | |
| The argument @var{names} is regarded as a series of names, separated | |
| by whitespace; @var{prefix} is used as a unit. The value of | |
| @var{prefix} is appended to the front of each individual name and the | |
| resulting larger names are concatenated with single spaces between | |
| them. For example, | |
| @example | |
| $(addprefix src/,foo bar) | |
| @end example | |
| @noindent | |
| produces the result @samp{src/foo src/bar}. | |
| @item $(join @var{list1},@var{list2}) | |
| @findex join | |
| Concatenates the two arguments word by word: the two first words (one | |
| from each argument) concatenated form the first word of the result, the | |
| two second words form the second word of the result, and so on. So the | |
| @var{n}th word of the result comes from the @var{n}th word of each | |
| argument. If one argument has more words that the other, the extra | |
| words are copied unchanged into the result. | |
| 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 reverse the effect of the @code{dir} and @code{notdir} | |
| functions, after other processing has been done on the separated lists | |
| of directories and files.@refill | |
| @item $(firstword @var{names}) | |
| @findex firstword | |
| The argument @var{names} is regarded as a series of names, separated | |
| by whitespace. The value is the first name in the series. The rest | |
| of the names are ignored. For example, | |
| @example | |
| $(firstword foo bar) | |
| @end example | |
| @noindent | |
| produces the result @samp{foo}. | |
| @item $(wildcard @var{pattern}) | |
| @findex wildcard | |
| The argument @var{pattern} is a file name pattern, typically containing | |
| wildcard characters. The result of @code{wildcard} is a space-separated | |
| list of the names of existing files that match the pattern. | |
| Wildcards are expanded automatically in rules (@pxref{Wildcards}). | |
| But they are not normally expanded when a variable is set, or inside the | |
| arguments of other functions. Those occasions are when the @code{wildcard} | |
| function is useful. | |
| @end table | |
| @node Running, Implicit, Functions, Top | |
| @chapter How to Run @code{make} | |
| A makefile that says how to recompile a program can be used in more than | |
| one way. The simplest use is to recompile every file that is out of date. | |
| This is what @code{make} will do if run with no arguments. | |
| But you might want to update only some of the files; you might want to use | |
| a different compiler or different compiler options; you might want just to | |
| find out which files are out of date without changing them. | |
| By specifying arguments when you run @code{make}, you can do any of these | |
| things or many others. | |
| @menu | |
| * Makefile Arguments:: Arguments to specify which makefile to use. | |
| * Goals:: Goal arguments specify which parts of the makefile | |
| should be used. | |
| * Avoid Compilation:: How to avoid recompiling certain files. | |
| * Instead of Execution:: Mode flags specify what kind of thing to do | |
| with the commands in the makefile | |
| other than simply execute them. | |
| * Overriding:: Overriding a variable can specify an alternate | |
| compiler, or alternate flags for the compiler, | |
| or whatever else you program into the makefile. | |
| * Testing:: How to proceed past some errors, to test compilation. | |
| * Options:: Summary of all options @code{make} accepts. | |
| @end menu | |
| @node Makefile Arguments, Goals, Running, Running | |
| @section Arguments to Specify the Makefile | |
| The way to specify the name of the makefile is with the @samp{-f} option. | |
| For example, @samp{-f altmake} says to use the file @file{altmake} as | |
| the makefile. | |
| If you use the @samp{-f} flag several times (each time with a | |
| following argument), all the specified files are used jointly as | |
| makefiles. | |
| If you do not use the @samp{-f} flag, the default is to use | |
| @file{./makefile}, or, if that does not exist, @file{./Makefile}. | |
| @xref{Makefiles}.@refill | |
| @node Goals, Avoid Compilation, Makefile Arguments, Running | |
| @section Goals | |
| @cindex goal | |
| The @dfn{goals} are the targets that @code{make} should strive ultimately | |
| to update. Other targets are updated as well if they appear as | |
| dependencies of goals, or dependencies of dependencies of goals, etc. | |
| By default, the goal is the first target in the makefile (not counting | |
| targets that start with a period or that appear in included makefiles). | |
| Therefore, makefiles are usually written so that the first target is for | |
| compiling the entire program or programs they describe. | |
| You can specify a different goal or goal with arguments to @code{make}. | |
| Use the name of the goal as an argument. If you specify several goals, | |
| @code{make} processes each of them in turn, in the order you name them. | |
| Any target in the makefile may be specified as a goal (unless it starts | |
| with @samp{-} or contains an @samp{=}). Even targets not in the makefile | |
| may be specified, if @code{make} can find implicit rules that say how to | |
| make them. | |
| One use of specifying a goal is if you want to compile only a part of | |
| the program, or only one of several programs. Specify as a goal each | |
| file that you wish to remake. For example, consider a directory containing | |
| a several programs, with a makefile that starts like this: | |
| @example | |
| .PHONY: all | |
| all: size nm ld ar as | |
| @end example | |
| If you are working on the program @code{size}, you might want to say | |
| @samp{make size} so that only the files of that program are recompiled. | |
| Another use of specifying a goal is to make files that aren't normally | |
| made. For example, there may be a file of debugging output, or a version | |
| of the program that is compiled specially for testing, which has a rule | |
| in the makefile but isn't a dependency of the default goal. | |
| Another use of specifying a goal is to run the commands associated with a | |
| phony target (@pxref{Phony Targets}) or empty target (@pxref{Empty Targets}). | |
| Many makefiles contain a phony target named @file{clean} which deletes | |
| everything except source files. Naturally, this is done only if you | |
| request it explicitly with @samp{make clean}. Here is a list of typical | |
| phony and empty target names: | |
| @table @file | |
| @item all | |
| Make all the top-level targets the makefile knows about. | |
| @item clean | |
| Delete all files that the makefile could remake. | |
| @item clobber | |
| Delete absolutely everything the makefile could remake (whereas | |
| @samp{make clean} often leaves intact some files that might take a | |
| long time to remake). | |
| @item install | |
| 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 | |
| Print listings of the source files that have changed. | |
| @item tar | |
| Create a tar file of the source files. | |
| @item shar | |
| Create a shell archive (shar file) of the source files. | |
| @end table | |
| @node Avoid Compilation, Instead of Execution, Goals, Running | |
| @section Avoiding Recompilation of Some Files | |
| @cindex -o | |
| Sometimes you may have changed a source file but you don't want to | |
| recompile all the files that depend on it. For example, suppose you add a | |
| macro or a declaration to a header file that many other files depend on. | |
| Being conservative, @code{make} assumes that any change in the header file | |
| requires recompilation of all dependent files, but you know that they don't | |
| need to be recompiled and you would rather not waste the time waiting. | |
| If you anticipate the problem before making the change, you can use the | |
| @samp{-t} flag. This flag tells @code{make} not to run the commands in the | |
| rules, but rather to mark the target up to date by changing its | |
| last-modification date. You would follow this procedure: | |
| @enumerate | |
| @item | |
| Use the command @samp{make} to recompile the source files that really | |
| need recompilation. | |
| @item | |
| Make the changes in the header files. | |
| @item | |
| Use the command @samp{make -t} to mark all the object files as | |
| up to date. The next time you run @code{make}, the changes in the | |
| header files will not cause any recompilation. | |
| @end enumerate | |
| If you have already changed the header file at a time when some files do | |
| need recompilation, it is too late to do this. Instead, you can use the | |
| @samp{-o @var{file}} flag, which marks a specified file as ``old'' | |
| (@pxref{Options}). This means that the file itself won't be remade, | |
| and nothing else will be remade on its account. Follow this procedure: | |
| @enumerate | |
| @item | |
| Recompile the source files that need compilation for reasons independent | |
| of the particular header file, with @samp{make -o @var{headerfile}}. | |
| If several header files are involved, use a separate @samp{-o} option | |
| for each header file. | |
| @item | |
| Touch all the object files with @samp{make -t}. | |
| @end enumerate | |
| @node Instead of Execution, Overriding, Avoid Compilation, Running | |
| @section Instead of Executing the Commands | |
| @cindex -t | |
| @cindex touch | |
| @cindex -q | |
| @cindex -n | |
| The makefile tells @code{make} how to tell whether a target is up to date, | |
| and how to update each target. But updating the targets is not always | |
| what you want. Certain options specify other activities for @code{make}. | |
| @table @samp | |
| @item -t | |
| ``Touch''. The activity is to mark the targets as up to date without | |
| actually changing them. In other words, @code{make} pretends to compile | |
| the targets but does not really change their contents. | |
| @item -n | |
| ``No-op''. The activity is to print what commands would be used to make | |
| the targets up to date, but not actually execute them. | |
| @item -q | |
| ``Question''. The activity is to find out silently whether the targets | |
| are up to date already; but execute no commands in either case. In other | |
| words, neither compilation nor output will occur. | |
| @end table | |
| With the @samp{-n} flag, @code{make} prints without execution the commands | |
| that it would normally execute. | |
| With the @samp{-t} flag, @code{make} ignores the commands in the rules | |
| and uses (in effect) the command @code{touch} for each target that needs to | |
| be remade. The @code{touch} command is also printed, unless @samp{-s} or | |
| @code{.SILENT} is used. For speed, @code{make} does not actually invoke | |
| the program @code{touch}. It does the work directly. | |
| With the @samp{-q} flag, @code{make} prints nothing and executes no | |
| commands, but the exit status code it returns is zero if and only if the | |
| targets to be considered are already up to date. | |
| It is an error to use more than one of these three flags in the same | |
| invocation of @code{make}. | |
| If you are not at all interested in what @code{make} @emph{would} do, | |
| but rather in some other information about @code{make}, there are two | |
| options: the command line @samp{make -p -f /dev/null} will print the | |
| information in @code{make}'s database of variables, rules, directories | |
| and files and @samp{make -v -f /dev/null} will print information about | |
| what version of GNU @code{make} you are using. @xref{Options}.@refill | |
| @node Overriding, Testing, Instead of Execution, Running | |
| @section Overriding Variables | |
| You can override the value of a variable using an argument to @code{make} | |
| that contains a @samp{=}. The argument @samp{@var{v}=@var{x}} (or | |
| @samp{@var{v}:=@var{x}}; @pxref{Flavors}) sets the value of the variable | |
| @var{v} to @var{x}. | |
| Values specified this way override all values specified in the makefile | |
| itself; once you have set a variable with a command argument, any ordinary | |
| attempt in the makefile to change that variable is simply ignored. | |
| One way to use this facility is to pass extra flags to compilers. | |
| For example, in a properly written makefile, the variable @code{CFLAGS} | |
| is included in each command that runs the C compiler, so a file | |
| @file{foo.c} would be compiled like this: | |
| @example | |
| cc -c $(CFLAGS) foo.c | |
| @end example | |
| Thus, whatever value you set for @code{CFLAGS} affects each compilation | |
| that occurs. The makefile probably specifies the usual value for | |
| @code{CFLAGS}, like this: | |
| @example | |
| CFLAGS=-g | |
| @end example | |
| Each time you run @code{make}, you can override this value and specify a | |
| different value. For example, if you say @samp{make CFLAGS='-g -O'}, each | |
| C compilation will be done with @samp{cc -c -g -O}. (This illustrates how | |
| you can enclose spaces and other special characters in the value of a | |
| variable when you override it.) | |
| The variable @code{CFLAGS} is only one of many standard variables that | |
| exist just so that you can change them this way. | |
| @xref{Implicit Variables}, for a complete list. | |
| You can also program the makefile to look at additional variables of your | |
| own, giving the user ability to control other aspects of how the makefile | |
| works by changing the variables. | |
| There is one way that the makefile can change a variable that you have | |
| overridden. This is to use the @code{override} directive, which is a line | |
| that looks like this: @samp{override @var{variable} = @var{value}}. | |
| @xref{Override Directive}. | |
| @node Testing, Options, Overriding, Running | |
| @section Testing the Compilation of a Program | |
| Normally, when an error happens in executing a shell command, @code{make} | |
| gives up immediately, returning a nonzero status. No further commands are | |
| executed for any target. The error implies that the goal cannot be | |
| correctly remade, 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 all the compilation errors. | |
| @cindex -k | |
| On these occasions, you should use the @samp{-k} 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 | |
| contuing after failing shell commands, @samp{make -k} will continue as much | |
| as possible after discovering that it doesn't 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. @xref{Options}. | |
| The usual behavior of @code{make} assumes that your purpose is to get the | |
| goals up to date; once @code{make} learns that this is impossible, it might | |
| as well report the failure immediately. The @samp{-k} flag says that the | |
| real purpose is to test as much as possible of the changes made in the | |
| program, perhaps to find several independent problems so that you can | |
| correct them all before the next attempt to compile. This is why Emacs's | |
| @code{compile} command passes the @samp{-k} flag by default. | |
| @node Options,, Testing, Running | |
| @section Summary of Options | |
| @cindex options | |
| @cindex flags | |
| Here is a table of all the options @code{make} understands: | |
| @table @samp | |
| @item -b | |
| @itemx -m | |
| These options are ignored for compatibility with other versions of @code{make}. | |
| @item -c @var{dir} | |
| Change to directory @var{dir} before executing the rules. If multiple | |
| @samp{-c} options are specified, each is interpreted relative to the | |
| previous one: @samp{-c / -c etc} is equivalent to @samp{-c /etc}. | |
| This is typically used with recursive invocations of @code{make} | |
| (@pxref{Recursion}). | |
| @item -d | |
| Print debugging information in addition to normal processing. The | |
| debugging information says which files are being considered for | |
| remaking, which file-times are being compared and with what results, | |
| which files actually need to be remade, which implicit rules are | |
| considered and which are applied---everything interesting about how | |
| @code{make} decides what to do. | |
| @item -f @var{file} | |
| Use file @var{file} as a makefile. @xref{Makefiles}. | |
| @item -i | |
| Ignore all errors in commands executed to remake files. | |
| @xref{Errors}. | |
| @item -I @var{dir} | |
| Specifies a directory @var{dir} to search for included makefiles. | |
| @xref{Include}. If several @samp{-I} options are used to specify | |
| several directories, the directories are searched in the order | |
| specified. | |
| @item -k | |
| Continue as much as possible after an error. While the target that | |
| failed, and those that depend on it, cannot be remade, the other | |
| dependencies of these targets can be processed all the same. | |
| @xref{Testing}. | |
| @item -n | |
| Print the commands that would be executed, but do not execute them. | |
| @xref{Instead of Execution}. | |
| @item -o @var{file} | |
| Do not remake the file @var{file} even if it is older than its | |
| dependencies, and do not remake anything on account of changes in | |
| @var{file}. Essentially the file is treated as very old and its rules | |
| are ignored. @xref{Avoid Compilation}. | |
| @item -p | |
| Print the data base (rules and variable values) that results from | |
| reading the makefiles; then execute as usual or as otherwise | |
| specified. This also prints the version information given by | |
| the @samp{-v} switch (see below). To print the data base without | |
| trying to remake any files, use @samp{make -p -f /dev/null}. | |
| @item -q | |
| ``Question mode''. Do not run any commands, or print anything; just | |
| return an exit status that is zero if the specified targets are | |
| already up to date, nonzero otherwise. @xref{Instead of Execution}. | |
| @item -r | |
| Eliminate use of the built-in implicit rules (@pxref{Implicit}). | |
| Also clear out the default list of suffixes for suffix rules | |
| (@pxref{Suffix Rules}). | |
| @item -s | |
| Silent operation; do not print the commands as they are executed. | |
| @xref{Echoing}. | |
| @item -S | |
| Cancel the effect of the @samp{-k} option. This is never necessary | |
| except in a recursive @code{make} where @samp{-k} might be inherited | |
| from the top-level @code{make} via @code{MAKEFLAGS} (@pxref{Recursion}) | |
| or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill | |
| @item -t | |
| Touch files (mark them up to date without really changing them) | |
| instead of running their commands. This is used to pretend (to fool | |
| future invocations of @code{make}) that the commands were done. | |
| @xref{Instead of Execution}. | |
| @item -v | |
| Print the version of the @code{make} program plus a copyright, | |
| list of authors and notice of (non)warranty (short). | |
| After this information is printed, processing continues normally. | |
| To get the version information without doing anything else, | |
| use @samp{make -v -f /dev/null}. | |
| @item -w | |
| Print a message containing the working directory both before and after | |
| executing the makefile; this is useful for tracking down errors from | |
| builds of large directory trees. @xref{Recursion}. | |
| @end table | |
| @node Implicit, Archives, Running, Top | |
| @chapter Using Implicit Rules | |
| @cindex implicit rule | |
| Certain standard ways of remaking target files are used very often. For | |
| example, one customary way to make an object file is from a C source file | |
| using the C compiler, @code{cc}. | |
| @dfn{Implicit rules} tell @code{make} how to use customary techniques so | |
| that you don't have to specify them in detail when you want to use them. | |
| For example, there is an implicit rule for C compilation. | |
| Implicit rules work based on file names. For example, C compilation typically | |
| takes a @file{.c} file and makes a @file{.o} file. So @code{make} applies | |
| the implicit rule when it sees this combination of file-name endings. | |
| A chain of implicit rules can apply in sequence; for example, @code{make} | |
| will remake a @file{.o} file from a @file{.y} file by way of a @file{.c} file. | |
| @iftex | |
| @xref{Chained Rules}. | |
| @end iftex | |
| The built-in implicit rules use several variables in their commands so | |
| that, by changing the values of the variables, you can change the way the | |
| implicit rule works. For example, the variable @code{CFLAGS} controls the | |
| flags given to the C compiler by the implicit rule for C compilation. | |
| @iftex | |
| @xref{Implicit Variables}. | |
| @end iftex | |
| You can define your own implicit rules by writing @dfn{pattern rules}. | |
| @iftex | |
| @xref{Pattern Rules}. | |
| @end iftex | |
| @menu | |
| * Using Implicit:: How to use an existing implicit rule | |
| to get the commands for updating a file. | |
| * Catalogue of Rules:: Catalogue of built-in implicit rules. | |
| * Implicit Variables:: By changing certain variables, you can | |
| change what the predefined implicit rules do. | |
| * Chained Rules:: Using a chain of implicit rules. | |
| * Pattern Rules:: Defining new implicit rules. | |
| * Search Algorithm:: Precise algorithm for applying implicit rules. | |
| @end menu | |
| @node Using Implicit, Catalogue of Rules, Implicit, Implicit | |
| @section Using Implicit Rules | |
| To allow @code{make} to find a customary method for updating a target file, | |
| all you have to do is refrain from specifying commands yourself. Either | |
| write a rule with no command lines, or don't write a rule at all. Then | |
| @code{make} will figure out which implicit rule to use based on which | |
| kind of source file exists. | |
| For example, suppose the makefile looks like this: | |
| @example | |
| foo : foo.o bar.o | |
| cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) | |
| @end example | |
| @noindent | |
| Because you mention @file{foo.o} but do not give a rule for it, @code{make} | |
| will automatically look for an implicit rule that tells how to update it. | |
| This happens whether or not the file @file{foo.o} currently exists. | |
| If an implicit rule is found, it supplies both commands and a dependency | |
| (the source file). You would want to write a rule for @file{foo.o} with no | |
| command lines if you need to specify additional dependencies, such as | |
| header files, that the implicit rule cannot supply. | |
| Each implicit rule has a target pattern and dependency patterns. There may | |
| be many implicit rules with the same target pattern. For example, numerous | |
| rules make @samp{.o} files: one, from a @samp{.c} file with the C compiler; | |
| another, from a @samp{.p} file with the Pascal compiler; and so on. The rule | |
| that actually applies is the one whose dependency exists or can be made. | |
| So, if you have a file @file{foo.c}, @code{make} will run the C compiler; | |
| otherwise, if you have a file @file{foo.p}, @code{make} will run the Pascal | |
| compiler; and so on. | |
| Of course, when you write the makefile, you know which implicit rule you | |
| want @code{make} to use, and you know it will choose that one because you | |
| know which other files are supposed to exist. @xref{Catalogue of Rules}, | |
| for a catalogue of all the predefined implicit rules. | |
| Above, we said an implicit rule applies if the required dependency ``exists | |
| or can be made''. A file ``can be made'' if it is mentioned explicitly in | |
| the makefile as a target or a dependency, or if an implicit rule can be | |
| recursively found for how to make it. When the implicit dependency is the | |
| result of another implicit rule, we say that @dfn{chaining} is occurring. | |
| @xref{Chained Rules}. | |
| In general, @code{make} searches for an implicit rule for each target, and | |
| for each double-colon rule, that has no commands. A file that is mentioned | |
| only as a dependency is considered a target whose rule specifies nothing, | |
| so implicit rule search happens for it. @xref{Search Algorithm}, for the | |
| details of how the search is done. | |
| @node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit | |
| @section Catalogue of Implicit Rules | |
| Here is a catalogue of predefined implicit rules which are always available | |
| unless the makefile explicitly overrides or cancels them. | |
| (@xref{Canceling Rules}, for information on canceling or overriding an | |
| implicit rule. The @samp{-r} option cancels all predefined rules.) | |
| @table @asis | |
| @item Compiling C programs | |
| @file{@var{n}.o} will be made automatically from @file{@var{n}.c} | |
| with the command @samp{$(CC) -c $(CFLAGS)}.@refill | |
| @item Compiling Pascal programs | |
| @file{@var{n}.o} will be made automatically from @file{@var{n}.p} | |
| with the command @samp{$(PC) -c $(PFLAGS)}.@refill | |
| @item Compiling Fortran, EFL and Ratfor programs | |
| @file{@var{n}.o} will be made automatically from @file{@var{n}.e}, | |
| @file{@var{n}.r}, @file{@var{n}.F} or @file{@var{n}.f} by running the | |
| Fortran compiler. The precise command used is as follows:@refill | |
| @table @code | |
| @item .e | |
| @samp{$(FC) -c $(EFLAGS)}. | |
| @item .f | |
| @samp{$(FC) -c $(FFLAGS)}. | |
| @item .F | |
| @samp{$(FC) -c $(FFLAGS)}. | |
| @item .r | |
| @samp{$(FC) -c $(RFLAGS)}. | |
| @end table | |
| @item Preprocessing Fortran, EFL and Ratfor programs | |
| @file{@var{n}.f} will be made automatically from @file{@var{n}.e}, | |
| @file{@var{n}.r} or @file{@var{n}.F}. This rule runs just the | |
| preprocessor to convert a Ratfor, EFL or preprocessable Fortran | |
| program into a strict Fortran program. The precise command used is as | |
| follows:@refill | |
| @table @code | |
| @item .e | |
| @samp{$(FC) -F $(EFLAGS)}. | |
| @item .F | |
| @samp{$(FC) -F $(FFLAGS)}. | |
| @item .r | |
| @samp{$(FC) -F $(RFLAGS)}. | |
| @end table | |
| @item Assembling assembler programs | |
| @file{@var{n}.o} will be made automatically from @file{@var{n}.s} by | |
| running the assembler @code{as}. The precise command used is | |
| @samp{$(AS) $(ASFLAGS)}.@refill | |
| @item Linking a single object file | |
| @file{@var{n}} will be made automatically from @file{@var{n}.o} by | |
| running the linker @code{ld} via the C compiler. The precise command | |
| used is @samp{$(CC) $(LDFLAGS) @dots{} $(LOADLIBES)}.@refill | |
| This rule does the right thing for a simple program with only one source | |
| file. It will also do the right thing if there are multiple object files | |
| (presumably coming from various other source files), the first 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 | |
| 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 example | |
| @noindent | |
| In more complicated cases, you must write an explicit command for linking. | |
| @item Yacc for C programs | |
| @file{@var{n}.c} will be made automatically from @file{@var{n}.y} by | |
| running Yacc with the command @samp{$(YACC) $(YFLAGS)}. | |
| @item Yacc for Ratfor programs | |
| @file{@var{n}.r} will be made automatically from @file{@var{n}.yr} by | |
| running Yacc with the command @samp{$(YACCR) $(YFLAGS)}. | |
| @item Yacc for EFL programs | |
| @file{@var{n}.e} will be made automatically from @file{@var{n}.ye} by | |
| running Yacc with the command @samp{$(YACCE) $(YFLAGS)}. | |
| @item Lex for C programs | |
| @file{@var{n}.c} will be made automatically from @file{@var{n}.l} by | |
| by running Lex. The actual command is @samp{$(LEX) $(LFLAGS)}. | |
| @item Lex for Ratfor programs | |
| @file{@var{n}.r} will be made automatically from @file{@var{n}.l} by | |
| by running Lex. The actual command is @samp{$(LEX) $(LFLAGS)}. | |
| The traditional custom of using the same suffix @samp{.l} for all Lex | |
| files regardless of whether they produce C code or Ratfor code makes | |
| it impossible for @code{make} to determine automatically which of the | |
| two languages you are using in any particular case. If @code{make} is | |
| called upon to remake an object file from a @samp{.l} file, it must | |
| guess which compiler to use. It will guess the C compiler, because | |
| that is more common. If you are using Ratfor, make sure @code{make} | |
| knows this by mentioning @file{@var{n}.r} in the makefile. | |
| @item RCS | |
| Any file @file{@var{n}} will be extracted if necessary from an RCS | |
| file named either @file{@var{n},v} or @file{RCS/@var{n},v}. The | |
| precise command used is @samp{$(CO) $(COFLAGS)}. The variable | |
| @code{CO} has default value @samp{co}. | |
| @item SCCS | |
| Any file @file{@var{n}} will be extracted if necessary from an SCCS | |
| file named either @file{s.@var{n}} or @file{SCCS/s.@var{n}}. The | |
| precise command used is @samp{$(GET) $(GFLAGS)}. | |
| We recommend that you avoid the use of SCCS. RCS is widely held to be | |
| superior, and is also free. By choosing free software in place of | |
| comparable (or lesser) proprietary software, you support the free software | |
| movement. | |
| @end table | |
| @node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit | |
| @section Variables Used by Implicit Rules | |
| @cindex flags for compilers | |
| The commands in built-in implicit rules make liberal use of certain | |
| predefined variables. You can redefine these variables, either in the | |
| makefile or with arguments to @code{make}, to alter how the implicit rules | |
| work without actually redefining them. | |
| For example, the command used to compile a C source file actually says | |
| @samp{$(CC) -c $(CFLAGS)}. The default values of the variables used | |
| are @samp{cc} and nothing, resulting in the command @samp{cc -c}. By | |
| redefining @samp{$(CC)} to @samp{ncc}, you could cause @samp{ncc} to | |
| be used for all C compilations performed by the implicit rule. By | |
| redefining @samp{$(CFLAGS)} to be @samp{-g}, you could pass the | |
| @samp{-g} option to each compilation. @emph{All} implicit rules that | |
| do C compilation use @samp{$(CC)} to get the program name for the | |
| compiler and @emph{all} include @samp{$(CFLAGS)} among the arguments | |
| given to the compiler.@refill | |
| The variables used in implicit rules fall into two classes: those that are | |
| names of programs (like @code{CC}) and those that contain arguments for the | |
| programs (like @code{CFLAGS}). (The ``name of a program'' may also contain | |
| some command arguments, but it must start with an actual executable program | |
| name.) If a variable value contains more than one argument, separate them | |
| with spaces. | |
| Here is a table of variables used as names of programs: | |
| @table @code | |
| @item AS | |
| @vindex AS | |
| Program for doing assembly; default @samp{as}. | |
| @item CC | |
| @vindex CC | |
| Program for compiling C programs; default @samp{cc}. | |
| @item CO | |
| @vindex CO | |
| Program for extracting a file from RCS; default @samp{co}. | |
| @item FC | |
| @vindex FC | |
| Program for compiling or preprocessing Fortran, Ratfor, | |
| and EFL programs; default @samp{f77}. | |
| @item GET | |
| @vindex GET | |
| Program for extracting a file from SCCS; default @samp{get}. | |
| @item LEX | |
| @vindex LEX | |
| Program to use to turn Lex grammars into C programs or Ratfor programs; | |
| default @samp{lex}. | |
| @item PC | |
| @vindex PC | |
| Program for compiling Pascal programs; default @samp{pc}. | |
| @item YACC | |
| @vindex YACC | |
| Program to use to turn Yacc grammars into C programs; default @samp{yacc}. | |
| @item YACCR | |
| @vindex YACCR | |
| Program to use to turn Yacc grammars into Ratfor | |
| programs; default @samp{yacc -r}. | |
| @item YACCE | |
| @vindex YACCE | |
| Program to use to turn Yacc grammars into EFL | |
| programs; default @samp{yacc -e}. | |
| @item RANLIB | |
| @vindex RANLIB | |
| Program to use to update the symbol-directory of an archive | |
| (the @file{__.SYMDEF} member); default @samp{ranlib}. | |
| @end table | |
| Here is a table of variables whose values are additional arguments for the | |
| programs above. The default values for all of these is the empty string. | |
| @table @code | |
| @item ASFLAGS | |
| @vindex ASFLAGS | |
| Extra flags to give to the assembler (when explicitly | |
| invoked on a @samp{.s} file). | |
| @item CFLAGS | |
| @vindex CFLAGS | |
| Extra flags to give to the C compiler. | |
| @item EFLAGS | |
| @vindex EFLAGS | |
| Extra flags to give to the Fortran compiler for EFL programs. | |
| @item FFLAGS | |
| @vindex FFLAGS | |
| Extra flags to give to the Fortran compiler. | |
| @item LFLAGS | |
| @vindex LFLAGS | |
| Extra flags to give to Lex. | |
| @item LDFLAGS | |
| @vindex LDFLAGS | |
| Extra flags to give to compilers when they are supposed to invoke the | |
| linker, @samp{ld} (actually the value of the variable @code{LD}). | |
| @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 | |
| @section Chains of Implicit Rules | |
| @cindex chains of rules | |
| Sometimes a file can be made by a sequence of implicit rules. For example, | |
| a file @file{@var{n}.o} could be made from @file{@var{n}.y} by running | |
| first Yacc and then @code{cc}. Such a sequence is called a @dfn{chain}. | |
| If the file @file{@var{n}.c} exists, or is mentioned in the makefile, no | |
| special searching is required: @code{make} finds that the object file can | |
| be made by C compilation from @file{@var{n}.c}; later on, when considering | |
| how to make @file{@var{n}.c}, the rule for running Yacc will be | |
| used. Ultimately both @file{@var{n}.c} and @file{@var{n}.o} are | |
| updated.@refill | |
| @cindex intermediate file | |
| However, even if @file{@var{n}.c} does not exist and is not mentioned, | |
| @code{make} knows how to envision it as the missing link between | |
| @file{@var{n}.o} and @file{@var{n}.y}! In this case, @file{@var{n}.c} is | |
| called an @dfn{intermediate file}. Once @code{make} has decided to use the | |
| intermediate file, it is entered in the data base as if it had been | |
| mentioned in the makefile, along with the implicit rule that says how to | |
| create it.@refill | |
| Intermediate files are remade using their rules just like all other | |
| files. The difference is that the intermediate file is deleted when | |
| @code{make} is finished. Therefore, the intermediate file which did | |
| not exist before @code{make} also does not exist after @code{make}. | |
| The deletion is reported to you by printing a @samp{rm -f} command | |
| that shows what @code{make} is doing. (You can optionally define an | |
| implicit rule so as to preserve certain intermediate files. You can also | |
| list the target pattern of an implicit rule (such as @samp{%.o}) as a | |
| dependency file of the special target @code{.PRECIOUS} to preserve intermediate | |
| files whose target patterns match that file's name.)@refill | |
| A chain can involve more than two implicit rules. For example, it is | |
| possible to make a file @file{foo} from @file{RCS/foo.y,v} by running RCS, | |
| Yacc and @code{cc}. Then both @file{foo.y} and @file{foo.c} are | |
| intermediate files that are deleted at the end.@refill | |
| No single implicit rule can appear more than once in a chain. This means | |
| that @code{make} will not even consider such a ridiculous thing as making | |
| @file{foo} from @file{foo.o.o} by running the linker twice. This | |
| constraint has the added benefit of preventing any infinite loop in the | |
| search for an implicit rule chain. | |
| There are some special implicit rules to optimize certain cases that would | |
| otherwise by handled by rule chains. For example, making @file{foo} from | |
| @file{foo.c} could be handled by compiling and linking with separate rules, | |
| using @file{foo.o} as an intermediate file. But what actually happens is | |
| that a special rule for this case does the compilation and linking with a | |
| single @code{cc} command. The optimized rule is used in preference to the | |
| step-by-step chain because it comes earlier in the ordering of rules. | |
| @node Pattern Rules, Last Resort, Chained Rules, Implicit | |
| @section Defining and Redefining Pattern Rules | |
| @cindex pattern rule | |
| You define an implicit rule by writing a @dfn{pattern rule}. A pattern | |
| rule looks like an ordinary rule, except that its target contains the | |
| character @samp{%} (exactly one of them). The target is considered a | |
| pattern for matching file names; the @samp{%} can match any substring, | |
| while other characters match only themselves. | |
| For example, @samp{%.c} as a pattern matches any file name that ends in | |
| @samp{.c}. @samp{s.%.c} as a pattern matches any file name that starts | |
| with @samp{s.}, ends in @samp{.c} and is at least five characters long. | |
| (There must be at least one character to match the @samp{%}.) The substring | |
| that the @samp{%} matches is called the @dfn{stem}.@refill | |
| A pattern rule must have at least one dependency that uses @samp{%}. | |
| @samp{%} in a dependency of a pattern rule stands for the same stem | |
| that was matched by the @samp{%} in the target. In order for | |
| the pattern rule to apply, its target pattern must match the file name | |
| under consideration, and its dependency patterns must name files that | |
| exist or can be made. These files become dependencies of the target. | |
| There may also be dependencies that do not use @samp{%}; such a dependency | |
| attaches to every file made by this pattern rule. These unvarying | |
| dependencies are rarely useful. | |
| The order in which pattern rules appear in the makefile is important | |
| because the rules are considered in that order. Of equally applicable | |
| rules, the first one found is used. The rules you write take precedence | |
| over those that are built in. Note, however, that a rule whose | |
| dependencies actually exist or are mentioned always takes priority over a | |
| rule with dependencies that must be made by chaining other implicit rules. | |
| @menu | |
| * Examples: Pattern Examples. Real examples of pattern rule definitions. | |
| * Vars: Automatic. The automatic variables enable the commands | |
| in pattern rules to act on the right files. | |
| * Matching: Pattern Match. Details of how patterns match. | |
| * Match-Anything Rules:: Precautions in defining a rules that can | |
| match any target file whatever. | |
| * Canceling Rules:: Overriding or canceling built-in rules. | |
| * Last Resort:: How to define a last-resort rule | |
| that applies to any target that no other | |
| rule applies to. | |
| * Suffix Rules:: The old-fashioned way to define implicit rules. | |
| @end menu | |
| @node Pattern Examples, Automatic, Pattern Rules, Pattern Rules | |
| @subsection Pattern Rule Examples | |
| Here are some examples of pattern rules actually predefined in | |
| @code{make}. First, the rule that compiles @samp{.c} files into @samp{.o} | |
| files:@refill | |
| @example | |
| %.o : %.c | |
| $(CC) -c $(CFLAGS) $< -o $@@ | |
| @end example | |
| @noindent | |
| defines a rule that can make any file @file{@var{x}.o} from | |
| @file{@var{x}.c}. The command uses the automatic variables @samp{$@@} and | |
| @samp{$<} to substitute the names of the target file and the source file | |
| as they are in each case where the rule apply (@pxref{Automatic}).@refill | |
| Here is a second built-in rule: | |
| @example | |
| % :: RCS/%,v | |
| $(CO) $(COFLAGS) $< | |
| @end example | |
| @noindent | |
| defines a rule that can make any file @file{@var{x}} whatever from a | |
| corresponding file @file{@var{x},v} in the subdirectory @file{RCS}. Since | |
| the target is @samp{%}, this rule will apply to any file whatever, provided | |
| the appropriate dependency file exists. The double colon makes the rule | |
| @dfn{terminal}, which means that its dependency may not be an intermediate | |
| file (@pxref{Match-Anything Rules}).@refill | |
| @node Automatic, Pattern Match, Pattern Examples, Pattern Rules | |
| @subsection Automatic Variables | |
| @cindex automatic variables | |
| Suppose you are writing a pattern rule to compile a @samp{.c} file into a | |
| @samp{.o} file: how do you write the @samp{cc} command so that it operates | |
| on the right source file name? You can't write the name in the command, | |
| because the name is different each time the implicit rule is applied. | |
| What you do is use a special feature of @code{make}, the @dfn{automatic | |
| variables}. These variables have values computed afresh for each rule that | |
| is executed, based on the target and dependencies of the rule. In this | |
| example, you would use @samp{$@@} for the object file name and @samp{$<} | |
| for the source file name. | |
| Here is a table of automatic variables: | |
| @table @code | |
| @item $@@ | |
| The file name of the target of the rule. If the target is an archive | |
| member, then @samp{$@@} is the name of the archive file. | |
| @item $% | |
| The target member name, when the target is an archive member. For | |
| example, if the target is @file{foo.a(bar.o)} then @samp{$%} is | |
| @file{bar.o} and @samp{$@@} is @file{foo.a}. @samp{$%} is empty | |
| when the target is not an archive member. | |
| @item $< | |
| The name of the first dependency. | |
| @item $? | |
| The names of all the dependencies that are newer than the target, with | |
| spaces between them. | |
| @item $^ | |
| The names of all the dependencies, with spaces between them. | |
| @item $* | |
| The stem with which an implicit rule matches (@pxref{Pattern Match}). | |
| If the target is @file{dir/a.foo.b} and the target pattern is | |
| @file{a.%.b} then the stem is @file{dir/foo}. The stem is useful for | |
| constructing names of related files.@refill | |
| @end table | |
| @samp{$?} is useful even in explicit rules when you wish to operate on only | |
| the dependencies that have changed. For example, suppose that an archive | |
| named @file{lib} is supposed to contain copies of several object files. | |
| This rule copies just the changed object files into the archive: | |
| @example | |
| lib: foo.o bar.o lose.o win.o | |
| ar c lib $? | |
| @end example | |
| Of the variables listed above, four have values that are single file names. | |
| These four have variants that get just the file's directory name or just | |
| the file name within the directory. The variant variables' names are | |
| formed by appending @samp{D} or @samp{F}, respectively. These variants are | |
| semi-obsolete in GNU @code{make} since the functions @code{dir} and | |
| @code{notdir} can be used to get an equivalent effect (@pxref{Filename | |
| Functions}). Here is a table of the variants:@refill | |
| @table @samp | |
| @item $(@@D) | |
| The directory part of the file name of the target. If the value of | |
| @samp{$@@} is @file{dir/foo.o} then @samp{$(@@D)} is @file{dir/}. | |
| This value is @file{./} if @samp{$@@} does not contain a slash. | |
| @samp{$(@@D)} is equivalent to @samp{$(dir $@@)}.@refill | |
| @item $(@@F) | |
| The file-within-directory part of the file name of the target. If the | |
| value of @samp{$@@} is @file{dir/foo.o} then @samp{$(@@F)} is | |
| @file{foo.o}. @samp{$(@@F)} is equivalent to @samp{$(notdir $@@)}. | |
| @item $($/) | |
| The same as @code{$(@@F)}, for compatibility with some other versions | |
| of @code{make}. | |
| @item $(%D) | |
| @itemx $(%F) | |
| The directory part and the file-within-directory part of the archive | |
| member name. | |
| @item $(*D) | |
| @itemx $(*F) | |
| The directory part and the file-within-directory part of the stem; | |
| @file{dir/} in this example. | |
| @item $(<D) | |
| @itemx $(<F) | |
| The directory part and the file-within-directory part of the first | |
| implicit dependency. | |
| @end table | |
| @node Pattern Match, Match-Anything Rules, Automatic, Pattern Rules | |
| @subsection How Patterns Match | |
| @cindex stem | |
| A target pattern is composed of a @samp{%} between a prefix and a suffix, | |
| either of which may be empty. The pattern matches a file name only if the | |
| file name starts with the prefix and ends with the suffix, without overlap. | |
| The text between the prefix and the suffix is called the @dfn{stem}. Thus, | |
| when the pattern @samp{%.o} matches the file name @file{test.o}, the stem | |
| is @samp{test}. The pattern rule dependencies are turned into actual file | |
| names by substituting the stem for the character @samp{%}. Thus, if in the | |
| same example one of the dependencies is written as @samp{%.c}, it expands | |
| to @samp{test.c}.@refill | |
| When the target pattern does not contain a slash (and usually it does not), | |
| directory names in the file names are removed from the file name before it | |
| is compared with the target prefix and suffix. The directory names, along | |
| with the slash that ends them, are added back to the stem. Thus, | |
| @samp{e%t} does match the file name @file{src/eat}, with @samp{src/a} as | |
| the stem. When dependencies are turned into file names, the directories | |
| from the stem are added at the front, while the rest of the stem is | |
| substituted for the @samp{%}. The stem @samp{src/a} with a dependency | |
| pattern @samp{c%r} gives the file name @file{src/car}.@refill | |
| @node Match-Anything Rules, Canceling Rules, Pattern Match, Pattern Rules | |
| @subsection Match-Anything Pattern Rules | |
| @cindex match-anything rule | |
| @cindex terminal rule | |
| When a pattern rule's target is just @samp{%}, it matches any filename | |
| whatever. We call these rules @dfn{match-anything} rules. They are very | |
| useful, but it can take a lot of time for @code{make} to think about them, | |
| because it must consider every such rule for each file name listed either | |
| as a target or as a dependency. | |
| Suppose the makefile mentions @file{foo.c}. For this target, @code{make} | |
| would have to consider making it by linking an object file @file{foo.c.o}, | |
| or by C compilation-and-linking in one step from @file{foo.c.c}, or by | |
| Pascal compilation-and-linking from @file{foo.c.p}, and many other | |
| possibilities. We know these possibilities are ridiculous since | |
| @file{foo.c} is a C source file, not an executable.@refill | |
| If @code{make} did consider these possibilities, it would ultimately reject | |
| them, because files such as @file{foo.c.o}, @file{foo.c.p}, etc. would not | |
| exist. But these possibilities are so numerous that @code{make} would run | |
| very slowly if it had to consider them.@refill | |
| To gain speed, we have put various constraints on the way @code{make} | |
| considers match-anything rules. There are two different constraints that | |
| can be applied, and each time you define a match-anything rule you must | |
| choose one or the other for that rule. | |
| One choice is to mark the match-anything rule as @dfn{terminal} by defining | |
| it with a double colon. When a rule is terminal, it does not apply | |
| unless its dependencies actually exist. Dependencies that could be made | |
| with other implicit rules are not good enough. | |
| For example, the built-in implicit rules for extracting sources from RCS | |
| and SCCS files are terminal; as a result, if the file @file{foo.c,v} does | |
| not exist, @code{make} will not even consider trying to make it as an | |
| intermediate file from @file{foo.c,v.o} or from @file{RCS/SCCS/s.foo.c,v}. | |
| RCS and SCCS files are generally ultimate source files, which should not be | |
| remade from any other files; therefore, @code{make} can save time by not | |
| looking for ways to remake them.@refill | |
| If you do not mark the match-anything rule as terminal, then it is | |
| nonterminal. A nonterminal match-anything rule cannot apply to a file name | |
| that indicates a specific type of data. A file name indicates a specific | |
| type of data if some non-match-anything implicit rule target matches it. | |
| For example, the file name @file{foo.c} matches the target for the pattern | |
| rule @samp{%.c : %.y} (the rule to run Yacc). Regardless of whether this | |
| rule is actually applicable (which happens only if there is a file | |
| @file{foo.y}), the fact that its target matches is enough to prevent | |
| consideration of any nonterminal match-everything rules for the file | |
| @file{foo.c}. Thus, @code{make} will not even consider trying to make | |
| @file{foo.c} as an executable file from @file{foo.c.o}, @file{foo.c.c}, | |
| @file{foo.c.p}, etc.@refill | |
| The motivation for this constraint is that nonterminal match-everything | |
| rules are used for making files containing specific types of data (such as | |
| executable files) and a file name with a recognized suffix indicates a | |
| specific different type of data (such as a C source file). | |
| Special built-in dummy pattern rules are provided solely to recognize | |
| certain file names so that nonterminal match-everything rules won't be | |
| considered. These dummy rules have no dependencies and no commands, and | |
| they are ignored for all other purposes. For example, the built-in | |
| implicit rule | |
| @example | |
| %.p : | |
| @end example | |
| @noindent | |
| exists to make sure that Pascal source files such as @file{foo.p} match a | |
| specific target pattern and thereby prevent time from being wasted looking | |
| for @file{foo.p.o} or @file{foo.p.c}. | |
| @node Canceling Rules,, Match-Anything Rules, Pattern Rules | |
| @subsection Canceling Implicit Rules | |
| You can override a built-in implicit rule by defining a new pattern rule | |
| with the same target and dependencies, but different commands. When the | |
| new rule is defined, the built-in one is replaced. The new rule's position | |
| in the sequence of implicit rules is determined by where you write the new | |
| rule. | |
| You can cancel a built-in implicit rule by defining a pattern rule with the | |
| same target and dependencies, but no commands. For example, the following | |
| would cancel the rule that runs the assembler: | |
| @example | |
| %.o : %.s | |
| @end example | |
| @node Last Resort, Suffix Rules, Pattern Rules, Implicit | |
| @section Defining Last-Resort Default Rules | |
| @findex .DEFAULT | |
| You can define a last-resort implicit rule by writing a rule for the target | |
| @code{.DEFAULT}. Such a rule's commands are used for all targets and | |
| dependencies that have no commands of their own and for which no other | |
| implicit rule applies. Naturally, there is no @code{.DEFAULT} rule unless | |
| you write one. | |
| For example, when testing a makefile, you might not care if the source | |
| files contain real data, only that they exist. Then you might do this: | |
| @example | |
| .DEFAULT: | |
| touch $@@ | |
| @end example | |
| @noindent | |
| to cause all the source files needed (as dependencies) to be created | |
| silently. | |
| @node Suffix Rules, Search Algorithm, Last Resort, Implicit | |
| @section Old-Fashioned Suffix Rules | |
| @cindex suffix rules | |
| @dfn{Suffix rules} are the old-fashioned way of defining implicit rules for | |
| @code{make}. Suffix rules are obsolete because pattern rules are more | |
| general and clearer. They are supported in GNU @code{make} for | |
| compatibility with old makefiles. They come in two kinds: | |
| @dfn{double-suffix} and @dfn{single-suffix}.@refill | |
| A double-suffix rule is defined by a pair of suffixes: the target suffix | |
| and the source suffix. It matches any file whose name ends with the target | |
| suffix. The corresponding implicit dependency is to the file name made by | |
| replacing the target suffix with the source suffix. A two-suffix rule | |
| whose target and source suffixes are @samp{.o} and @samp{.c} is equivalent | |
| to the pattern rule @samp{%.o : %.c}. | |
| A single-suffix rule is defined by a single suffix, which is the source | |
| suffix. It matches any file name, and the corresponding implicit | |
| dependency name is made by appending the source suffix. A single-suffix | |
| rule whose source suffix is @samp{.c} is equivalent to the pattern rule | |
| @samp{% : %.c}. | |
| Suffix rule definitions are recognized by comparing each rule's target | |
| against a defined list of known suffixes. When @code{make} sees a rule | |
| whose target is a known suffix, this rule is considered a single-suffix | |
| rule. When @code{make} sees a rule whose target is two known suffixes | |
| concatenated, this rule is taken as a double-suffix rule. | |
| For example, @samp{.c} and @samp{.o} are both on the default list of known | |
| suffixes. Therefore, if you define a rule whose target is @samp{.c.o}, | |
| @code{make} takes it to be a double-suffix rule with source suffix | |
| @samp{.c} and target suffix @samp{.o}. For example, here is the old | |
| fashioned way to define the rule for compiling a C source:@refill | |
| @example | |
| .c.o: | |
| $(CC) -c $(CFLAGS) -o $@@ $< | |
| @end example | |
| @findex .SUFFIXES | |
| The known suffixes are simply the names of the dependencies of the special | |
| target @code{.SUFFIXES}. You can add your own suffixes by writing a rule | |
| for @code{.SUFFIXES} that adds more dependencies, as in | |
| @example | |
| .SUFFIXES: .hack .win | |
| @end example | |
| @noindent | |
| which adds @samp{.hack} and @samp{.win} to the end of the list of suffixes. | |
| If you wish to eliminate the default known suffixes instead of just adding | |
| to them, write a rule for @code{.SUFFIXES} with no dependencies. By | |
| special dispensation, this eliminates all existing dependencies of | |
| @code{.SUFFIXES}. You can then write another rule to add the suffixes you | |
| want. For example, | |
| @example | |
| .SUFFIXES: # @r{Delete the default suffixes} | |
| .SUFFIXES: .c .o .h # @r{Define our suffix list} | |
| @end example | |
| The @samp{-r} flag causes the default list of suffixes to be empty. | |
| @node Search Algorithm,, Last Resort, Implicit | |
| @section Implicit Rule Search Algorithm | |
| Here is the procedure @code{make} uses for searching for an implicit rule | |
| for a target @var{t}. This procedure is followed for each double-colon | |
| rule with no commands, for each target of ordinary rules none of which have | |
| commands, and for each dependency that is not the target of any rule. It | |
| is also followed recursively for dependencies that come from implicit | |
| rules, in the search for a chain of rules. | |
| Suffix rules are not mentioned in this algorithm because suffix rules are | |
| converted to equivalent pattern rules after the makefiles have been read | |
| in. | |
| For an archive member target of the form | |
| @samp{@var{archive}(@var{member})}, the following algorithm is run twice, | |
| first using @samp{(@var{member})} as the target @var{t}, and second using | |
| the entire target if the first run found no rule.@refill | |
| @enumerate | |
| @item | |
| Split @var{t} into a directory part, called @var{d}, and the rest, | |
| called @var{n}. For example, if @var{t} is @samp{src/foo.o}, then | |
| @var{d} is @samp{src/} and @var{n} is @samp{foo.o}.@refill | |
| @item | |
| Make a list of the pattern rules whose target matches @var{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 any rules with no dependencies from the list. | |
| @item | |
| For each pattern rule in the list: | |
| @enumerate | |
| @item | |
| Find the stem @var{s}: the part of @var{t} or @var{n} that the | |
| @samp{%} in the target pattern matches.@refill | |
| @item | |
| Compute the dependency names by substituting @var{s} for @samp{%}; if | |
| the target pattern does not contain a slash, @var{d} is appended to | |
| the front of each dependency name. | |
| @item | |
| Test whether all the dependencies exist or ought to exist. (If a | |
| file name mentioned in the makefile as a target or as an explicit | |
| dependency then we say it ought to exist.) | |
| If all dependencies exist or ought to exist, then this rule applies. | |
| @end enumerate | |
| @item | |
| If no pattern rule has been found so far, try harder. For | |
| each pattern rule in the list: | |
| @enumerate | |
| @item | |
| If the rule is a terminal match-anything rule, ignore it and go | |
| on to the next rule. | |
| @item | |
| Compute the dependency names as before. | |
| @item | |
| Test whether all the dependencies exist or ought to exist. | |
| @item | |
| For each dependency that does not exist, follow this algorithm | |
| recursively to see if the dependency can be made by an implicit | |
| rule. | |
| @item | |
| If all dependencies exist, ought to exist, or can be made by | |
| implicit rules, then this rule applies. | |
| @end enumerate | |
| @item | |
| If no rule has been found so far, this target cannot be made by an | |
| implicit rule. Return failure. | |
| @item | |
| If no implicit rule applies, the rule for @code{.DEFAULT}, if any, | |
| applies. In that case, give @var{t} the same commands that | |
| @code{.DEFAULT} has. Otherwise, there are no commands for @var{t}. | |
| @end enumerate | |
| When the commands of a pattern rule are executed for @var{t}, the automatic | |
| variables @samp{$@@}, @samp{$*} and @samp{$<} are set as follows: | |
| @table @samp | |
| @item $@@ | |
| @var{t} | |
| @item $* | |
| If the target pattern contains a slash, this is @var{s}; otherwise, it | |
| is @var{d}@var{s}. | |
| @item $< | |
| The name of the first dependency that came via the implicit rule. | |
| @end table | |
| For @code{.DEFAULT} commands, as for non-implicit commands, @samp{$*} | |
| and @samp{$<} are empty. @samp{$@@} is @var{t}, as always. | |
| @node Archives, Features, Implicit, Top | |
| @chapter Using @code{make} to Update Archive Files | |
| @cindex archive | |
| @dfn{Archive files} are files containing named subfiles called | |
| @dfn{members}; they are maintained with the program @code{ar} and their | |
| main use is as subroutine libraries for linking. | |
| @menu | |
| * Members: Archive Members. How to name an archive member | |
| as a target or dependency. | |
| * Update: Archive Update. An implicit rule can update | |
| most archive member targets just right. | |
| * Symbols: Archive Symbols. Another implicit rule runs @code{ranlib} | |
| to update the special member @file{__.SYMDEF}. | |
| @end menu | |
| @node Archive Members, Archive Update, Archives, Archives | |
| @section Archive Members as Targets | |
| @cindex archive member targets | |
| An individual member of an archive file can be used as a target or | |
| dependency in @code{make}. The archive file must already exist, but the | |
| member need not exist. You specify the member named @var{member} in | |
| archive file @var{archive} as follows: | |
| @example | |
| @var{archive}(@var{member}) | |
| @end example | |
| @noindent | |
| This construct is available only in targets and dependencies, not in | |
| commands! Most programs that you might use in commands do not support this | |
| syntax and cannot act directly on archive members. Only @code{ar} and | |
| other programs specifically designed to operate on archives can do so. | |
| Therefore, valid commands to update an archive member target probably must | |
| use @code{ar}. For example, this rule says to create a member | |
| @file{hack.o} in archive @file{foolib} by copying the file @file{hack.o}: | |
| @example | |
| foolib(hack.o) : hack.o | |
| ar r foolib hack.o | |
| @end example | |
| In fact, nearly all archive member targets are updated in just this way | |
| and there is an implicit rule to do it for you. | |
| @node Archive Update, Archive Symbols, Archive Members, Archives | |
| @section Implicit Rule for Archive Member Targets | |
| Recall that a target that looks like @file{@var{a}(@var{m})} stands for the | |
| member named @var{m} in the archive file @var{a}. | |
| When @code{make} looks for an implicit rule for such a target, as a special | |
| feature it considers implicit rules that match @file{(@var{m})}, as well as | |
| those that match the actual target @file{@var{a}(@var{m})}. | |
| This causes one special rule whose target is @file{(%)} to match. This | |
| rule updates the target @file{@var{a}(@var{m})} by copying the file @var{m} | |
| into the archive. For example, it will update the archive member target | |
| @file{foo.a(bar.o)} by copying the @emph{file} @file{bar.o} into the | |
| archive @file{foo.a} as a member named @file{bar.o}. | |
| When this rule is chained with others, the result is very powerful. Thus, | |
| @samp{make "foo.a(bar.o)"} in the presence of a file @file{bar.c} is enough | |
| to cause the following commands to be run, even without a makefile: | |
| @example | |
| cc -c bar.c -o bar.o | |
| ar r foo.a bar.o | |
| rm -f bar.o | |
| @end example | |
| @noindent | |
| Here the file @file{bar.o} has been envisioned as an intermediate file. | |
| @node Archive Symbols,, Archive Update, Archives | |
| @subsection Updating Archive Symbol Directories | |
| @cindex __.SYMDEF | |
| An archive file that is used as a library usually contains a special member | |
| named @file{__.SYMDEF} that contains a directory of the external symbol | |
| names defined by all the other members. After you update any other | |
| members, you need to update @file{__.SYMDEF} so that it will summarize the | |
| other members properly. This is done by running the @code{ranlib} program: | |
| @example | |
| ranlib @var{archivefile} | |
| @end example | |
| Normally you would put this command in the rule for the archive file, | |
| and make all the members of the archive file dependents of that rule. | |
| For example, | |
| @example | |
| libfoo.a: libfoo.a(x.o) libfoo.a(y.o) @dots{} | |
| ranlib libfoo.a | |
| @end example | |
| @noindent | |
| The effect of this is to update archive members @file{x.o}, @file{y.o}, | |
| etc., and then update the symbol directory member @file{__.SYMDEF} by | |
| running @code{ranlib}. The rules for updating the members are not shown | |
| here; most likely you can omit them and use the implicit rule which copies | |
| files into the archive, as described in the preceding section. | |
| @node Features, Missing, Archives, Top | |
| @chapter Features of GNU @code{make} | |
| GNU @code{make} contains many features not in any other @code{make} | |
| program. Some of them are taken from other versions of @code{make}, while | |
| most are new inventions of the implementors of GNU @code{make}. | |
| The standard for comparison among versions of @code{make} in this chapter | |
| will be the version found in standard 4.2 BSD Unix systems. Many additions | |
| come from the versions of @code{make} found in other Unix systems. This | |
| chapter lists the features of GNU @code{make} beyond the 4.2 BSD version. | |
| They are presented as a simple list of small items with terse descriptions. | |
| All of these features (as well as those found in 4.2 BSD @code{make}) are | |
| documented in this manual, so it would be redundant to repeat that | |
| documentation here. | |
| The @code{VPATH} variable and its special meaning come from the @code{make} | |
| in 4.3 BSD Unix. @xref{Directory Search}. | |
| Many features come from the version of @code{make} in Sun Unix systems. I | |
| believe that these in turn are adopted from the @code{make} in Unix System V. | |
| @itemize @bullet | |
| @item | |
| Included makefiles. @xref{Include}. | |
| @item | |
| Variables are read in from the environment. | |
| All variables are placed into the environment of child processes (running | |
| commands). @xref{Environment}. Note also the @samp{-e} option. | |
| @item | |
| The environment variable @samp{MAKEFLAGS} is scanned for command-line | |
| options to @code{make}. The options @samp{-f}, @samp{-p}, @samp{-d} and | |
| @samp{-c} are not accepted. The @code{make} variable @samp{MAKEFLAGS} is | |
| set to a list of the options @code{make} was invoked with, except those | |
| noted above. @xref{Options/Recursion}.@refill | |
| @item | |
| The automatic variable @code{$%} is set to the member name | |
| in an archive reference. @xref{Automatic}. | |
| @item | |
| The automatic variables @code{$@@}, @code{$*}, @code{$<} and @code{$%} have | |
| corresponding forms such as @code{$(@@F)} and @code{$(@@D)} which with only | |
| the filename and only the directory. @xref{Automatic}.@refill | |
| @item | |
| Substitution variable references. @xref{Reference}. | |
| @item | |
| The command-line options @samp{-b} and @samp{-m} are accepted and ignored. | |
| @item | |
| Targets whose commands contain a reference to the variable @code{MAKE} have | |
| their commands executed even if the @samp{-n}, @samp{-q} or @samp{-t} | |
| options are specified. @xref{Recursion}. I'm told that Unix System V | |
| @code{make} does this only in the case of @samp{-n}.@refill | |
| @item | |
| An implicit suffix rule @samp{@var{x}.a:} makes | |
| @file{@var{lib}(@var{name}.o)} from @file{@var{name}.@var{x}}. In GNU | |
| @code{make}, this is actually implemented by using one pattern rule for | |
| making library-archive files and rule-chaining. @xref{Chained Rules}.@refill | |
| @end itemize | |
| The Sun Unix (and probably System V) version of @code{make} fails to | |
| support variable references using braces (@samp{@{} and @samp{@}}) rather | |
| than parantheses (@pxref{Reference}), and to set the @code{MFLAGS} variable | |
| to the list of options (the same list as in @code{MAKEFLAGS}).@refill | |
| The remaining new features are inventions new to GNU @code{make}. | |
| @itemize @bullet | |
| @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. | |
| 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. | |
| The @samp{-v} option prints version and copyright information. | |
| Rule chaining and implicit intermediate files. | |
| we got this from either of them or thought it up ourselves at the | |
| The automatic variable @code{$^} containing a list of all dependencies | |
| of the current target. @xref{Automatic}. | |
| @end itemize | |
| The variable @code{MAKEOVERRIDES} is defined to contain all | |
| the variable definitions given on the command line, and is | |
| appended to the @code{MAKE} variable which contains the name | |
| by which @code{make} was invoked. Thus, sub-makes will always | |
| get variable definitions from the command line that cannot | |
| come from the environment since environment variable | |
| definitions do not override those in makefiles. | |
| @itemize @bullet | |
| @item | |
| The @samp{-c} to change directory. @xref{Options}. | |
| @item | |
| Simply-expanded variables. @xref{Flavors}. | |
| @item | |
| Phony targets. @xref{Phony Targets}. | |
| @xref{Recursion}. | |
| Variable expansion functions. @xref{Functions}. | |
| The @samp{-c} command option to change directory. @xref{Options}. | |
| The @samp{-o} option makes files seem artificially old. | |
| Verbatim variable definitions made with @code{define}. @xref{Defining}. | |
| @item | |
| Conditional lines. @xref{Conditionals}. | |
| A similar feature with a different syntax was implemented by | |
| Andrew Hume of AT&T Bell Labs in his @code{mk} program. This | |
| Included makefiles never determine the default target. | |
| @item | |
| There is an include file search path. @xref{Include}. | |
| @item | |
| @xref{MAKEFILES Variable}. | |
| @xref{Avoid Compilation}. | |
| @xref{Pattern Rules}. | |
| @code{make}; it seems a natural extension derived from the features | |
| of the C preprocessor and similar macro languages and is not a | |
| The automatic variable @code{$^} contains a list of all | |
| dependencies of the current target. @xref{Automatic}. | |
| @item | |
| Included makefiles never determine the default goal. | |
| There is a fully complete default set of implicit rules using | |
| file with suffixes @samp{.out}, @samp{.a}, @samp{.o}, | |
| @samp{.s}, @samp{.c}, @samp{.f}, @samp{.p}, @samp{.F}, | |
| @samp{.e}, @samp{.r}, @samp{.y}, @samp{.ye}, @samp{.yr} and | |
| @samp{.l}. @xref{Catalogue of Rules}.@refill | |
| @item | |
| Leading sequences of @samp{./} are stripped from file names, | |
| so that @file{./@var{file}} and @file{@var{file}} are | |
| considered to be the same file. | |
| @item | |
| Stripping leading sequences of @samp{./} from file names, so that | |
| Dependencies of the form @samp{-l@var{name}} are searched for | |
| as library archives. @xref{Libraries/Search}. | |
| same file. | |
| Suffixes for suffix rules (@pxref{Suffix Rules}) may contain | |
| any characters. In other version of @code{make}, they must | |
| begin with @samp{.} and not contain any @samp{/} characters. | |
| @item | |
| The variable @code{MAKELEVEL} keeps track of the current level | |
| of @code{make} recursion. At the top level (@code{MAKELEVEL} | |
| is zero), the @code{SHELL} environment variable is not used to | |
| execute commands. It is reset to @samp{/bin/sh}.@refill | |
| @item | |
| Intermediate implicit files. @xref{Chained Rules}. | |
| Special search method for library dependencies written in the form | |
| @samp{-l@var{name}}. @xref{Libraries/Search}. | |
| @samp{.} and not contain any @samp{/} characters. | |
| @item | |
| The variable @code{MAKELEVEL} which keeps track of the current level | |
| of @code{make} recursion. @xref{Recursion}. | |
| The @code{make} programs in various other systems support three features | |
| @item | |
| Static pattern rules. @xref{Static Pattern}. | |
| @item | |
| Selective @code{vpath} search. @xref{Directory Search}. | |
| @item | |
| Recursive variable references. @xref{Reference}. | |
| @end itemize | |
| @node Missing, Concept Index, Features, Top | |
| @chapter Missing Features in GNU @code{make} | |
| The @code{make} programs in various other systems support a few features | |
| that are not implemented in GNU @code{make}. | |
| @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 directories. @xref{Archive Symbols}. | |
| @item | |
| Suffixes (used in suffix rules) that end with the character @samp{~} | |
| have a special meaning; they refer to the SCCS file that corresponds | |
| to the file one would get without the @samp{~}. For example, the | |
| suffix rule @samp{.c~.o} would make the file @file{@var{n}.o} file from | |
| the SCCS file @file{s.@var{n}.c}. For complete coverage, a whole | |
| series of such suffix rules is required. @xref{Suffix Rules}.@refill | |
| rules. The System V @code{make} rule: | |
| 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}. | |
| @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{$}. | |
| @noindent | |
| can be replaced with the GNU @code{make} static pattern rule: | |
| @example | |
| $(targets): %: %.o lib.a | |
| @end example | |
| @item | |
| In System V and 4.3 BSD @code{make}, files found by @code{VPATH} search | |
| (@pxref{Directory Search}) have their names changed inside command strings. | |
| We feel it is much cleaner to always use automatic variables and thus | |
| obviate the need for this feature. We are still debating whether to | |
| implement this to be compatible or to leave it out to avoid such ugliness. | |
| @end itemize | |
| @node Concept Index, Name Index, Missing, Top | |
| @unnumbered Index of Concepts | |
| @printindex cp | |
| @node Name Index,, Concept Index, Top | |
| @unnumbered Index of Functions, Directives and Variables | |
| @printindex fn | |
| @contents | |
| @bye |