Home GNU Make Manual www.imodulo.com · 2003-04-05
Imodulo

Origin Function

[ Up: Functions ]
[ Previous: Eval Function ][ Next: Shell Function ]

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 with CC and so on. 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 (Summary of Options).

environment override

if variable was defined as an environment variable and the -e option is turned on (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 (The override Directive).

automatic

if variable is an automatic variable defined for the execution of the commands for each rule (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. Functions for String Substitution and Analysis.