diff options
Diffstat (limited to 'make.texinfo')
-rw-r--r-- | make.texinfo | 132 |
1 files changed, 73 insertions, 59 deletions
diff --git a/make.texinfo b/make.texinfo index 43a1eb4..0ddf8fc 100644 --- a/make.texinfo +++ b/make.texinfo @@ -19,7 +19,7 @@ automatically which pieces of a large program need to be recompiled, and issues the commands to recompile them. @c !!set edition, date, version -This is Edition 0.33 Beta, last updated 6 July 1992, +This is Edition 0.33 Beta, last updated 16 July 1992, of @cite{The GNU Make Manual}, for @code{make}, Version 3.63 Beta. Copyright (C) 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. @@ -54,7 +54,7 @@ by the Foundation. @title GNU Make @subtitle A Program for Directing Recompilation @subtitle Edition 0.33 Beta, for @code{make} Version 3.63 Beta. -@subtitle June 1992 +@subtitle July 1992 @author by Richard M. Stallman and Roland McGrath @page @vskip 0pt plus 1filll @@ -94,12 +94,13 @@ large program need to be recompiled, and issues the commands to recompile them.@refill This is Edition 0.33 Beta of the @cite{GNU Make Manual}, -last updated 12 June 1992, +last updated 16 July 1992 for @code{make} Version 3.63 Beta.@refill This manual describes @code{make} and contains the following chapters:@refill @end ifinfo +@c !!! Edit descriptions. @menu * Copying:: GNU GENERAL PUBLIC LICENSE * Overview:: Introducing @code{make}. @@ -1079,7 +1080,7 @@ without running them. The commands for @file{foo} will be those specified by the existing contents of @file{mfile}. @node Overriding Makefiles, , Remaking Makefiles, Makefiles -@section Overriding Part of One Makefile with Another Makefile +@section Overriding Part of Another Makefile @cindex overriding makefiles Sometimes it is useful to have a makefile that is mostly just like @@ -1648,6 +1649,8 @@ will repeat the appropriate search when it processes this argument.@refill A phony target is one that is not really the name of a file. It is just a name for some commands to be executed when you make an explicit request. +There are two reasons to use a phony target: to avoid a conflict with +file of the same name, and to improve performance. If you write a rule whose commands will not create the target file, the commands will be executed every time the target comes up for remaking. @@ -1663,9 +1666,6 @@ 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}. -@c !!!! want to mention that using .PHONY is a performance win because -@c implicit rule serach is not done for phony targets --roland - @findex .PHONY The phony target will cease to work if anything ever does create a file named @file{clean} in this directory. Since it has no dependencies, the @@ -1682,6 +1682,12 @@ declare the target to be phony, using the special target @code{.PHONY} Once this is done, @samp{make clean} will run the commands regardless of whether there is a file named @file{clean}. +Since @code{make} knows that phony targets do not name actual files +that could be remade from other files, @code{make} skips the implicit +rule search for phony targets (@pxref{Implicit}). This is why +declaring a target phony is good for performance, even if you are not +worried about the actual file existing. + Thus, you first write the line that states that @code{clean} is a phony target, then you write the rule, like this: @@ -3439,12 +3445,14 @@ 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.) -@c !!!! this is completely wrong --roland -When @code{make} is invoked recursively, variables defined in the outer -invocation are automatically passed to inner invocations through the -environment (@pxref{Recursion, ,Recursive Use of @code{make}}). This is the main purpose of turning -environment variables into @code{make} variables, and it requires no -attention from you.@refill +When @code{make} is invoked recursively, variables defined in the +outer invocation can be passed to inner invocations through the +environment (@pxref{Recursion, ,Recursive Use of @code{make}}). By +default, only variables that came from the environment or the command +line are passed to recursive invocations. You can use the +@code{export} directive to pass other variables. +@xref{Variables/Recursion, , Communicating Variables to a +Sub-@code{make}}, for full details. Other use of variables from the environment is not recommended. It is not wise for makefiles to depend for their functioning on environment variables @@ -3515,11 +3523,11 @@ 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. -@c !!!! this is repeated below --roland -Conditionals work at the textual level: the lines of the conditional are -treated as part of the makefile, or ignored, according to the condition. -This is why the larger syntactic units of the makefile, such as rules, may -cross the beginning or the end of the conditional. +As this example illustrates, conditionals work at the textual level: +the lines of the conditional are treated as part of the makefile, or +ignored, according to the condition. This is why the larger syntactic +units of the makefile, such as rules, may cross the beginning or the +end of the conditional. When the variable @code{CC} has the value @samp{gcc}, the above example has this effect: @@ -3664,12 +3672,17 @@ 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. -@c !!!! repeated above -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 +Conditionals affect which lines of the makefile @code{make} uses. If +the condition is true, @code{make} reads the lines of the +@var{text-if-true} as part of the makefile; if the condition is false, +@code{make} ignores those lines completely. It follows that syntactic +units of the makefile, such as rules, may safely be split across the +beginning or the end of the conditional.@refill + +@code{make} evaluates conditionals when it reads a makefile. +Consequently, you cannot use automatic variables in the tests of +conditionals because they are not defined until commands are run +(@pxref{Automatic}). To prevent intolerable confusion, it is not permitted to start a conditional in one makefile and end it in another. However, you may @@ -3894,7 +3907,6 @@ function.@refill For example, given: -@noindent @c !!!! will this do what I want? --roland @example @group objects=main1.o foo.o main2.o bar.o @@ -4135,7 +4147,6 @@ of the names are ignored. For example, -@noindent @c !!!! ? --roland @example $(firstword foo bar) @end example @@ -4385,10 +4396,10 @@ using a very strange shell, this has the same result as @samp{$(wildcard @node Running, Implicit Rules, Functions, Top @chapter How to Run @code{make} -A makefile that says how to recompile a program can be used in more than -one way. The simplest use is to recompile every file that is out of date. -This is what @code{make} will do if run with no arguments. -@c !!!! this is misleading --roland +A makefile that says how to recompile a program can be used in more +than one way. The simplest use is to recompile every file that is out +of date. Usually, makefiles are written so that if you run +@code{make} with no arguments, it does just that. But you might want to update only some of the files; you might want to use a different compiler or different compiler options; you might want just to @@ -5041,9 +5052,6 @@ only predefined suffix rules in effect will be those named by one or two of the suffixes that are on the list you specify; rules whose suffixes fail to be on the list are disabled.@refill -@c !!!! do we want to document $(COMPILE.c) et al? --roland -@c !!!! and $(TARGET_ARCH)? - @table @asis @item Compiling C programs @file{@var{n}.o} will be made automatically from @file{@var{n}.c} with @@ -5217,6 +5225,29 @@ comparable (or inferior) proprietary software, you support the free software movement. @end table +Usually, you want to change only the variables listed in the table +above, which are documented in the following section. + +However, the commands in built-in implicit rules actually use +variables such as @code{COMPILE.c}, @code{LINK.p}, and +@code{PREPROCESS.S}, whose values contain the commands listed above. + +@code{make} follows the convention that the rule to compile a +@file{.@var{x}} source file uses the variable @code{COMPILE.@var{x}}. +Similarly, the rule to produce an executable from a @file{.@var{x}} +file uses @code{LINK.@var{x}}; and the rule to preprocess a +@file{.@var{x}} file uses @code{PREPROCESS.@var{x}}. + +Every rule that produces an object file uses the variable +@code{OUTPUT_OPTION}. @code{make} defines this variable either to +contain @samp{-o $@@}, or to be empty, depending on a compile-time +option. You need the @samp{-o} option to ensure that the output goes +into the right file when the source file is in a different directory, +as when using @code{VPATH} (@pxref{Directory Search}). However, +compilers on some systems do not accept a @samp{-o} switch for object +files. If you use such a system, and use @code{VPATH}, some +compilations will put their output in the wrong place. + @node Implicit Variables, Chained Rules, Catalogue of Rules, Implicit Rules @section Variables Used by Implicit Rules @cindex flags for compilers @@ -5491,12 +5522,10 @@ Thus, a pattern rule @samp{%.o : %.c} says how to make any file @subsection Introduction to Pattern Rules @cindex pattern rule -@c !!!! this paragraph is a repeat of the first paragraph of prev node -You define an implicit rule by writing a @dfn{pattern rule}. A pattern -rule looks like an ordinary rule, except that its target contains the -character @samp{%} (exactly one of them). The target is considered a -pattern for matching file names; the @samp{%} can match any nonempty -substring, while other characters match only themselves. +A pattern rule contains the character @samp{%} (exactly one of them) +in the target; otherwise, it looks exactly like an ordinary rule. The +target is a pattern for matching file names; the @samp{%} matches any +nonempty substring, while other characters match only themselves. 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 @@ -6507,9 +6536,8 @@ We feel that such usage is broken. The dependency properties of and doing such a thing simply does not fit the model.@refill @end itemize -@node Summary, Complex Makefile, Missing, Top -@appendix Summary of Directives, Functions, and Special Variables -@c !!!! this title is too long for the page +@node Quick Reference, Complex Makefile, Missing, Top +@appendix Quick Reference This appendix summarizes the directives, text manipulation functions, and special variables which GNU @code{make} understands. @@ -6819,26 +6847,12 @@ distribution kits. # Copyright (C) 1991 Free Software Foundation, Inc. @end group -@c !!!! must we have all this copying info? --roland @group # This program is free software; you can redistribute # it and/or modify it under the terms of the GNU -# General Public License as published by the Free -# Software Foundation; either version 2, or (at your -# option) any later version. -@end group - -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even -# the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. - -@group -# You should have received a copy of the GNU General -# Public License along with this program; if not, -# write to the Free Software Foundation, Inc., -# 675 Mass Ave, Cambridge, MA 02139, USA. +# General Public License @dots{} +@dots{} +@dots{} @end group SHELL = /bin/sh |