mirror of
https://github.com/mirror/make.git
synced 2024-12-29 14:30:42 +08:00
Added more stuff about `foreach'.
This commit is contained in:
parent
8d8b42b086
commit
edacffc68d
72
make.texinfo
72
make.texinfo
@ -6,7 +6,10 @@
|
||||
$Header$
|
||||
|
||||
$Log$
|
||||
Revision 1.53 1988/06/03 00:07:30 mcgrath
|
||||
Revision 1.54 1988/06/10 11:43:00 mcgrath
|
||||
Added more stuff about `foreach'.
|
||||
|
||||
Revision 1.53 88/06/03 00:07:30 mcgrath
|
||||
* Fixed a typo in the `Missing' section.
|
||||
* Added an example of how to replace the System V $$@ feature
|
||||
using static pattern rules.
|
||||
@ -2713,6 +2716,73 @@ For this to work properly, you must use a recursively expanded variable, so
|
||||
it will be expanded when the @code{foreach} function is invoked, not when
|
||||
the variable is defined.@refill
|
||||
|
||||
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
|
||||
|
||||
Note that the variable @samp{find_files} is made recursive. It is then
|
||||
used to perform a function that results in a value, rather than to simply
|
||||
@emph{be} a value. This example has the same result (except for setting
|
||||
@samp{find_files} and @samp{dirs}) as:
|
||||
|
||||
@example
|
||||
files := $(wildcard a/* b/* c/* d/*)
|
||||
dir =
|
||||
@end example
|
||||
|
||||
The variable @samp{dir} is made a recursive variable with a null value by
|
||||
virtue of not being set beforehand, and then being used in the
|
||||
@code{foreach} function. If, before the invokation of @code{foreach},
|
||||
@samp{dir} had been defined by the line:
|
||||
|
||||
@example
|
||||
dir := foo
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
then it would have that same value and the property of being a simply
|
||||
expanded variable after the @code{foreach} function was finished.
|
||||
Note also that @samp{dir} would remain a simply expanded variable
|
||||
throughout the invokation of @code{foreach}.
|
||||
|
||||
Because it is expanded before other processing is done, the @var{var}
|
||||
argument to @code{foreach} need not be a variable name. It can 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
|
||||
will work as expected if @samp{find_files} references the variable
|
||||
@samp{Es escrito en espanol!} (es un nombre bastante largo, no?), but
|
||||
somehow this seems unlikely (pero qualquiera cosa es posible).
|
||||
You might be inclined to use variable names such as this so as not to
|
||||
disturb other variables, because variables with names containing whitespace
|
||||
can be referenced but not defined in the conventional manner
|
||||
(@pxref{Defining}). But this is not necessary, since the @code{foreach}
|
||||
function always preserves the value and flavor (@pxref{Flavors}) of its
|
||||
control variable (the one named by the @var{var} argument).@refill
|
||||
|
||||
@node Filename Functions,, Foreach Function, Functions
|
||||
@section Functions for File Names
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user