Makefile.am
Makefile.amは移植性の高いMakefileを作るためのMakefile.inの雛形。Makefile.inはconfigureスクリプトでMakefileに変換するんだけど、そのためにはconfigure.acにMakefileを出力するためのマクロを書く必要がある。以前は、configureスクリプトはMakefile.inからMakefileを生成するために実行していた。しかし、最近はMakefileの地位も下がり、AC_CONFIG_FILESマクロの引数に指定されているファイルに、.inというサフィックスがついたファイルがあれば、自動的に変換してくれる。
最初に空っぽのディレクトリを作る。
$ mkdir empty $ cd empty
そして、空っぽのMakefile.amを作る。
$ touch Makefile.am
その後で、configure.acの雛形(configure.scan)を作り、ファイル名を変更する。
$ autoscan $ mv configure.scan configure.ac
ファイルの最後の2行に、Makefileが生成されるためのマクロが記載されているのを確認する。
$ tail -n2 configure.ac AC_CONFIG_FILES([Makefile]) AC_OUTPUT
気になる人は、configure.ac全体を眺めてみると良いと思う。
configure.acにもう一つだけ追加が必要なマクロがある。マクロ名は、AM_INIT_AUTOMAKE。これはautomakeを使うことをautoconfに伝えるマクロである。今回は、GNU projectとして作るわけではないので、foreignという引数を与える。現在のAutomakeのバージョンは
$ automake --version automake (GNU automake) 1.11
なので、それも引数に追加する。結局、AM_INIT_AUTOMAKE([foreign 1.11])という一行を、
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
という行の後に追加する。
$ head -n6 configure.ac| tail -n2 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AM_INIT_AUTOMAKE([foreign 1.11])
ここまでできたら、autoreconfってコマンドを実行する。その際、Automakeが必要なファイルを追加するように、--installというオプションを付ける。
$ autoreconf --install configure.ac:6: installing `./install-sh' configure.ac:6: installing `./missing'
6行目のマクロのおかげで、必要なファイルが追加されたのが分かる。
ここまでくると、configure && make && make installという一連の作業ができる。しかし、空っぽのMakefie.amから移植性の高いMakefile.inができていることを確認する。
$ wc -l Makefile.in 437 Makefile.in
これだけ大量の中身があれば、さぞかし移植性が高いだろうと予想できる。
$ ./configure
を実行すると、移植性の高いMakefileができあがる。Makefileの移植性の問題も、autoconfのマニュアルに書かれている。必要があれば読むと楽しい。
できあがったMakefileには、makeコマンドの引数として使えるターゲットがいっぱいある。
$ make all make: `all' に対して行うべき事はありません.
当たり前である。
$ make dist
すると、full-package-name-VERSION.tar.gzというファイルが生成される。名前が格好悪いと思ったら、configure.acの5行目に適当に名前とバージョンをいれてみれば良い。dist-bzip2 dist-lzma dist-xz dist-shar dist-zip など、自分の好みのパッケージにしてくれる。
最高の技は、
$ make distcheck
で、パッケージを作って、それでビルドできるか試してくれる。