【Automake】GNU Autotools を使ってみる

GNU Autotoolsとは

AutotoolsはUNIX系OSのソフトウェアパッケージ製作ツールです。
Autoconf, Automake, Libtoolの3つが主要な機能でパッケージ開発はもちろんソースコードからインストールする時のデバッグにも役立つ知識です。

Autoconf-automake-process.svg

上記図中の各ファイルを生成するために, Autotoolsのコマンドを用います。
コマンド群の簡単な説明です。

autoscan

configure.acの雛形configure.scanを生成します。renameしてconfigure.inとします。この中にチェックしたい機能を記述します。

autoheader

configure.inとacconfig.hからconfig.h.in を生成します。config.hの雛型ファイルでconfigureのテンプレートです。

aclocal

automake用のマクロファイルaclocal.m4を生成します。

autoconf

configure.ac とaclocal.m4を元に configure を生成します。

automake

開発者自身で記述するMakefile.amからMakefile.inを生成します。Makefile.amにはライセンスも記述できます。

make

configureの実行結果でMakefileを生成します。Makefileの内容に基づいてビルドが行われます。optionはinstall, uninstall, all, clean, テストを行うcheck, Makefileも含めて削除するdistclean等があります。

パッケージをつくる

環境はDebian7です。GNUから示されているパッケージに必要なファイルを用意します。

$ touch AUTHORS INSTALL NEWS README ChangeLog

main.cを適当に書きます。最初のディレクトリ構成は以下です。

.
├── AUTHORS
├── ChangeLog
├── INSTALL
├── NEWS
├── README
└── src
    ├── include
    │   └── sample.h
    └── sample
        └── main.c

ソースコードが配置されている各ディレクトリにMakefile.amを配置します。
srcと同じ階層のMakefile.amは以下のようにします。


SUBDIRS = sample include

また, main.c と同じ階層の Makefile.am は以下のようにします。

bin_PROGRAMS = sample
sample_SOURCES = main.c

includeのMakefile.amをEXTRA_DICT = sample.hとします。この時点の構成です。


.
├── ChangeLog
├── INSTALL
├── Makefile.am
├── NEWS
├── README
└── src
    ├── Makefile.am
    ├── include
    │   └── Makefile.am
    │   └── sample.h
    └── sample
        └── Makefile.am
        └── main.c

まず, autoscan を実行すると configure.scan が生成されます。
これにAM_INIT_AUTOMAKEを追加して, AC_INITにパッケージの名前とバージョン, その他連絡先アドレス等を指定など編集をしてから configure.in に名前を変えます。C++を使う場合にはAC_PROG_CXXが必要です。

$ mv configure.scan configure.in

autoheaderでconfig.h.inを生成します。続いて,aclocalを実行してaclocal.m4を生成します。
サブディレクトリを足すには -I オプションで指定します。

$ autoheader
$ aclocal

automakeで先ほど配置した各ディレクトリにあるMakefile.amからMakefile.inを生成します。また、automakeはインストール時に必要なスクリプトを生成します。

$ automake --add-missing --copy

この時点の構成です。大分増えてきました。

.
├── AUTHORS
├── COPYING
├── ChangeLog
├── INSTALL
├── Makefile.am
├── Makefile.in
├── NEWS
├── README
├── aclocal.m4
├── autom4te.cache
│   ├── output.0
│   ├── output.1
│   ├── output.2
│   ├── requests
│   ├── traces.0
│   ├── traces.1
│   └── traces.2
├── autoscan.log
├── config.h.in
├── configure.in
├── depcomp
├── install-sh
├── missing
└── src
    ├── Makefile.am
    ├── Makefile.in
    ├── include
    │   ├── Makefile.am
    │   ├── Makefile.in
    │   └── sample.h
    └── sample
        ├── Makefile.am
        ├── Makefile.in
        └── main.c

autoconfで configure を生成します。

$ autoconf

パッケージをつかってインストールする

ここからは割と馴染みのある手順かと思います。

configureスクリプトはインストール時の環境を検査しソースコードの修正を行います。
検査結果から, Makefile.in に環境設定を追加することで最終的な Makefile となります。
実際に Makefile を生成する役割は config.status です。
失敗時には config.log を確認しましょう。

$ ./configure 
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/include/Makefile
config.status: creating src/sample/Makefile
config.status: creating config.h
config.status: executing depfiles commands

Makefileで make を行います。

$ make
make[3]: ディレクトリ `/home/project/sample_project/src/sample' に入ります
gcc -DHAVE_CONFIG_H -I. -I../..     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
In file included from main.c:2:0:
../include/sample.h:3:1: warning: unnamed struct/union that defines no instances [enabled by default]
mv -f .deps/main.Tpo .deps/main.Po
gcc  -g -O2   -o sample main.o  

make installは指定がない場合,/usr/local/binにインストールされます。

$ sudo make install

まとめると, 自分で書くのが Makefile.am, configure.in (configure.scanのrename), *.m4 (これは必須でない)です。

[1] Autotool詳細解説