
configureの置換式(例えば,AC_SUBSTで定義されるFOO
を用いた@FOO@や$(FOO))を_SOURCES 変数に書き込む
ことはできません.この理由を説明するのは少し難しいのですが,単純に言っ
て動作しないということで十分でしょう.これを試みた場合,Automakeはエラー
を発します.
幸い,同じ結果を達成するために二つの別の方法があります.一つは,
configureの置換式を_LDADD変数で使用する方法で,もう一つ
は,Automakeの条件式を使用する方法です.
_LDADDの置換式を使用した条件コンパイル
Automakeは,すべてのファイルが全ての状況でビルドされるわけではない場合
でも,プログラムに組み込まれる可能性があるソースファイルをすべて知って
いる必要があります.条件によってのみビルドされるファイルは,適切な
EXTRA_変数でリストアップすべきです.例えば,条件によって
hello-linux.cやhello-generic.cをhelloに組み込む場
合,Makefile.amに以下のものを含めます.
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)
configure.acで$(HELLO_SYSTEM)の置換式を設定することが可
能です.
...
case $host in
*linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
*) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
esac
AC_SUBST([HELLO_SYSTEM])
...
この場合,HELLO_SYSTEMはhello-linux.oや
hello-generic.oで置換され,ビルドしリンクするために
hello_DEPENDENCIESとhello_LDADDに追加されます.
条件によってソースファイルをコンパイルするためのより簡単な方法としては,
Automakeの条件式を使用することが多くなっています.例えば,同じ
helloの例をビルドするため,以下のような内容のMakefile.am
を使用することが可能でしょう.
bin_PROGRAMS = hello
if LINUX
hello_SOURCES = hello-linux.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif
この場合,configure.acでAM_CONDITIONALを使用して
LINUX条件式を設定する必要があります(see Conditionals).
Automakeは,ソースファイルの完全なリストを構成するためにそれぞれの変数
の内容を調査するので,このような条件を使用するときは,EXTRA_変
数を使用する必要はありません.
プログラムで多くのファイルを使用している場合,おそらく条件付の
+=のほうが望ましいでしょう.
bin_PROGRAMS = hello
hello_SOURCES = hello-common.c
if LINUX
hello_SOURCES += hello-linux.c
else
hello_SOURCES += hello-generic.c
endif