以下にもう一つの,トリッキーな例があります.それは同じソースファイル
(true.c)から二つのプログラム(true
とfalse
)を生成す
る方法を示します.難しい部分は,それぞれのtrue.cのコンパイルで,
異なるcpp
フラグが必要になるということです.
bin_PROGRAMS = true false false_SOURCES = false_LDADD = false.o true.o: true.c $(COMPILE) -DEXIT_CODE=0 -c true.c false.o: true.c $(COMPILE) -DEXIT_CODE=1 -o false.o -c true.c
true_SOURCES
の定義が無いことに注意してください.Automake は,ソー
スファイル名true.cが存在すると暗黙に仮定し,true.oにコン
パイルし,trueにリンクするルールを定義します.上記の
Makefile.amで提供されているtrue.o: true.c
のルールは,
Automakeが生成するtrue.oをビルドするためのルールに優先します.
false_SOURCES
は空で定義されています — その方法では,暗黙の値
で置換されません.falseのソースでリストアップしていないので,プ
ログラムをリンクする方法をAutomakeに伝える必要があります.これが
false_LDADD
行の目的です.false_DEPENDENCIES
変数は
falseターゲットの依存性を保持していて,false_LDADD
の内容
からAutomakeが自動的に生成されます.
上記のルールは,コンパイラが‘-c’と‘-o’の両方を受け入れない場
合は動作しません.これを簡単に修正するため,(並行したmake
の問題
を避けるために)偽の依存性を導入します.
true.o: true.c false.o $(COMPILE) -DEXIT_CODE=0 -c true.c false.o: true.c $(COMPILE) -DEXIT_CODE=1 -c true.c && mv true.o false.o
また,これらの明示的なルールは,de-ANSI-ficationが使用される場合は動作 しません(see ANSI).de-ANSI-ficationをサポートするためには,もう少 し多くの仕事が必要です.
true_.o: true_.c false_.o $(COMPILE) -DEXIT_CODE=0 -c true_.c false_.o: true_.c $(COMPILE) -DEXIT_CODE=1 -c true_.c && mv true_.o false_.o
お分かりのように,同じ作業を行なうため,よりいっそう簡単な方法もありま
す.上記のテクニックには,マニュアルの例として残しておくには十分役に立
つものもあります.しかし,true
とfalse
を現実的にビルドす
る場合は,以下のように,おそらくプログラムごとにコンパイルのフラグを使
用することでしょう.
bin_PROGRAMS = false true false_SOURCES = true.c false_CPPFLAGS = -DEXIT_CODE=1 true_SOURCES = true.c true_CPPFLAGS = -DEXIT_CODE=0
この状況では,Automakeによって,true.cは異なるフラグで二度コン パイルされることになります.de-ANSI-ficationは自動的に動作します.この 例では,オブジェクトファイルの名前はautomakeが選択します.それは false-true.oとtrue-true.oになるでしょう.(オブジェクトファ イルの名前が問題となることは滅多にありません.)