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

で、パッケージを作って、それでビルドできるか試してくれる。

空っぽのMakefile.amでここまで遊べるとは、さすがGNUツールである。