GNU Autotoolsとは
AutotoolsはUNIX系OSのソフトウェアパッケージ製作ツールです。
Autoconf, Automake, Libtoolの3つが主要な機能でパッケージ開発はもちろんソースコードからインストールする時のデバッグにも役立つ知識です。
上記図中の各ファイルを生成するために, 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詳細解説