t-nissieの日記: 【電脳】Autotoolsについてのメモ Ver. 2.0
同種のものは巷に溢れているが、とりあえず自分用のメモ。
HTML版はここ。今後はこれを更新。
Ver. 1.0はここ。
誤りの指摘やコメントなどいただけたらうれしいです。
= Autotoolsについてのメモ
このメモはGNU Autotoolsのautoconfとautomakeとを使って
フリーソフトウェアの配布用パッケージを作る方法を解説している。
FortranのプロジェクトにAutotoolsを使う場合の注意点も書いてある。
== はじめに
たいていのGNUのフリーソフトウェアは次のようにtar ballを展開して、
./configure && make && make installとすることで簡単にソースからインストールすることができる。
tar xf feram-X.YY.ZZ.tar.xz
$ cd feram-X.YY.ZZ
$ mkdir Linux # Use build directory.
$ cd Linux
$ ../configure --help
$ ../configure
$ make
$ make check
$ sudo make install
AutotoolsはそんなGNU流のフリーソフトウェアパッケージの
構築を半自動化するためのツールである。最終目的はmake dist
で foo-1.2.tar.gzなどという[パッケージ名]-[version].tar.gz
形式のパッケージが自動生成できるようになること。
== 必要なもの
GNUの2つのパッケージautoconfとautomakeとを開発用のマシン
にインストールしておく必要がある。また、GNU makeやbashそして
GNU M4も最新のものを用意したほうがよい。
* autoconf http://www.gnu.org/software/autoconf/
* automake http://www.gnu.org/software/automake/
* make http://www.gnu.org/software/make/
* bash http://www.gnu.org/software/bash/
* M4 http://www.gnu.org/software/m4/
たいていのLinuxディストリビューションにはこれらのツールの
パッケージがある。たとえばDebianやUbuntuなら
$ sudo apt-get install autoconf automake libtool autoconf-doc libtool-doc
でインストールできる。
== コマンドとファイル
Autotools (autoconf and automake) では Fig:process に示すとおり
いくつかのコマンドとファイルとによって処理が進む。
実際はautoreconfが自動でやってくれる。
以下に関連すコマンドとファイルを列挙した。
\Fig:process doc/figures/autoconf-automake-process.jpg
Autotools(autoconf と automake)による作業の流れ。
実際はautoreconfが自動でやってくれる。
(この図はクリエイティブコモンズライセンスの下に
http://commons.wikimedia.org/wiki/File:Autoconf-automake-process.svg
から配布されているもの。)
/Fig:process
=== 関連コマンド
autoscan configure.acの雛形configure.scanを生成。
autoreconf 定番。-vオプションを付けて実行すれば何をしているのかがわかる。
以下のコマンド自動的に再実行してくれる。
autoconf configure.ac を元に configure を生成。
automake Makefile.amからMakefile.inを生成。
オプション -a を付けて実行すると必要なファイルを
/usr/local/share/automake-1.11/ からリンクしてくれる。
autoheader config.h.in を作ってくれる。
aclocal aclocal.m4を作ってくれる。
=== 関連するファイルとディレクトリ
configure.ac configureの雛型。自分で書く。
Makefile.am Makefileの雛型のMakefile.inの雛型。自分で書く。
ライセンスをGPL以外にしたい場合はMakefile.amに
AUTOMAKE_OPTIONS = foreign と書いておく。
書いておかないとGLPが採用されてCOPYING等をコピーしてくれる。
config/gnu/ ファイルがごちゃごちゃ出来てイヤな場合はMakefile.amに
AC_CONFIG_AUX_DIR(config/gnu)と指定するとmissing等がそこに置かれる。
config.guess Makefile.amにAC_CANONICAL_TARGETなどと書くとautomake -aが
用意してくれるOSやCPUの自動判別をしてくれるスクリプト。
config.h.in config.hの雛型。autoheaderによりMakefile.amやconfigure.acから自動的に作られる。
config.h configure.acにAC_CONFIG_HEADERS([config.h])と指定。
ないとコンパイルオプションが長くややこしくなるので、使ったほうがよい。
config.log configure の実行時のログ。問題が起きたら読む。
config.status configure を実行すると出来るスクリプト。foo.in から foo を作るのは実はこいつ。
missing automake -a が用意してくれる謎のスクリプト。
== 使用方法
=== メモ
* ある程度開発が進んで、ソースとMakefileができあがってからAutotoolsを使いはじめるとよい。
* autoconfとautomakeのマニュアル http://www.gnu.org/software/autoconf/manual/autoconf.html
http://www.gnu.org/software/automake/manual/automake.html やinofoを参照せよ。
* よくできたパッケージを参考にしてconfigure.ac, Makefile.am, scr/Makefile.amを見よう見まねで書く。
* automake -aやautoreconfで生成されるファイルはSubversionなどのリポジトリに登録しないほうがよい。
=== Fortranについてのメモ
* AutotoolsはFortranのプロジェクトにも使える。
* AC_LANG(Fortran), AC_PROG_FC(gfortran ifort)などを使う。
* 関係する変数はFC, FCFLAGS, FCLIBS, CPPFLAGSなど。
* Fortranでもcpp(Cプリプロセッサ)を使うと便利。
その場合、ソースのファイルの名拡張子は.Fを使う。.F90はGNU makeのデフォルトでないので使わない。
* AC_FC_FREEFORM()で自由形式のオプションがわかる。
=== 手順
configure.ac, Makefile.am, scr/Makefile.amを書いて、
$ autoreconf -v
$ automake --add-missing # 初回にautoreconfで実効を要求されたとき
$ autoreconf -v # 念のためもう一度
$ ./configure
$ make # コンパイルできることを確認
$ make distclean # Makefileなどをきれいさっぱり消す
$ ./configure
$ make dist # 配布用パッケージの作成
=== make checkでテストの自動化
Makefile.amに
TESTS=foo.sh bar.sh
と書いておけば
$ make check
でfoo.shとbar.shとがテストとして実行される。
ソフトウェアのテストを自動化できる。
foo.shとbar.shとはカレントディレクトリになければsrcdirの中も探されるので、
build directoryの中でもテストができる。
ただし、foo.shとbar.shとは自動的にパッケージに入れてくれるわけではないので、
Makefile.amの中のEXTRA_DISTに次のように加えておく必要がある。
EXTRA_DIST = README \
foo.sh \
bar.sh
=== automakeのオプション
automakeのオプションはconfigure.acの中にAM_INIT_AUTOMAKEで指定する。例えば
AM_INIT_AUTOMAKE([1.11.1 no-dist-gzip dist-xz])
では、automakeのバージョン1.11.1以上を使用することを強制し、
パッケージをtar.gzでなくtar.xzで作るように指定している。
== Autotoolsの使用方法として参考になるパッケージ
=== LHa for Unix
シンプル。
http://www2m.biglobe.ne.jp/~dolphin/lha/lha-unix.htm
=== ntp
大規模。libtoolも使われている。
http://support.ntp.org/bin/view/Main/WebHome
=== feram
小規模。Fortranで書かれている。
http://loto.sourceforge.net/feram/
* configure.ac https://sourceforge.net/p/loto/code/HEAD/tree/feram/trunk/configure.ac
* Makefile.am https://sourceforge.net/p/loto/code/HEAD/tree/feram/trunk/Makefile.am
* src/Makefile.am https://sourceforge.net/p/loto/code/HEAD/tree/feram/trunk/src/Makefile.am
== まとめ
autoconfとautomakeとの使い方を説明した。
他に共有ライブラリを操るための libtool http://www.gnu.org/software/libtool/ もある。
これらGNU Autotoolsを活用すれば、簡単に配布用のフリーソフトウェアパッケージを作ることができる。
【電脳】Autotoolsについてのメモ Ver. 2.0 More ログイン