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