Next: Conditional Variable Assignment, Previous: Simply Expanded Variable Assignment, Up: The Two Flavors of Variables [Contents][Index]
Another form of assignment allows for immediate expansion, but unlike simple
assignment the resulting variable is recursive: it will be re-expanded again
on every use. In order to avoid unexpected results, after the value is
immediately expanded it will automatically be quoted: all instances of
$
in the value after expansion will be converted into $$
. This
type of assignment uses the ‘:::=’ operator. For example,
var = first OUT :::= $(var) var = second
results in the OUT
variable containing the text ‘first’, while here:
var = one$$two OUT :::= $(var) var = three$$four
results in the OUT
variable containing the text ‘one$$two’. The
value is expanded when the variable is assigned, so the result is the
expansion of the first value of var
, ‘one$two’; then the value is
re-escaped before the assignment is complete giving the final result of
‘one$$two’.
The variable OUT
is thereafter considered a recursive variable, so it
will be re-expanded when it is used.
This seems functionally equivalent to the ‘:=’ / ‘::=’ operators, but there are a few differences:
First, after assignment the variable is a normal recursive variable; when you append to it with ‘+=’ the value on the right-hand side is not expanded immediately. If you prefer the ‘+=’ operator to expand the right-hand side immediately you should use the ‘:=’ / ‘::=’ assignment instead.
Second, these variables are slightly less efficient than simply expanded variables since they do need to be re-expanded when they are used, rather than merely copied. However since all variable references are escaped this expansion simply un-escapes the value, it won’t expand any variables or run any functions.
Here is another example:
var = one$$two OUT :::= $(var) OUT += $(var) var = three$$four
After this, the value of OUT
is the text ‘one$$two $(var)’. When
this variable is used it will be expanded and the result will be
‘one$two three$four’.
This style of assignment is equivalent to the traditional BSD make
‘:=’ operator; as you can see it works slightly differently than the GNU
make
‘:=’ operator. The :::=
operator is added to the
POSIX specification in Issue 8 to provide portability.
Next: Conditional Variable Assignment, Previous: Simply Expanded Variable Assignment, Up: The Two Flavors of Variables [Contents][Index]