6.10 Target-specific Variable Values
Variable values in make
are usually global; that is, they are the
same regardless of where they are evaluated (unless they're reset, of
course). One exception to that is automatic variables
(see section Automatic Variables).
The other exception is target-specific variable values. This
feature allows you to define different values for the same variable,
based on the target that make
is currently building. As with
automatic variables, these values are only available within the context
of a target's command script (and in other target-specific assignments).
Set a target-specific variable value like this:
| target ... : variable-assignment
|
or like this:
| target ... : override variable-assignment
|
Multiple target values create a target-specific variable value for
each member of the target list individually.
The variable-assignment can be any valid form of assignment;
recursive (`='), static (`:='), appending (`+='), or
conditional (`?='). All variables that appear within the
variable-assignment are evaluated within the context of the
target: thus, any previously-defined target-specific variable values
will be in effect. Note that this variable is actually distinct from
any "global" value: the two variables do not have to have the same
flavor (recursive vs. static).
Target-specific variables have the same priority as any other makefile
variable. Variables provided on the command-line (and in the
environment if the `-e' option is in force) will take precedence.
Specifying the override
directive will allow the target-specific
variable value to be preferred.
There is one more special feature of target-specific variables: when you
define a target-specific variable, that variable value is also in effect
for all prerequisites of this target (unless those prerequisites override
it with their own target-specific variable value). So, for example, a
statement like this:
| prog : CFLAGS = -g
prog : prog.o foo.o bar.o
|
will set CFLAGS
to `-g' in the command script for
`prog', but it will also set CFLAGS
to `-g' in the
command scripts that create `prog.o', `foo.o', and
`bar.o', and any command scripts which create their prerequisites.