Previous: Automake include
directive, Up: Format of Makefile.am [Contents][Index]
Automake has a conditional directive to make parts of Makefile.am
files conditional.
Automake conditionals are checked at configure
-time by the
configure script, and affect the translation from
Makefile.in to Makefile. They are based on options passed
to configure and on results that configure has discovered
about the host system.
(Note that these conditionals are not the same as conditionals in
GNU Make. GNU Make conditionals are checked at make
-time, and
are based on variables passed to the make program or defined
in the Makefile. Automake conditionals will work with any make
program, and don’t rely on GNU Make conditionals.)
Using an Automake conditional requires modifying both configure.ac and Makefile.am. For more information on the format of configure.ac, see the next section.
Before using a conditional, you must define it in the
configure.ac file by using the AM_CONDITIONAL
macro
(see Macros supplied with Automake).
The conditional name, conditional, should be a simple string
starting with a letter and containing only letters, digits, and
underscores. It must be different from ‘TRUE’ and ‘FALSE’,
which are reserved by Automake. The shell condition (suitable for
use in a shell if
statement) is evaluated when
configure
is run.
Note that you must arrange for every AM_CONDITIONAL
to be invoked
every time configure
is run. If AM_CONDITIONAL
is run
conditionally (e.g., in a shell if
statement), then the result
will confuse automake
.
Here is an example of how to set the ‘DEBUG’ conditional to
“true” only if the user provides the --enable-debug option to
the configure
script:
AC_ARG_ENABLE([debug], [ --enable-debug Turn on debugging], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; esac],[debug=false]) AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
Here the value of the conditional depends on the result of the shell
code ‘test x$debug = xtrue’, given as the second argument to
AM_CONDITIONAL
. The ‘debug’ variable is set by the
AC_ARG_ENABLE
macro.
Here is an example of how to use this conditional in Makefile.am. 3
if DEBUG DBG = debug else DBG = endif noinst_PROGRAMS = $(DBG)
You may only test a single variable in an if
statement, possibly
negated using ‘!’. The else
statement may be omitted.
Conditionals may be nested to any depth. You may specify an argument to
else
in which case it must be the negation of the condition used
for the current if
. Similarly you may specify the condition
that is closed on the endif
line:
if DEBUG DBG = debug else !DEBUG DBG = endif !DEBUG
Unbalanced conditions are errors. The if
, else
, and
endif
statements should not be indented, i.e., start on column
one.
In order to allow access to the value of an Automake conditional
inside configure.ac itself, AM_COND_IF
may be used:
If conditional is fulfilled, execute if-true, otherwise
execute if-false. If either branch contains AC_CONFIG_FILES
,
it will cause automake
to output the rules for the respective
files only for the given condition.
AM_COND_IF
macros may be nested when m4 quotation is used
properly (see M4 Quotation).
Here is an example of how to define a conditional config file:
AM_CONDITIONAL([SHELL_WRAPPER], [test "x$with_wrapper" = xtrue]) AM_COND_IF([SHELL_WRAPPER], [AC_CONFIG_FILES([wrapper:wrapper.in])])
• Limits of Conditionals | Enclosing complete statements |
This trivial example could also be handled using
EXTRA_PROGRAMS
(see Conditional Programs).
Previous: Automake include
directive, Up: Format of Makefile.am [Contents][Index]