さて,渦から渦まで頭を浮かせる(?)プログラムのzardoz
を,たった今書
き終えたと仮定しましょう.移植性のフレームワークを提供するためにAutoconf
を使用していましたが,`Makefile.in'は特別に作成しました.それらを堅
牢にしたいのでAutomakeに切替えてみましょう.
第一歩はautomake
が必要とするコマンドを含めるため,
`configure.in'の更新を開始しましょう.こうする方法は,
AC_INIT
の直後にAM_INIT_AUTOMAKE
の呼び出しを加えることです.
AC_INIT(zardoz, 1.0) AM_INIT_AUTOMAKE ...
プログラムには,(例えば,gettext
を使用していないし,共有ライブラ
リもビルドしないし)複雑な要因が全くないので,この部分はおしまいです.な
んて簡単なんでしょう!
さて`configure'を再生成する必要があります.しかしこうするためには,
使用している新しいマクロを見つける方法をautoconf
に伝える必要があ
ります.こうするための最も簡単な方法は,`aclocal.m4'を生成する
aclocal
プログラムを使用することです.しかしちょっと待って下さい
...プログラムに対してちょっとマクロを書く必要があり,既に
`aclocal.m4'があるかもしれません.aclocal
プログラムでは,マ
クロを`acinclude.m4'に書いておく必要があるので,単純に名前を変更し
て以下のように実行します.
mv aclocal.m4 acinclude.m4 aclocal autoconf
さてzardoz
に対する`Makefile.am'を書く時間がやってきました.
zardoz
はユーザプログラムなので,他のユーザプログラムがインストー
ルされる場所にインストールしたいと思います.bindir
です.さらに,
zardoz
にはTexinfoドキュメントもあります.`configure.in'スク
リプトではAC_REPLACE_FUNCS
を使用するので,`@LIBOBJS@'をリ
ンクする必要があります.そのため以下のように書いたほうが良いでしょう.
bin_PROGRAMS = zardoz zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c zardoz_LDADD = @LIBOBJS@ info_TEXINFOS = zardoz.texi
さて,`Makefile.in'を生成するためにautomake --add-missing
を
実行して,必要な補助ファイルを入手して,おしまいです!
GNU helloは,古典 的単純さと融通性で有名です.このセクションでは,AutomakeをGNU Helloパッ ケージに使用する方法を示します.以下の例は,GNU Helloの最近のベータバー ジョンからのものですが,著作権のコメント全体と同様に,管理者専用のすべて のコードが取り除かれています.
もちろん,GNU Helloは伝統的な二行より幾分長くなっています.GNU Helloは国 際化されていて,オプション処理をして,そしてマニュアルとテストスイートも あります.
GNU Helloの`configure.in'は以下のようになっています(3).
dnl Process this file with autoconf to produce a configure script. AC_INIT(src/hello.c) AM_INIT_AUTOMAKE(hello, 1.3.11) AM_CONFIG_HEADER(config.h) dnl Set of available languages. ALL_LINGUAS="de fr es ko nl no pl pt sl sv" dnl Checks for programs. AC_PROG_CC AC_ISC_POSIX dnl Checks for libraries. dnl Checks for header files. AC_STDC_HEADERS AC_HAVE_HEADERS(string.h fcntl.h sys/file.h sys/param.h) dnl Checks for library functions. AC_FUNC_ALLOCA dnl Check for st_blksize in struct stat AC_ST_BLKSIZE dnl internationalization macros AM_GNU_GETTEXT AC_OUTPUT([Makefile doc/Makefile intl/Makefile po/Makefile.in \ src/Makefile tests/Makefile tests/hello], [chmod +x tests/hello])
`AM_'マクロは,Automake(あるいはGettextライブラリ)によって提供され ています.残りは標準的なAutoconfマクロです.
トップレベルの`Makefile.am'は以下のようになっています.
EXTRA_DIST = BUGS ChangeLog.O SUBDIRS = doc intl po src tests
御覧のように,ここでの仕事はすべてサブディレクトリで実際に実行されます.
`po'と`intl'ディレクトリは,gettextize
を使用することで
自動的に生成されます.それらについてはここで述べません.
`doc/Makefile.am'は以下のようになっています.
info_TEXINFOS = hello.texi hello_TEXINFOS = gpl.texi
これで,GNU Helloマニュアルをビルドして,インストールして,そして配布す るには十分です.
`tests/Makefile.am'は以下のようになっています.
TESTS = hello EXTRA_DIST = hello.in testdata
`hello'スクリプトは,configure
により生成され,それはテストケー
スのみで生成されます.make check
でこのテストを実行します.
最後は`src/Makefile.am'で,実際にすべての仕事が行なわれる場所です (4).
bin_PROGRAMS = hello hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h hello_LDADD = @INTLLIBS@ @ALLOCA@ localedir = $(datadir)/locale INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"
以下にもう一つの,トリッキーな例があります.それは同じソースファイル
(`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 section 自動的なde-ANSI-fication).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'になるでしょう.(オブジェクトファ イルの名前が問題となることは滅多にありません.)
Go to the first, previous, next, last section, table of contents.