2010/09/08

GoogleTest(GoogleMock) のクロスコンパイル

今回は、GoogleTestを実機上で動かしてみようっていう試み。
(すっごい申し訳ないですが、記憶で書きました・・・ この手順やコマンドで、ほんとに動くか試しますが
手順的にはあってるはずなので・・・ 勘弁してください・・・)

なんでそんなことするかって、自分の環境で動くのに、実機にもってたら
実機に持っていったら動かないとか、良くある話ですよね。

それなら、テストが実機上で動けばいいんです。

GoogleTestは、configureを使うことが出来るので、クロスコンパイル設定をして
Makefileを作ってみます。

ダウンロードと展開

持ってくる場所は、この辺から(今回は1.5.0のtar.gzを使います)

んで、展開します。

tar zxvf gtest-1.5.0.tar.gz

とか、そんな感じ

ちなみに、クロスコンパイルすると自動でsharedライブラリはnoになるようです。

実際、テストのライブラリをramdiskに含むと、releaseの環境の場合に、リリースに不必要な
テスト要ライブラリをramdiskから外す手間や、そもそも、テスト環境とリリース環境ののramdiskに
差異が生まれてしまい、テスト自体が無意味になります。
sharedライブラリつくって、起動前にLD_LIBRARYを指定するのもアリだと思いますが
今回は、staticライブラリで動かします。
(どうしてもsharedを使う場合は、--enable-shared=yes を指定すれば出来ると思います(未検証)

今回は、staticリンクで、動かす感じになります。

configure

configure でmakeを作ります。

./configure --prefix=<ライブラリのインストール先> --host=<CPU名>-<実機のOS> CC=<コンパイラ> CXX=<コンパイラ>

です。

prefixについては、別にどこでもいいんですが、そのまま入れると、コンパイルする側の環境を書き換えるので
自分のところで動かなくなる危険があると思われます。

hostの指定は、powerpc(ppcでもOK) とか x86_64 とか。 「-」でつないで、linux って感じです。

CC と CXX は、実際に仕様するクロスコンパイラを指定してください。

make とか インストール

configureが成功したら

make all install

prefixで指定した先の書き込みアクセスに、root権限が必要なら

make all
sudo make install

です。

実際に動かして動作を確認してみる

ライブラリが出来上がったら、実際に動作を確認してみます。

まずはソースコードを作ります。

// ExcecuteTest.cpp
#include<gtest/gtest.h>

class ExecuteTest : public testing::Test {}

TEST_F( ExecuteTest, success )
{
EXPECT_EQ( 1, 2 );
}

今度は、これをコンパイルとリンク

<クロスコンパイラ g++> ExcecuteTest.cpp -I"<prefixで指定したパス/include>" -L"<prefixで指定したパス/lib>" -lpthread -lgtest -lgtest_main -o ExcecuteTest.bin

と、こんな感じ。

出来上がった ExecuteTest.bin を、実機環境に持っていって、動作させて REDを確認

8行目の「EXPECT_EQ( 1, 2 );」を 1, 1 に直して、実行ファイルを作り直して、Greenを確認

問題点と課題

  • 実行結果とか、実行時の情報の取得が難しい
  • CIとの連動(FTPで実現可能?)
  • sharedライブラリで動作させるため、実行ファイルの肥大化

なんて課題があります。いくつか案はあるものの、まだ未実験です・・・

ちなみに、GoogleMockも同様の手順で動かすことが出来ますので必要な方は
読み替えて試してみてください。

0 件のコメント:

コメントを投稿