最近のautomakeでmake checkの挙動を戻す方法
開発環境をUbuntu 13.10にアップグレードしたら、自分が作っているライブラリのビルドでmake checkしたときの挙動が変わっていた。どうもautomakeのバージョンが上がったせいで挙動が変わってしまったようだ。
これまでは、テストプログラムがなんかいろいろ出力しながら実行されて、失敗するとエラー行を表示していたのが、テストプログラムの出力(stdout,stder)がファイルに書き出されて一切表示されなくなってしまった。
調べてみるとautomake 1.13からparallel test harnesとかいうのデフォルトになっていて、これについてはよく知らないけど、名前からして並列テストをするもので、並列実行しているプログラムの出力をターミナルに出すと混じってしまうので、ファイルに出すようになったのだと思う。
自分は並列テストを必要としていないので、とにかく過去のバージョンと同じになるように戻したい!
automake 1.13以降で過去のバージョンと同じようにテストプログラムを実行する方法
automakeのオプションにserial-testsを渡すと、make checkの挙動が過去のバージョンと同じになる。
これは、configure.acにおいてAM_INIT_AUTOMAKEの引数で指定すればよい。
AM_INIT_AUTOMAKE([foreign])
などとなっていた行を
AM_INIT_AUTOMAKE([foreign serial-tests])
と変更する。これでserial-test driverが使われるようになって、過去のバージョンと同じように動く。
ただし、これをautomake 1.11など古いバージョンで実行すると、
configure.ac:9: option `serial-tests' not recognized autoreconf: automake failed with exit status: 1
などと言われてエラーになる。
serial-testsというオプションがないのだ。クッソ!
現在と過去、すべてにおいて過去のバージョンと同じようにテストプログラムを実行する方法
ひとつの方法として、automakeのバージョンを判定して、バージョンによりAM_INIT_AUTOMAKEの引数を変更するm4マクロを書くというのがある。
しかし、自分は、automakeの歴史についての知識に基づいたノウハウとか持ちたくないのと、そもそもautomakeのテスト機能を駆使してテストを書いていたわけでなく、make checkしたときに自分で書いたテストプログラムが実行されればそれでいいので、もうautomakeのテストの仕組みを使わないことにした。
ということで、TESTSでテストプログラムを指定するのをやめて、check_PROGRAMでビルドするテストプログラムを指定した後、check-localのフックでテストプログラムを実行するようにした。
Makefile.amで
check_PROGRAMS = oreore_test TESTS = $(check_PROGRAMS)
などとしていた行を
check_PROGRAMS = oreore_test check-local: $(builddir)/oreore_test$(EXEEXT)
と変更する。これでautomake 1.11と1.13で同じような感じで動くようになった。あまりいい方法とは思えないけど、ならどうすればいいのか...