[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
3.1 簡単な例、始めから終わりまで | ||
3.2 模範的なプログラム | ||
3.3 etagsとctagsの構築 |
あなたはちょうど、あなたの頭を渦から渦へ漂わせるプログラム(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
を走らせればよい、そうすれば
完了だ!
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)\" |
ここで別の、もっと巧妙な例を見せる。同じソース・ファイル(`etags.c')
から二つのプログラム(ctags
とetags
)を生成する方法を示す。難
しい部分は`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.