automake の check ターゲットの操り方
あんまし日本語のドキュメントがみつからなかったので試行錯誤のあとを書いてみます。まぁ,Support for test suites - automake に書いてあるんですが。
Makefile.am
に TESTS
という変数を定義しておくと,make check
したときに実行して結果を教えてくれます(make とかと同じく 0 なら成功,です)。
たとえばシェルスクリプトでテストコードを書いているのであれば,
# Makefile.am TESTS = tests.sh #TESTS = test1.sh test2.sh test3.sh
のように書いて,スクリプトを実行可能にしておけば OK です。
Perl でテストコードを書いた場合とかは TESTS_ENVIRONMENT
という変数も定義して,どのように実行するのかを指定できます(@INC
を指定したり,とかね)。今回はそういうことはやらなかったんで省略しますが,先に上げた GNU automake のドキュメントを参照のこと。
で,たとえば C で書かれたプログラムを autotools 化していて,テスト時にはコードの改変が必要になる場合とか。
/* foobar.c */ #include <stdio.h> int main(int argc, char *argv[]) { #ifndef TEST puts("Hello, world!"); #else puts("Hello, testing world!"); #endif return 0; }
身も蓋もない例ですんません。
こういう時は,テスト用の ***_CFLAGS
でテスト用のフラグを定義してやれば OK です。実例をみてもらうのが早いかも。
# Makefile.am # リリース用コード bin_PROGRAMS = foobar foobar_SOURCES = foobar.c utils.c # テスト用コード check_PROGRAMS = foobar_test foobar_test_SOURCES = $(foobar_SOURCES) foobar_test_CFLAGS = -DTEST TESTS = tests.sh
このように,check_PROGRAMS
というディレクティブにテスト用バイナリ名をいれておくと,make check
したときにだけビルドしてくれます(普通に make
したときはビルドされない)。具体的には check-am
ターゲットとしてですが。
ただし,このように同じソースに対して(条件の異なる)複数のターゲットをビルドする場合は AM_PROG_CC_C_O
を configure.in
に入れてくれよ,と怒られるので,入れてあげてください*1。
# configure.in # Checks for programs. AC_PROG_CC AM_PROG_CC_C_O AC_PROG_INSTALL
これいれとくと,サポートツールとして compile
というスクリプトが同梱されるようになります。
んで,これらの TESTS
用のファイルとかって実はそのままだと make dist
したときにディストリビューションに含めてくれないんですね。なので,手で指定する必要アリ。
# Makefile.am TESTS = tests.sh dist_noinst_DATA = $(TESTS) test_data.txt
dist_
というのは(DATA
だけど)ディストリビューションに含めてね,というしるし。noinst_
というのはインストールはしないよ,というしるし,です。
雑多な tips
make dist
で生成されるデフォルトディストリビューションを,tar.gz ではなく tar.bz2 にしたい場合は,AM_INIT_AUTOMAKE
にオプションを指定することができます。
# configure.in AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip])
no-dist-gzip
も指定しておかないと,tar.bz2 と tar.gz の両者を作成しますので注意。
あと,AM_INIT_AUTOMAKE
の引数に foreign
を指定しておくと,INSTALL
, NEWS
, README
, AUTHORS
, ChangeLog
, COPYING
がなくても怒られなくなります。逆にデフォルトでは gnu
という Strictness なのでこれらがないと怒られるわけです。この gnu
の場合,INSTALL
というファイルは一般的な configure の使い方に関する文書をコピーしてくれます。また,COPYING
として GPL 文書をコピーしてくれます。
以上のオプションについては Options - automake 参照。
あと,Makefile.am
や configure.in
を修正したときは,make configure
とか autoreconf -i
とかすればいいんですけど,はじめて生成するときとかツールの順序を覚えるのがめんどいので,下記のような autotools.mk というファイルを用意してます。
# autotools.mk all: clean: rm -f configure Makefile.in config.h.in aclocal.m4 rm -f install-sh missing depcomp compile rm -rf autom4te.cache rm -f *~ rescan: autoscan reconfigure: autoreconf -i configure: configure.in aclocal.m4 Makefile.in config.h.in autoconf Makefile.in: Makefile.am config.h.in automake -a -c config.h.in: configure.in autoheader aclocal.m4: configure.in aclocal
で,念のために Makefile.am
側にも
# Makefile.am realclean: distclean $(MAKE) -f autotools.mk clean
みたいなのをいれといたり。
*1:入れてないと怒られるんでその手順に従ってください