Origin Function (GNU make)
Next: Flavor Function, Previous: Eval Function, Up: Functions [Contents][Index]
8.10 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:
$(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
’ - if
variable
was never defined. - ‘
default
’ - if
variable
has a default definition, as is usual withCC
and so on. See Variables Used by Implicit Rules. Note that if you have redefined a default variable, theorigin
function will return the origin of the later definition. - ‘
environment
’ - if
variable
was inherited from the environment provided tomake
. - ‘
environment override
’ - if
variable
was inherited from the environment provided tomake
, and is overriding a setting forvariable
in the makefile as a result of the ‘-e
’ /@w option (see 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 anoverride
directive in a makefile (see The override Directive). - ‘
automatic
’ - if
variable
is an automatic variable defined for the execution of the recipe for each rule (see 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
’ /@w , 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.
Next: Flavor Function, Previous: Eval Function, Up: Functions [Contents][Index]