Previous: Hello, Up: Examples


3.3 trueとfalseのビルド

以下にもう一つの,トリッキーな例があります.それは同じソースファイル (true.c)から二つのプログラム(truefalse)を生成す る方法を示します.難しい部分は,それぞれの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

お分かりのように,同じ作業を行なうため,よりいっそう簡単な方法もありま す.上記のテクニックには,マニュアルの例として残しておくには十分役に立 つものもあります.しかし,truefalseを現実的にビルドす る場合は,以下のように,おそらくプログラムごとにコンパイルのフラグを使 用することでしょう.

     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.otrue-true.oになるでしょう.(オブジェクトファ イルの名前が問題となることは滅多にありません.)