Go to the first, previous, next, last section, table of contents.


いくつかのパッケージの例

簡単なサンプル例の最初から最後まで

さて,渦から渦まで頭を浮かせる(?)プログラムの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と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 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

分かってくるにしたがって,同じ作業を行なうため,よりいっそう簡単な方法も あります.上記のテクニックには,マニュアルの例として残しておくには十分役 に立つものもあります.しかし,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.o'`true-true.o'になるでしょう.(オブジェクトファ イルの名前が問題となることは滅多にありません.)


Go to the first, previous, next, last section, table of contents.