Next: , Previous: Linking, Up: A Program


7.1.3 ソースの条件コンパイル

configureの置換式(例えば,AC_SUBSTで定義されるFOO を用いた‘@FOO@’や‘$(FOO)’)を‘_SOURCES’ 変数に書き込む ことはできません.この理由を説明するのは少し難しいのですが,単純に言っ て動作しないということで十分でしょう.これを試みた場合,Automakeはエラー を発します.

幸い,同じ結果を達成するために二つの別の方法があります.一つは, configureの置換式を_LDADD変数で使用する方法で,もう一つ は,Automakeの条件式を使用する方法です.

7.1.3.1 _LDADDの置換式を使用した条件コンパイル

Automakeは,すべてのファイルが全ての状況でビルドされるわけではない場合 でも,プログラムに組み込まれる可能性があるソースファイルをすべて知って いる必要があります.条件によってのみビルドされるファイルは,適切な ‘EXTRA_’変数でリストアップすべきです.例えば,条件によって hello-linux.chello-generic.chelloに組み込む場 合,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_SYSTEMhello-linux.ohello-generic.oで置換され,ビルドしリンクするために hello_DEPENDENCIEShello_LDADDに追加されます.

7.1.3.2 Automakeの条件式を使用した条件コンパイル

条件によってソースファイルをコンパイルするためのより簡単な方法としては, 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.acAM_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