lcovでエラーになるのでgcovrに変更
2025/09/13
C言語でプログラムを書いて単体テストをしているのだが、カバレッジ状況を目視したいと gcov / lcov を使おうとした。
が、gcov は gcc -coverage
で(たぶん)うまいことやってくれたものの lcov
の geninfo
でエラーになった。
昔はこのくらいのオプションで実行できたのだが。。。と調べると記事があった。
そうそう、これこれ。
以前もあって、酒を飲みながらやっていたのであまり覚えていないが同じことをどこかで見つけて対応した気がする。
今の lcov v2 だとうまいこといかないので v1 に戻すという対処だ。
Ubuntu の apt install lcov
だと私も v2.0-1 になっていたのでそれで対処できるのだろう。
ただ、これを書いている時点の最新 lcov は v2.3.2だ。
2025年8月25日リリースなのでもしかしたら直っているかもしれない。
まあ Issue #398 が Open のままなので無理かもしれん。
lcov のインストール
とはいえ試さないときになるのでインストールしてみる。
インストール時はビルドするというよりもコピーする感じ?
make install
だけだと自動で /usr/local
が使われるし、DESTDIR
を指定してもその下に ./usr/local
が作られるだけだ。
make PREFIX=$HOME/.local install
のように書くと指定したディレクトリの下にインストールされる。
ただ、これでインストールしても実行すると Can't locate Capture/Tiny.pm in @INC(以下略)
とエラーになってしまう。
“3. Dependencies:” に書いてある perl パッケージがインストールされていないのだろう。
例えば perl -MCPAN -e 'install(Capture::Tiny)'
などとしてインストールすることになる。
何が足りないかはエラーメッセージに “(you may need to install the XXX module)” となっているのを参考にすると良いだろう。
良いだろうが、かなり面倒だ。
しかもインストール時にテストか何か走っているのか1つ1つに時間がかかる。
lcov に一括インストールするスクリプトが入っていないか探してみたが、なさそうだ。
$ lcov --version
lcov: LCOV version 2.3.2-2.g3ed1c3d
しかし、結果としては同じく “ERROR: (inconsistent) mismatched end line” になった。
gcovr
lcov の問題なので別のツールを探してみた。
gcovrを使ってみよう。
pip install --user
だと “externally-managed-environment” になったので、よくわからんが pipx というのをインストールして使った。
$ pipx install gcovr
installed package gcovr 8.3, installed using Python 3.12.3
These apps are now globally available
- gcovr
done! ✨ 🌟 ✨
lcov の代わりにこういう感じで使うと同じようなフォーマットの HTML ファイルを出力した。
今のところこれでよさそう。
ただ Branch の数がどういう基準でカウントされているかよくわからない。 全部通っているはずなのに通ってないような。あるいはブランチの母数が大きいのか。
C言語なので --exclude-throw-branches
を付けて例外を除外すると落ち着いた気がする。
ASSERT_EQ()
などは変わらないのだが、もうテスト関数は無視する。