Travis CIでOpenCV + GTest + Coverallsを実行する方法

こんにちはtatsyです。

最近、これまでに作ったプログラムをまとめてGithub上で公開する作業を行っていたのですが、その際にOpenCV + GTestをTravis上でテストするのに結構苦労したのでやり方をまとめておきます。

Travis上でやりたいことは次の4つです。

  1. OpenCVをwgetしてきて、Travis上でビルドする
  2. GTestをapt-get installしてTravis上でビルドする
  3. 自分の書いたプログラムをCMakeでビルドする
  4. Coverallsにカバレッジを送信する

それでは個々のやり方についてみていきます。
 

1. OpenCVのビルド


実際のビルドに行く前に1点確認ですが、TravisサーバーはOSにUbuntu 12.04 LTSを使っているらしいです(2015年2月現在)。

ですので少し昔のバージョンで良ければ、apt-getをしてOpenCVをインストールすることも可能ですが、僕が作成中のライブラリはOpenCV 3.0ベースだったので、ソースをOpenCVのページからwgetしてきてビルドしました。

ちなみにビルドのためのスクリプトは以下のページを参考にさせていただきました(というかほぼコピー)

Installing OpenCV 3.0.0 on Ubuntu 14.04
 

2. GTestのインストール


GTestはUbuntuだとlibgtest-devというパッケージからインストールできるのですが、インストールされるのはヘッダとソースなので、これを自分でビルドしないといけません。

ちなみにインストールされる場所はヘッダが/usr/incllude/gtest、ソースが/usr/src/gtestです。

以下ビルドのためのスクリプトです。ビルド後にできるライブラリlibgtest.aとlibgtest_main.aは/usr/local/libに移動しています。

 

3. CMakeファイルの用意


通常CMakeでfind_packageを呼べばおおよそのファイルは見つけてくれるはずなのですが、Travis上ではOpenCVは見つかってもGTestは見つけてくれません。

そこで、必要な変数を環境変数にエクスポートしてCMakeファイル内で使うということをします。

まずcmakeを実行する前に、以下のエクスポートを行います。

これができたら次のコードをCMakeLists.txtに追加します。

上記のコードの中でtest_programというのが実際に作られるプログラム名になりますので、適宜読み替えていただけると助かります。

おおむねコード内容はお分かりいただけるかと思うのですが、大事なポイントは2つあります。

  1. GTestをOpenCVよりも先にリンクする
  2. add_custom_testを使ってmake checkからテストが走るようにする

1つ目のポイントについてですが、OpenCVはGTestを一部用いてテストしているためか、OpenCVを先にリンクすると、GTestの関数が重複定義でリンクエラーになります。

2つ目のポイントは僕の理解不足かもしれませんが、CMakeからmake testが呼び出されなかったため、custom testを使ってテストを呼び出しているというだけです。

これでcmakeを実行すればプログラムがビルドでき、さらにmake checkでテストが走ります。
 

4. Code Coverageを取る


Web上でいろいろ調べてみるとcpp-coverallsというPythonのプログラムが見つかるのですが、サンプル通りに書いても動かないのと、使い方についての解説が少なすぎるのとであきらめました。

これとは別にrubygemから落とせるlcov-coverallsというプログラムを使ってカバレッジをCoverallsに送信します。

やらなければならないことは大きく分けて2つです。

1つ目はgccのコンパイル時引数に–coverageというのを追加し、さらに-g -O0で最適化をオフにすることです。

これはCMakeLists.txtに次のコードを追加すればOKです。

2つ目は当たり前ですがgemからlcov-coverallsを落とす必要があります。

まず、lcov-coverallsをwgetしてきて、そのあとでgem installです。

ここまでできたら、テスト実行後にlcov-coverallsを使ってカバレッジを送るだけです。

 

まとめ


これでめでたく、OpenCV + GTestでテストを走らせてなおかつカバレッジも取れます!

結構さらっと書いてますが、サイドワークでちょこちょこやって1週間以上はかかったんじゃないかな?

実際の.travis.ymlを見たい方はこちらからどうぞ → https://github.com/tatsy/lime

かなり用途が限られている気もしますが、何かの参考にしていただければ幸いです。

それでは、最後までおよみいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください