[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
7.2 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 section Preset Output Variables, for a list of output
variables that are always available.
- Macro: AC_SUBST (variable, [value]@c)
-
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 thatAC_OUTPUT
replaces instances of ‘@variable@’ in input files with the value that the shell variable variable has whenAC_OUTPUT
is called. The value can contain any non-NUL
character, including newline. If you are using Automake 1.11 or newer, for newlines in values you might want to consider usingAM_SUBST_NOTMAKE
to preventautomake
from adding a linevariable = @variable@
to the ‘Makefile.in’ files (see (automake)Optional section `Automake' in Other things Automake recognizes).Variable occurrences should not overlap: e.g., an input file should not contain ‘@var1@var2@’ if var1 and var2 are variable names. The substituted value is not rescanned for more output variables; occurrences of ‘@variable@’ in the value are inserted literally into the output file. (The algorithm uses the special marker
|#_!!_#|
internally, so neither the substituted value nor the output file may contain|#_!!_#|
.)If value is given, in addition assign it to variable.
The string variable is passed to
m4_pattern_allow
(see section Forbidden Patterns).
- Macro: AC_SUBST_FILE (variable)
-
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 thatAC_OUTPUT
replaces instances of ‘@variable@’ in output files (such as ‘Makefile.in’) with the contents of the file that the shell variable variable names whenAC_OUTPUT
is called. Set the variable to ‘/dev/null’ for cases that do not have a file to insert. This substitution occurs only when the ‘@variable@’ is on a line by itself, optionally surrounded by spaces and tabs. The substitution replaces the whole line, including the spaces, tabs, and the terminating newline.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@
The string variable is passed to
m4_pattern_allow
(see section Forbidden Patterns).
Running configure
in varying 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 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 section Automatic Remaking,
and see section config.status Invocation), then the configuration can be
inconsistent, composed of results depending upon two different
compilers.
Environment variables that affect this situation, such as ‘CC’
above, are called precious variables, and can be declared as such
by AC_ARG_VAR
.
- Macro: AC_ARG_VAR (variable, description)
-
Declare variable is a precious variable, and include its description in the variable section of ‘./configure --help’.
Being precious means that
- -
variable is substituted via
AC_SUBST
. - -
The value of variable when
configure
was launched is saved in the cache, including if it was not specified on the command line but via the environment. Indeed, whileconfigure
can notice the definition ofCC
in ‘./configure CC=bizarre-cc’, it is impossible to notice it in ‘CC=bizarre-cc ./configure’, which, unfortunately, is what most users do.We emphasize that it is the initial value of variable which is saved, not that found during the execution of
configure
. Indeed, specifying ‘./configure FOO=foo’ and letting ‘./configure’ guess thatFOO
isfoo
can be two different things. - -
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. If the content has white space changes only, then the error is degraded to a warning only, but the old value is reused.
- -
variable is kept during automatic reconfiguration
(see section 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 var=raboof --silent $ ./config.status --recheck running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \ CC=/usr/bin/cc --no-create --no-recursion
- -
variable is substituted via
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |