automake-1.16: Conditional Sources

 
 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 set up 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 set up the ‘LINUX’ conditional
 using ‘AM_CONDITIONAL’ (⇒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