origin
FunctionThe 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:
$(origin variable)
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
default
CC
and so on. See 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
-e
option is not turned on (see Summary of Options).
environment override
-e
option is turned on (see Summary of Options).
file
command line
override
override
directive in a
makefile (see The override
Directive).
automatic
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 Functions for String Substitution and Analysis.