Node:Setting Output Variables, Next:, Previous:Defining Symbols, Up:Results



Setting Output Variables

Another way to record the results of tests is to set output variables, which are shell variables whose values are substituted into files that configure outputs. The two macros below create new output variables. See Preset Output Variables, for a list of output variables that are always available.

AC_SUBST (variable, [value]) Macro
Create an output variable from a shell variable. Make AC_OUTPUT substitute the variable variable into output files (typically one or more Makefiles). This means that AC_OUTPUT will replace instances of @variable@ in input files with the value that the shell variable variable has when AC_OUTPUT is called. This value of variable should not contain literal newlines.

If value is given, in addition assign it to variable.

AC_SUBST_FILE (variable) Macro
Another way to create an output variable from a shell variable. Make AC_OUTPUT insert (without substitutions) the contents of the file named by shell variable variable into output files. This means that AC_OUTPUT will replace instances of @variable@ in output files (such as Makefile.in) with the contents of the file that the shell variable variable names when AC_OUTPUT is called. Set the variable to /dev/null for cases that do not have a file to insert.

This macro is useful for inserting Makefile fragments containing special dependencies or other make directives for particular host or target types into Makefiles. For example, configure.ac could contain:

AC_SUBST_FILE(host_frag)
host_frag=$srcdir/conf/sun4.mh

and then a Makefile.in could contain:

@host_frag@

Running configure in different environments can be extremely dangerous. If for instance the user runs CC=bizarre-cc ./configure, then the cache, config.h and many other output files will depend upon bizarre-cc being the C compiler. If for some reason the user runs /configure again, or if it is run via ./config.status --recheck, (See Automatic Remaking, and see config.status Invocation), then the configuration can be inconsistent, composed of results depending upon two different compilers.

Such variables are named precious variables, and can be declared as such by AC_ARG_VAR.

AC_ARG_VAR (variable, description) Macro
Declare variable is a precious variable, and include its description in the variable section of ./configure --help.

Being precious means that

  • variable is AC_SUBST'd.
  • variable is kept in the cache including if it was not specified on the ./configure command line. Indeed, while configure can notice the definition of CC in ./configure CC=bizarre-cc, it is impossible to notice it in CC=bizarre-cc ./configure, which, unfortunately, is what most users do.
  • variable is checked for consistency between two configure runs. For instance:
    $ ./configure --silent --config-cache
    $ CC=cc ./configure --silent --config-cache
    configure: error: `CC' was not set in the previous run
    configure: error: changes in the environment can compromise \
    the build
    configure: error: run `make distclean' and/or \
    `rm config.cache' and start over
    

    and similarly if the variable is unset, or if its content is changed.

  • variable is kept during automatic reconfiguration (see config.status Invocation) as if it had been passed as a command line argument, including when no cache is used:
    $ CC=/usr/bin/cc ./configure undeclared_var=raboof --silent
    $ ./config.status --recheck
    running /bin/sh ./configure undeclared_var=raboof --silent \
      CC=/usr/bin/cc  --no-create --no-recursion