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.