2010/09/24

Linux上でBoostをビルドしてみよう

検索でわざわざBoostのビルドを探して飛んでくれたひとがいたのに
みたら、クロスコンパイルしか書いてないとか、ワンステップ飛ばしてるだろ

ってことで、Boostのビルドについて少し書こうと思います。

方法は、そんなに難しくなくて、ステップは3つほど

  1. Boostのダウンロードと展開
  2. bjamを作る(bootsrap.sh)
  3. bjamでboostをインストール

です。

というか、普通のboostでいいなら、Linuxの場合は

apt-get boost

です。

なんで、boostをビルドしなきゃいけないかというと
組込みなどのクロスコンパイルが必要な環境のモジュールを作成する場合

ターゲット上で動作する環境と、ホスト側のエミュレート環境を
できるだけ近づける必要があります。

具体的には、「ホストで使えたのに、ターゲットで動かねぇよ」

って。これが一番困るのです。
実際の話でいくと、そこまで問題は起こらないとは思いますが
減らせるリスクはできるだけ減らしましょうってことで。

ダウンロード

ダウンロードは、boost.org から持ってきます。

クロスコンパイル時は、1.43.0だったので、今回もこれを。
ダウンロードしたら、展開してください

tar zxvf boost_1_43_0.tar.gz

とかでいいと思います。

bjamを作る

展開できたフォルダに移動して、bootstrap.sh を実行します。

作業場所では、いつも話題に上がりますが、
2度目ですが、boostrap ではなく bootstrapですw

cd boost_1_43_0
./bootstrap.sh

といった感じ。

bjamでboostをインストール

bjamの実行最後に、bjamを実行して、モジュールを作ります

sudo ./bjam --without-python --without-mpi threading=multi install

解説ですが、

--without-python は、ターゲットにもpythonいれなかったので。
クロスコンパイルでの開発以外にも、色々作る予定であれば
Pythonも入れていいかと思います。
コンパイルでずっこける場合は、python-dev だっけか(うろおぼえ)が必要だと思います。

apt-get install python-dev

とか、こんな感じで。やり直しても上手くいかないなら --clean(クリーン) -a(リビルド) とか

--without-mpi は指定しなくても勝手に外れますが、メッセージが気になるので。

threading=multi でマルチスレッド対応に。

作成するモジュールなどの細かい設定は、クロスコンパイルの記事
見てもらうと良いと思います。

2010/09/23

Boost date_time で、フォーマット入力と出力

たまたまtwitterで、boostのdate_timeでフォーマット入出力が上手くいかないとの
ことだったので、作ってみた。
環境は
  • g++
  • boost 1.43.0
手順は以下のとおり
  1. ファセットの定義
  2. 入力元 出力先 に使用するストリームの宣言
  3. ldtを宣言(いちおう、元データを設定)
  4. ストリームに、ファセットを設定(localeは、ssのものをそのまま設定)
  5. 時間の文字列を文字列ストリームに設定
  6. 入力用ファセットにフォーマットを指定
  7. 読み込み
  8. 文字列ストリームをクリア
  9. 出力用ファセットにフォーマットを指定
  10. 書き込み
  11. 画面表示

ちなみに1.でファセットをポインタで宣言していますが、

これは、ストリームがファセットを自動で開放するためです。

ちなみに、deleteとかすると Segmentation fault です。

ソースコードは

#include <locale>
#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time/local_time.hpp>

int main()
{
// 1. ファセットの定義
boost::local_time::local_time_facet* outputFacet =
new boost::local_time::local_time_facet();
boost::local_time::local_time_input_facet* inputFacet =
new boost::local_time::local_time_input_facet();

// 2. 入力元 出力先 に使用するストリームの宣言
std::stringstream ss;

// 3. 入力元 出力先 に使用するストリームの宣言
boost::local_time::local_date_time ldt =
boost::local_time::local_sec_clock::local_time(
boost::local_time::time_zone_ptr() );

// 4. ストリームに、ファセットを設定(localeは、ssのものをそのまま設定)
ss.imbue( std::locale( ss.getloc(), outputFacet ) );
ss.imbue( std::locale( ss.getloc(), inputFacet ) );

// 5. 時間の文字列を文字列ストリームに設定
ss.str( "Mon, 10 Aug 2009 17:12:34" );
// 6. 入力ファセットにフォーマットを指定
inputFacet->format( "%a, %d %b %Y %H:%M:%S" );
// 7. 読み込み
ss >> ldt;

// 一応デバッグのため、時間をばらして出力
boost::posix_time::ptime pt = ldt.local_time();
boost::gregorian::date d = pt.date();
boost::posix_time::time_duration t = pt.time_of_day();
std::cout << "Year : " << d.year() << std::endl;
std::cout << "Month : " << d.month() << std::endl;
std::cout << "Date : " << d.day() << std::endl;

std::cout << "Hour : " << t.hours() << std::endl;
std::cout << "Minute : " << t.minutes() << std::endl;
std::cout << "Second : " << t.seconds() << std::endl;

// 8. 文字列ストリームをクリア
ss.str( "" );
// 9. 出力用ファセットにフォーマット指定
outputFacet->format( "%a, %d %b %H:%M:%S" );
// 10. 書き込み
ss << ldt;

// 11. 画面表示
std::cout << ss.str() << std::endl;

return 0;
}

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も同様の手順で動かすことが出来ますので必要な方は
読み替えて試してみてください。

2010/09/06

Bogilo の使い心地

とりあえず Blogilo を入れてブログの投稿をすることにしたけど、なかなか使い心地いいなぁ

画像を突っ込むのに、いちいち「ファイル保存」して、「そのファイルを指定して」って
手順があるのがめんどっちいですね。

まぁでも、そんなに困ってないのと、最近はもっぱらクロスコンパイルとか
コンソールネタばっかりなので、そんなに気にしなくても大丈夫か。

画像加工の話でいくと、GIMPをまともに使えないので、そっちが上手につかえたら
多少楽になるのかな。

試しに画像はっつけようとして、GIMPでキャンパスの変更が上手くいかずに挫折とか・・w

使い慣れた環境から移動するのは新鮮だけど、色々大変です

2010/09/04

Linux FireFoxで Backspace で戻れない件

FireFoxをインストールしたのはいいけど、ずっと不思議だった

Backspace で戻れない・・・

調べてみたら、Linux版はWindows版と違って、
Backspaceで戻る仕様じゃないんだそうな。

でも、戻りたいので、設定してみます。

やり方は

configを起動

ブラウザのアドレス欄に、「about:config」って入れて
FireFoxの設定値編集ページを開く

設定値の変更

browser.backspace_action をフィルタに入れて
出てきた値を 0 に設定すると、backspaceで戻れるようになります。

他のショートカットとかぶったりするのかなぁ
まぁでも、かぶったらその時考えよう・・・

Blogiloから、テスト投稿しますよ

Blogilo 入れてみた。

そもそも、メインPCをLinux(Ubuntu 10.04)にしたのが始まりなんだけど、
Linuxにしたら、Windows Live Writer つかってたのに、使えなくなるじゃんw

んで、色々調べてみたら Bilbo 使ってる人が多そうな感じ。

んでまぁ、入れてみました。

入れ方は、Linuxですから Synaptic で Bilbo を検索すればOK

そしたら、Blogiloも一緒にはいったり、KDE関連のモジュールが山ほど入ったり・・・
今後も考え、とりあえず入れてみることに。

んで、起動したら、Driver not loaded・・・ とか出てくるし、立ち上がらないし・・・

調べてみれば、libqt4-sqllite が入ってないからっぽいので、入れてみる。

起動・・・!

動く、動くぞ!

上部メニューのBlogから、自分のBlogを設定して完了。

これからは、Blog投稿はこれにお世話になるのかな。

ちなみに、アンインストールすると、メニューに残るので、
usr/shareあたり(だっけ?)のメニューのショートカットから手動で削る必要がありそうですね。
(メニューの編集には出てこないです。)

んで、使ってみたら、BlogiloにBibloのアップデートがかかる感じなんだろうか。
メニューにBilboって出てくるって書いてあったような気がするけど・・・