[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.1.3 Conditional compilation of sources
You can't put a configure substitution (e.g., ‘@FOO@’ or
‘$(FOO)’ where FOO
is defined via AC_SUBST
) into a
_SOURCES
variable. The reason for this is a bit hard to
explain, but suffice to say that it simply won't work. Automake will
give an error if you try to do this.
Fortunately there are two other ways to achieve the same result. One is
to use configure substitutions in _LDADD
variables, the other is
to use an Automake conditional.
Conditional Compilation using _LDADD
Substitutions
Automake must know all the source files that could possibly go into a
program, even if not all the files are built in every circumstance. Any
files that are only conditionally built should be listed in the
appropriate EXTRA_
variable. For instance, if
‘hello-linux.c’ or ‘hello-generic.c’ were conditionally included
in hello
, the ‘Makefile.am’ would contain:
bin_PROGRAMS = hello hello_SOURCES = hello-common.c EXTRA_hello_SOURCES = hello-linux.c hello-generic.c hello_LDADD = $(HELLO_SYSTEM) hello_DEPENDENCIES = $(HELLO_SYSTEM) |
You can then setup the ‘$(HELLO_SYSTEM)’ substitution from ‘configure.ac’:
… case $host in *linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;; *) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;; esac AC_SUBST([HELLO_SYSTEM]) … |
In this case, the variable HELLO_SYSTEM
should be replaced by
either ‘hello-linux.o’ or ‘hello-generic.o’, and added to
both hello_DEPENDENCIES
and hello_LDADD
in order to be
built and linked in.
Conditional Compilation using Automake Conditionals
An often simpler way to compile source files conditionally is to use Automake conditionals. For instance, you could use this ‘Makefile.am’ construct to build the same ‘hello’ example:
bin_PROGRAMS = hello if LINUX hello_SOURCES = hello-linux.c hello-common.c else hello_SOURCES = hello-generic.c hello-common.c endif |
In this case, ‘configure.ac’ should setup the LINUX
conditional using AM_CONDITIONAL
(see section Conditionals).
When using conditionals like this you don't need to use the
EXTRA_
variable, because Automake will examine the contents of
each variable to construct the complete list of source files.
If your program uses a lot of files, you will probably prefer a conditional ‘+=’.
bin_PROGRAMS = hello hello_SOURCES = hello-common.c if LINUX hello_SOURCES += hello-linux.c else hello_SOURCES += hello-generic.c endif |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |