[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

3. いくつかの見本パッケージ


3.1 簡単な例、始めから終わりまで

あなたはちょうど、あなたの頭を渦から渦へ漂わせるプログラム(3)zardozを書き終わったところだと想像しよう。移植性のある 枠組を提供するためにAutoconfを使っているが、あなたの `Makefile.in'はその場限りである。あなたはそれらをがっちりさせたいの で、Automakeに切り換える。

最初の段階はautomakeが必要とするコマンドを含むように、あなたの `configure.in'を更新することである。これを行う一番簡単な方法は AC_INITのすぐ後にAM_INIT_AUTOMAKE呼び出しを加えることであ る。

 
AM_INIT_AUTOMAKE(zardoz, 1.0)

あなたのプログラムは面倒な要因を持っていない(例えば、gettextを使 わない、共有ライブラリを構築したがらない)ので、この部分は終了だ。ちょろ かったね!

さて、`configure'を再生成しなければならない。しかし、これを行うため に、あなたが使っている新しいマクロの発見法をautoconfに教える必要 があるだろう。これを行う一番簡単な方法はあなたのために`aclocal.m4' を生成してくれるaclocalプログラムを使うことだ。でも待って... あな たはあなたのプログラムのためにいくつかの毛だらけのマクロ(4)を書かなければならなかったので、す でに`aclocal.m4'を持っている。aclocalプログラムはあなた自身のマクロを `acinclude.m4'に入れさせるので、単に改名してから走らせる。

 
mv aclocal.m4 acinclude.m4
aclocal
autoconf

さあzardozのために`Makefile.am'を書くときだ。zardozは ユーザ・プログラムなので、その他のユーザ・プログラムが入るところにインス トールしたい。さらに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を走らせればよい、そうすれば 完了だ!


3.2 模範的なプログラム

GNU hello はその模範的な単純さと汎用性で高名である。この節ではAutomake がどのようにGNU Helloパッケージで使われ得たのかを示す。以下の例は最近のGNU Helloのベータ版に由来するが、著作権のコメント全てだけではなく、管理者用のみのコー ドも全て除かれている。

もちろん、GNU Helloはあなたの伝統的な二行のものより幾分多くの特色を持っ ている。GNU Helloは国際化されており、オプションの処理を行い、マニュアル とテストの組を持っている。GNU Helloはdeepパッケージである。

ここにGNU Helloからの`configure.in'を見せる。

 
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'で、そこで本来の作業の全てが行われる。

 
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)\"

3.3 etagsとctagsの構築

ここで別の、もっと巧妙な例を見せる。同じソース・ファイル(`etags.c') から二つのプログラム(ctagsetags)を生成する方法を示す。難 しい部分は`etags.c'のそれぞれのコンパイルに異なるcppフラグを 必要とすることである。

 
bin_PROGRAMS = etags ctags
ctags_SOURCES =
ctags_LDADD = ctags.o

etags.o: etags.c
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -o ctags.o -c etags.c

ctags_SOURCESが空であると定義されていることに注意せよ--こうして 暗黙の値が代用されることはない。しかしながら、暗黙の値は`etags.o'か らetagsを生成するために使われている。

ctags_LDADDは`ctags.o'をリンク行に入れるために使われる。 ctags_DEPENDENCIESはAutomakeによって生成される。

上記の規則はあなたのコンパイラが`-c'と`-o'を同時に受け取らない なら上手く行かない。このための最も簡単な処置は(並列makeでの問題を 避けるために)にせものの依存関係を導入することである。

 
etags.o: etags.c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -c etags.c && mv etags.o ctags.o

また、これらの明示的な規則はもし非ANSIの特徴が使われていると上手く行かな い(see section 自動的な脱ANSI化)。非ANSIをサポートするにはもう少しの作業が必要だ。

 
etags._o: etags._c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags._o: etags._c
        $(COMPILE) -DCTAGS -c etags.c && mv etags._o ctags.o

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.