8.9 The origin
Function
The origin
function is unlike most other functions in that it does
not operate on the values of variables; it tells you something about
a variable. Specifically, it tells you where it came from.
The syntax of the origin
function is:
Note that variable is the name of a variable to inquire about;
not a reference to that variable. Therefore you would not normally
use a `$' or parentheses when writing it. (You can, however, use a
variable reference in the name if you want the name not to be a constant.)
The result of this function is a string telling you how the variable
variable was defined:
- `undefined'
if variable was never defined.
- `default'
if variable has a default definition, as is usual with CC
and so on. See section Variables Used by Implicit Rules.
Note that if you have redefined a default variable, the origin
function will return the origin of the later definition.
- `environment'
if variable was defined as an environment variable and the
`-e' option is not turned on (see section Summary of Options).
- `environment override'
if variable was defined as an environment variable and the
`-e' option is turned on (see section Summary of Options).
- `file'
if variable was defined in a makefile.
- `command line'
if variable was defined on the command line.
- `override'
if variable was defined with an override
directive in a
makefile (see section The override
Directive).
- `automatic'
if variable is an automatic variable defined for the
execution of the commands for each rule
(see section Automatic Variables).
This information is primarily useful (other than for your curiosity) to
determine if you want to believe the value of a variable. For example,
suppose you have a makefile `foo' that includes another makefile
`bar'. You want a variable bletch
to be defined in `bar'
if you run the command `make -f bar', even if the environment contains
a definition of bletch
. However, if `foo' defined
bletch
before including `bar', you do not want to override that
definition. This could be done by using an override
directive in
`foo', giving that definition precedence over the later definition in
`bar'; unfortunately, the override
directive would also
override any command line definitions. So, `bar' could
include:
| ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif
|
If bletch
has been defined from the environment, this will redefine
it.
If you want to override a previous definition of bletch
if it came
from the environment, even under `-e', you could instead write:
| ifneq "$(findstring environment,$(origin bletch))" ""
bletch = barf, gag, etc.
endif
|
Here the redefinition takes place if `$(origin bletch)' returns either
`environment' or `environment override'.
See section Functions for String Substitution and Analysis.