automake の check ターゲットの操り方

あんまし日本語のドキュメントがみつからなかったので試行錯誤のあとを書いてみます。まぁ,Support for test suites - automake に書いてあるんですが。

Makefile.amTESTS という変数を定義しておくと,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_Oconfigure.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.amconfigure.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:入れてないと怒られるんでその手順に従ってください