OpenRTM-aistのクロスコンパイル

OpenRTM-aistのクロスコンパイル

クロス開発とは、ターゲットとは異なるアーキテクチャ上でそのターゲット用のバイナリを開発することです。

ArmadilloはARM Ltd.により開発されたARMアーキテクチャのCPUを搭載している組み込みコンピュータです。 一方、大半のPCはIntelが開発した i386 (または x86_64) アーキテクチャのCPUを搭載しています。 通常、ARM CPU上で実行できるバイナリ(コマンド、アプリケーション)は、i386 CPU上では実行できませんし、i386 CPU用のバイナリは、ARM CPU上では動作しません。 CPU毎に異なるバイナリ実行形式を用意してあげる必要があります。

通常ARM CPUは安価・省電力である一方、PCなどと比べるとメモリやハードディスクが少なく(ハードディスクが無いことも多い)、速度も遅いので、ARMを搭載した組み込みコンピュータ上でコンパイルなどの開発作業を行うことは効率的ではありません。 (実際、Armadillo-400シリーズに組み込まれているARM CPUはそれほど遅くはなく、一昔前のPCくらいの速度はありますので、開発作業は不可能ではありませんが。。。)

そこで、一般的なPC上で、ARM CPU上で実行可能なバイナリを作成(クロスコンパイル)するクロス開発が通常行われます。

ATDEはArmadillo用のクロス開発を行うための各種ツールがあらかじめインストールされており、標準ライブラリのみ使用するのであれば、そのままの環境で開発することができます。 /usr/arm-linux-gnueabi の下には、ARM用にコンパイルされた実行ファイルやライブラリファイルが格納されています。 以下のようにfileコマンドを使って確認してみてください。

 atmark@atde3:~$ file /usr/arm-linux-gnueabi/lib/libc-2.7.so
 /usr/arm-linux-gnueabi/lib/libc-2.7.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, stripped

ELF 32-bit LSB shared object, ARMという文字が見えますが、これはこのライブラリがARMアーキテクチャ用のものであることを表しています。

標準以外のライブラリが必要な場合、ARM Linux用にコンパイルされたDebianパッケージを、クロス開発環境にインストールすることで、これを利用したアプリケーションなどをコンパイル・リンクすることができます。

以下、OpenRTM-aistをクロスコンパイルするために必要なパッケージのインストール、クロスコンパイル方法について解説します。

必要なパッケージのインストール

クロス開発を行うためには、ARM用の各種ライブラリをインストール剃る必要があります。ATDE3では既に大半のライブラリが用意されており、簡単なプログラムであればほぼそのままで利用できますが、OpenRTM-aistを使用する場合はomniORBやlibuuidなどOpenRTMが利用しているライブラリをインストール剃る必要があります。

OpenRTMを利用するために必要なライブラリをインストールするには、一括インストールスクリプトpkg_install_atde3.shを利用すると便利です。

以下、pkg_install_atde3.sh が行なっていることを簡単に説明します。

ARM用debパッケージ

ARM用のライブラリは以下のサイトに様々なアーキテクチャ用にまとめて置かれています。

例えば、omniORBは、

以下に置かれています。libomniorb4のパッケージだけでも、これだけあります。

 libomniorb4-1_4.1.2-1+b1_alpha.deb    22-Apr-2008 16:47    1.5M     
 libomniorb4-1_4.1.2-1+b1_amd64.deb    13-Apr-2008 22:47    1.4M     
 libomniorb4-1_4.1.2-1+b1_arm.deb    14-Apr-2008 07:47    1.4M     
 libomniorb4-1_4.1.2-1+b1_armel.deb    14-Apr-2008 21:17    1.2M     
 libomniorb4-1_4.1.2-1+b1_hppa.deb    14-Apr-2008 12:32    1.6M     
 libomniorb4-1_4.1.2-1+b1_i386.deb    14-Apr-2008 16:02    1.4M     
 libomniorb4-1_4.1.2-1+b1_ia64.deb    14-Apr-2008 12:32    1.8M     
 libomniorb4-1_4.1.2-1+b1_mipsel.deb    14-Apr-2008 15:47    1.2M     
 libomniorb4-1_4.1.2-1+b1_powerpc.deb    14-Apr-2008 15:47    1.5M     
 libomniorb4-1_4.1.2-1+b1_s390.deb    14-Apr-2008 17:02    1.4M     
 libomniorb4-1_4.1.2-1+b1_sparc.deb    14-Apr-2008 05:47    1.4M     
 libomniorb4-1_4.1.2-1_mips.deb        24-Apr-2008 21:58    1.3M

aplha, hppa, mipsdel などおそらく聞きなれないアーキテクチャのパッケージもあれば、i386, amd64, powerpc などのおなじみのアーキテクチャのものもあります。 ARM用のパッケージには、armとarmelの2種類がありますが、Armadillo-400シリーズでは通常 armel アーキテクチャのパッケージを利用します。

ARMには現在2種類のABI (Application Binary Interface) があり、それぞれ OABI (Old ABI), EABI (Embedded ABI) と呼ばれます。 arm パッケージはOABI用にコンパイルされたものであることを意味し、armel パッケージはEABI用にコンパイルされたものであることを意味します。 なお armel は ARM little-endian (eとlが逆のような気もしますが) の略で、実際バイエンディアンCPUであるARM用に armeb (ARM big-endian) という名称もありますが、こちらは使われていないようです。

apt-cross

クロス開発用のライブラリをインストールするためには、apt-getではなくapt-crossコマンドを利用します。 apt-cross は異なるアーキテクチャ用のパッケージを、クロス開発用パッケージとしてインストールしてくれるコマンドです。 apt-get同様 /etc/apt/sources.list にあるリポジトリからパッケージをインストールしてくれます。依存関係も解決してくれますが、ホストの依存関係を壊してしまうこともあるようです。

もし、/etc/apt/sources.list に以下の行がない場合、追加する必要があります。

 deb http://archive.debian.org/debian/ lenny main contrib non-free
 deb-src http://archive.debian.org/debian/ lenny main contrib non-free

apt-cross は以下の様に使用します。

 apt-cross --arch armel --suite lenny --install package_name

    • arch には上で説明したようにarmelアーキテクチャを指定します。--suiteは対象とするdebianのバージョン、ここではlennyを指定します。--installオプションの後にインストールしたいパッケージを指定します。

必要なパッケージ

OpenRTMをコンパイルするために必要なパッケージは以下のとおりです。

  • i386用通常パッケージ
    • python python-dev python-support python-yaml
    • omniidl4 omniorb4-nameserver
  • armel 用 cross パッケージ
    • libuuid1 uuid-dev
    • libomnithread3c2 libomniorb4-1 libcos4-1 omniorb4
    • libomnithread3-dev libomniorb4-dev libcos4-dev
    • omniidl4 omniorb4-nameserver

i386用パッケージはapt-getで、armel 用パッケージはapt-crossでインストールします。

omniORBの再インストール

上記の手順でインストールしたomniORB-4.1.2は、コンパイル時のオプションの関係で、double型のデータをネットワーク経由でやり取りすると、値が化けるというバグがあります。したがって、doubleを利用するコンポーネントを使う場合、omniORBを再コンパイルする必要があります。 omniORB-4.1.6以降ではこのバグの対処がなされているので、再コンパイルする場合は4.1.6以降のバージョンを推奨します。 omniORBのクロスコンパイルの手順をまとめたスクリプトを利用することもできます。(このスクリプトは4.1.6以前、以後を判断して、4.1.6より前のomniORBには自動的にパッチを当てます。)

 $ tar xvjf omnioRB-4.1.6.tar.bz
 $ cd omniORB-4.1.6
 $ ./configure --prefix=/usr/arm-linux-gnueabi CXX=/usr/bin/arm-linux-gnueabi-g++ CC=/usr/bin/arm-linux-gnueabi-gcc CXXFLAGS=-s CFLAGS=-s --build=i386-linux-gnu --host=arm-linux-gnueabi --target=arm-linux-gnu --with-omniorb=/usr/arm-linux-gnueabi --with-includes=-I/usr/arm-linux-gnueabi/include
 $ make clean
 $ make CC=gcc -C src/tool/omniidl/cxx/cccp
 $ make CXX=g++ -C src/tool/omniidl/cxx
 $ make CC=gcc-3.4 -C src/tool/omkdepend
 $ make
 $ sudo make install

途中、CC=gcc, CXX=g++ などと指定しているのは、ホスト(i386)環境上で動かす必要のあるomniidlの関連モジュールをコンパイルしているためです。 (omniORBはビルドの途中で、幾つかのIDLファイルをomniidlでコンパイルしますが、omniidl自体がARM用実行ファイルだと実行できないため。)

また、上記のスクリプトを使った場合、

 $ tar xvjf omnioRB-4.1.6.tar.bz
 $ cd omniORB-4.1.6
 $ wget http://svn.openrtm.org/Embedded/trunk/Armadillo/atde3/tools/omniorb_crossbuild.sh
 $ chmod 755 omniorb_crossbuild.sh
 $ ./omniorb_crossbuild.sh /usr/arm-linux-gnueabi
 $ sudo make install

となり、若干手順が簡単になります。

なお、omniORB-4.1.2のパッケージがインストールされた状態で上書きインストールすることになりますが、気にしないでください(笑

OpenRTM-aistのクロスコンパイル

OpenRTM-aistはビルドシステムにautoconf/automakeを利用しているため、configureのオプションを幾つか指定するだけでクロスコンパイル可能です。

 $ wget http://openrtm.org/pub/OpenRTM-aist/cxx/1.1.0/OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ tar xvjf OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ cd OpenRTm-aist-1.1.0
 $ ./configure --prefix=/usr/arm-linux-gnueabi CXX=/usr/bin/arm-linux-gnueabi-g++ CC=/usr/bin/arm-linux-gnueabi-gcc CXXFLAGS=-s CFLAGS=-s --build=i386-linux-gnu --host=arm-linux-gnueabi --target=arm-linux-gnu --with-omniorb=/usr/arm-linux-gnueabi --with-includes=-I/usr/arm-linux-gnueabi/include
 $ make
 $ make install

以上でOpenRTM-aistがクロス開発環境にインストールされました。

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2160
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク