* Removed Bourne shell $(a-b), etc. variable references.

* Fixed foreach documentation slightly.
* Added chapter listing features tersely.
This commit is contained in:
Roland McGrath 1988-06-18 00:13:50 +00:00
parent 6b7b5698e9
commit 0bc6cc3735

View file

@ -114,7 +114,11 @@ be recompiled, or how. @xref{Running}.
* 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.
* Missing:: Features of other @code{make}s not supported by GNU @code{make}.
* 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
@ -1900,12 +1904,10 @@ variables (@pxref{Automatic}).
@subsection Modified References
@cindex modified variable reference
@cindex substitution variable reference
@cindex conditional variable reference
In addition to simple references, variables can be referenced in manners
which modify the value of the reference but do not modify the value of
the variable referenced. There are two categories of modified references:
@dfn{substitution references} and @dfn{conditional references}.@refill
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
@ -1922,34 +1924,6 @@ bar := $(foo:.o=.c)
@noindent
sets @samp{bar} to @samp{a.c b.c c.c}. @xref{Setting}.
@dfn{Conditional references} are references whose value depends on
whether or not some variable is set. They are inspired by the similar
construct in the shell @code{sh}. The syntax of conditional references is:
@table @code
@item $(@var{a}:-@var{b})
This expands to the value of the variable @var{a} if it is defined or
to @var{b} (a literal string) if it is not.
@item $(@var{a}:+@var{b})
This expands to @var{b} if the variable @var{a} is defined or to
nothing (no characters) if it is not.
@item $(@var{a}:@var{b}-@var{c})
This expands to @var{b} if the variable @var{a} is defined or to
@var{c} (a literal string) if it is not.
@end table
For the purpose of these conditional references, a variable is ``defined''
if it exists and is non-null.
In the first two alternatives, the @samp{:} may be omitted to produce
a slightly different effect: then the variable @var{a} is considered
``defined'' if it has been assigned any value, even a null value.
Note that a variable value consisting solely of whitespace is @emph{not}
null.
@node Values, Flavors, Reference, Variables
@section How Variables Get Their Values
@ -1972,8 +1946,7 @@ Several @dfn{automatic} variables are given new values for each rule.
@xref{Automatic}.
@item
Several variables have constant initial values. @xref{Implicit
Variables}.
Several variables have constant initial values. @xref{Implicit Variables}.
@end itemize
@node Flavors, Setting, Values, Variables
@ -2008,12 +1981,12 @@ all:;echo $(foo)
@end example
@noindent
will echo @samp{Huh?}: @code{$(foo)} expands to @code{$(bar)} which
expands to @code{$(ugh)} which finally expands to @samp{Huh?}.@refill
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
(most would say) is that:
@example
CFLAGS = $(include_dirs) -O
@ -2030,8 +2003,8 @@ 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.)
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.
@ -2698,8 +2671,9 @@ files := $(wildcard a/* b/* c/* d/*)
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 the same flavor (recursively expanded or not)
during @code{foreach} as it was before. @xref{Flavors}.
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
@ -3170,7 +3144,11 @@ On these occasions, you should use the @samp{-k} flag. This tells
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}.
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
@ -3189,7 +3167,8 @@ Here is a table of all the options @code{make} understands:
@table @samp
@item -b
This option is ignored for compatibility with other versions of @code{make}.
@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
@ -4187,7 +4166,7 @@ The name of the first dependency that came via the implicit rule.
For @code{.DEFAULT} commands, as for non-implicit commands, @samp{$*}
and @samp{$<} are empty. @samp{$@@} is @var{t}, as always.
@node Archives, Missing, Implicit, Top
@node Archives, Features, Implicit, Top
@chapter Using @code{make} to Update Archive Files
@cindex archive
@ -4293,7 +4272,171 @@ 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 Missing, Concept Index, Archives, Top
@node Features, Missing, Archive, 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{Chaining}.@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.
@xref{Avoiding Recompilation}.
@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{Library 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