最初に試行錯誤していたとき(基本的に、上の記述は試行錯誤→整理してゼロからやり直したもの)、RTコンポーネントを起動したとき、
Unable to create an endpoint of this description: giop:tcp::0
という表示が出て、動きませんでした。/etc/omniORB4.cfg で traceLevel=20にしたり、rtc.confに"logger.log_level: PARANOID"を設定してデバッグ情報を出力させたところ、なにかでローカルにつなぎにいったところで、こけていました。
あとでわかったですが、原因は「ifconfigしたらloがなかったこと」なのですが、googleで上記メッセージを調べると、
「ipv6対応に問題がある環境で起きる。omniORB4を"configure --disable-ipv6"でビルドすれば直る」
ということで、独自ビルドに挑みました。
最初は、mini2440にgcc/g++をいれて、ボード上でビルドを図ったのですが、gccが想定以上にリソース食いで、メモリ64Mで全然足りず、128Mのswapを有効にしてもSegmentationFaultその他で落ちるしまつ(バグだから連絡しろ、とか。メモリ確保のエラーチェックをしていないんじゃないのか?)。
最終的にクロスコンパイルすることになりました。
基本的な手順は、omniORB:CrossCompilingの手順によります。
注意点としては、Linuxのカーネルなどととは違い、その構築過程に
- まずビルドに「も」使うツール(omniidl)をコンパイルする
- そのツールで残りをビルドする
- 全部インストールする
という手順であることです。カーネルなどは、一方的にビルドしておしまい(menuconfigなどはツールのビルドをしますが)なのにたいして、インストールする予定のツールをビルドにも使う、という点です。
そのため、一発makeではなく、アーキテクチャを変えながら多段でビルドします。
- omniORB4のソースをomniORB@sourceforge からダウンロードして展開する。
- python-2.5.5をpython本拠地(Release)からダウンロードして、Readmeに従ってビルドしてインストールする。
これはmini2440がlennyで動いていて、これがpython2.5、対してubuntu10が2.6になっていてミスマッチのため。
- /usr/bin/python(python2.6へのシンボリックリンク)を消し、/usr/local/python2.5/bin/python2.5へシンボリックリンクしなおす(インストール後復旧を忘れないように ls -l /usr/bin/python をメモっておく)。
- omniORBのソースの一部を書き換える。
ディレクトリ:src/tool/omkdepend/
ファイル:def.h main.c parse.c
すべての"getline"を"get_line"に変更する
※既存のgetlineライブラリ関数と干渉するため
- omniORBのビルド用ファイルを一部書き換える。
ディレクトリ:mk/
ファイル:beforeauto.mk.in
修正:725〜730行目付近:
CDEBUGFLAGS = -O
CLINK = $(CC)
CLINKOPTIONS = $(CDEBUGFLAGS) $(COPTIONS) -static
CXXDEBUGFLAGS = -O
CXXLINK = $(CXX)
CXXLINKOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) -static
修正の意味:-staticを追加することで、スタティックライブラリにする。
CDEUGFLAGSを-Oにするのはどこで見たか忘れた記述の真似。
- configure
$ mkdir build
$ cd build
$ ../configure CC=arm-linux-gcc CXX=arm-linux-g++
--host=arm-unknown-linux-gnu --build=i686-pc-linux-gnu
--disable-ipv6 --with-omniORB-config=/etc/omniORB4.cfg
--with-omniNames-logdir=/var/log/ --prefix=/usr
全部1行で
ここで、--hostと--buildの違いが重要とのこと。ちなみに、arm-とi686-のあとは、適当に./configureを走らせると見つかる。
参考ページの後で追加したもの。
--disable-ipv6:これが主目的
--with-omniORB-config=/etc/omniORB4.cfg:debian lennyの標準に従う
--with-omniNames-logdir=/var/log/:同じく
--prefix=/usr:つけないと/usr/localに入る
- ビルドする。
まず、x86用の普通のコンパイラでツールをビルドする。
$ make CC=gcc -C src/tool/omniidl/cxx/cccp
$ make CXX=g++ -C src/tool/omniidl/cxx
$ make CC=gcc -C src/tool/omkdepend
つぎに残りをARM用にビルドする。
$ make
※すでに、omniidlはできているからそこはx86のまま残りがARMに。
x86に仮ビルドして使ったところをARM用に作り直す。
$ rm -f lib/_omniidlmodule.so* lib/omnicpp
$ make -C src/tool/omniidl/cxx clean
$ make -C src/tool/omniidl/cxx
$ make
とりあえずのディレクトリに仮インストールする(指定を間違うと大変なことになるので注意)。
$ mkdir どこか/inst
$ make DESTDIR=/フルパス/inst/ install
- この、inst/ にできた、usr以下のファイルを全部tarで固めて、mini2440の/で展開。
omniORB-pyは、このあと、mini2440上で直接ビルドしました。
このomniORBのビルドでの修正点の一つ、-staticは主に、クロスビルドのための環境と、mini2440に入っているダイナミックリンクのライブラリのミスマッチの解消が目的です。ライブラリのパスをいじったりもしてみましたが、解消せず、手っ取り早い方法として、スタティックリンクにしました。
もし、クロスコンパイルで、ld.so 系の問題が生じた場合は、バイナリサイズや実行時のメモリ上でのサイズが大きくなる弊害はありますが、スタティックリンクにすると多分、ライブラリを一緒にもっていったりするなどの手間がいらなくなると思います。
で、結局、mini2440上でのビルドを試みたり、クロスであれこれするのに、わりと手間をかけたのですが(主にはmini2440が遅いため)、結論は「lo」がない、でしたorz。ので、実際にこれでビルドしたomniORBは使わず、apt-getしたもので動いています。