autotoolsを使ってみよう
はじめに
これまで、以下のブログでMakefileの基本的な使い方を説明しました。
autotoolsをひとことで言うと、Makefileそのものを生成できるツールです。ではなぜ、Makefileを直接書かずに間接的に生成するのでしょうか。それは、次のような特徴により、簡潔に高機能なMakefileが作成できることにあります。
- 自動的に依存関係を生成
- 複数のプラットホーム(OS)をカバーしやすい
- デフォルトでclean、install、distなどの標準的なターゲットが作成される
著者は、1つ目の依存関係の自動生成機能をたいへん便利と感じています。Makefileを直接記述する場合、ターゲット(作成するプログラムなど)が依存しているソースファイルやインクルードファイルをユーザー自身で調べて列挙する必要があります。プロジェクトの規模が大きくなると、この作業を正確に行うのは大変です。また、開発中は依存ファイルがどんどん増えていくので、依存の記述が漏れてしまうこともあります。そうした場合、正しくビルドできず、その原因の調査などのために開発が中断されます。
シンプルな例
prog1.hとprog1.cから構成されるプログラムのためのMakefileをautotoolsで作成してみましょう。次の図のようにconfigure.acとMakefile.amの2つのファイルをユーザーが作成します。
[configure.ac]
AC_INIT([prog1], [1.0])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AC_OUTPUT([Makefile])
[Makefile.am]
bin_PROGRAMS = prog1
[prog1.c]
#include <stdio.h>
#include "prog1.h"
int main(void)
{
printf("My name is %s.\n", MY_NAME);
return 0;
}
[prog1.h]
#define MY_NAME "prog1"
では、実際にMakefileを作成してみましょう。上記の4つのファイルを同じディレクトリに配置して次のようにコマンドを実行します。
$ autoreconf -i
$ ./configure
$ make
これで、prog1というプログラムが作成されます。
自動的に作成される機能
自動で作成される機能について確認してみましょう。
たとえば、以下のようにprog1.hを更新して、makeと入力すると再度、ビルドが実行されます。これは自動的に正しい依存関係を含んだMakefileが作成されているからです。
$ touch prog1.h
また、次のようにinstallを指定すると、おそらくデフォルトでは/usr/local/binにインストールされます。なお、インストール先をconfigure時の--prefixオプションで変更できます。
$ make install
cleanターゲットを指定すると、実行プログラムprog1や中間ファイルprog1.oが削除されます。
$ make clean
distcleanは、Makefileなどより広範な生成物を削除します。この操作をした後は再度、configureを実行する必要があります。
$ make distclean
distターゲットで、配布用のソースコード一式、いわゆるtarボール(prog1-1.0.tar.gz)が作成されます。
$ make dist
configure.acの解説
1行目、AC_INITの第一引数にはプロジェクト名、第二引数にはバージョンを指定します。なお、各引数が角括弧"["と"]"で囲まれていることに気づくと思います。これは引用符でC言語やシェルスクリプトでいうクォーテーションやダブルクォーテーションのようなものです。なくても動作する場合もありますが、つけておくほう無難です。
2行目、AM_INIT_AUTOMAKEは、今回のようにMakefileを作成する時に記載します。引数のforeignを指定しない場合、GNUプロジェクトで標準的に必要とされるファイル、例えば、NEWSやChangelogなどを用意する必要があります。今回は、そのようなプロジェクトではないので、foreignを使っています。
3行目、AC_PROG_CCは、Cコンパイラを使用する場合に記載します。
4行目、OUTPUTには、生成するファイル(今回はMakefile)を指定します。
Makefile.amの解説
見て分かるように極めて簡潔です。bin_PROGRAMS =の右辺に作成するプログラム名を記載します。なお、この場合、プログラ名.cがソース・ファイルになることが暗に仮定されます。他のファイルや複数のファイルからプログラムが作成される場合については次回説明します。
まとめ
autotoolsを使うと、非常に短い記述で正しい依存関係を含むMakefileが作成されることが分かったと思います。この記事を読んで興味を持ったら、ぜひ、あなたのプログラミングにも活用してみてください。次回は、複数のファイルからプログラムを作成する場合、オプションをコンパイラに与える方法について紹介します。