(make.info)Origin Function

Next: Shell Function Prev: Foreach Function Up: Functions

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:

     if VARIABLE was never defined.

     if VARIABLE has a default definition, as is usual with `CC' and so
     on.  Note: 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.

     if VARIABLE was defined as an environment variable and the `-e'
     option is *not* turned on (Note: Summary of Options

`environment override'
     if VARIABLE was defined as an environment variable and the `-e'
     option *is* turned on (Note: Summary of Options.).

     if VARIABLE was defined in a makefile.

`command line'
     if VARIABLE was defined on the command line.

     if VARIABLE was defined with an `override' directive in a makefile
     (Note: The `override' Directive.).

     if VARIABLE is an automatic variable defined for the execution of
     the commands for each rule (Note: 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.

If `bletch' has been defined from the environment, this will redefine

   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.

   Here the redefinition takes place if `$(origin bletch)' returns
either `environment' or `environment override'.  Note: Functions for
String Substitution and Analysis.

automatically generated by info2www