Qt5をRaspberry Pi用にビルドする

Linuxが動くちっさいCPUボード「Raspberry Pi」向けにビルドします。
販売代理店のサイトはこちら。(日本語)

実機で動かすイメージは公開されててダウンロードページから入手可能です。
2GbyteのSDカードに焼けるサイズになっています。
Raspberry Pi Downloads

今回使用したイメージは「Raspbian “wheezy”」を使用しました。
ビルドにも使用します。


/// 解説ページ ///
Qt5 on RPiのビルドに関する解説ページです。
Beginner’s guide to cross-compile Qt5 on RaspberryPi
Simplified guide for getting Qt 5 built and installed on the raspberry pi

この2ヶ所の内容と@task_jpさんと@kimitakeさんのアドバイスでこのページはできてます。
ありがとうございます。


/// 環境(参考) ///
・Ubuntu 12.04 (32bit)
・Virtual Boxにインストール
・割り当てコア数2
・割り当てメモリ2G

かならずOSは32bit版にしてください。
クロスコンパイラが32bitでしか動きません。


/// ビルドの準備 ///
1.gitとg++
必須です。
$sudo apt-get install git g++

2.作業ディレクトリ
$mkdir ~/opt
$cd ~/opt

3.書き込みイメージのDLとマウント
$wget http://files.velocix.com/c1410/images/raspbian/2012-08-16-wheezy-raspbian/2012-08-16-wheezy-raspbian.zip
$unzip 2012-08-16-wheezy-raspbian.zip
$sudo mkdir /mnt/rasp-pi-rootfs
$sudo mount -o loop,offset=62914560 2012-08-16-wheezy-raspbian.img /mnt/rasp-pi-rootfs

4.ツールチェイン
$wget http://blueocean.qmh-project.org/gcc-4.7-linaro-rpi-gnueabihf.tbz
$tar -xf gcc-4.7-linaro-rpi-gnueabihf.tbz

5.クロスコンパイラの設定とか
$git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git

6.Qt5のリポジトリ
$git clone git://gitorious.org/qt/qt5.git
$cd qt5
$./init-repository

7.jsbackgroundのリポジトリ
パッチをあてます。
$cd qtjsbackend/
$git fetch https://codereview.qt-project.org/p/qt/qtjsbackend refs/changes/56/27256/4 && git cherry-pick FETCH_HEAD

8.パスの設定
$cd ~/opt/cross-compile-tools/
$./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc

もしOSが64bitだとここでそんなファイルやフォルダはないと怒られます。
無視するとconfigureでエラーになります。


/// ビルド ///
1.作業ディレクトリへ
$cd ~/opt/qt5

2.エラーがでるモジュールはないことにする
$mv qtwebkit/WebKit.pro qtwebkit/WebKit.pro.bk
$mv qttranslations/qttranslations.pro qttranslations/qttranslations.pro.bk
クリーンするとどうせ消されるけど一応とっておきます。
ぶっちゃけズルですが面倒なのでこの手段でビルド対象から外します。
とりあえずWebkitとローカライズ設定はいらないよね!

3.configure
解説ページはモジュール単位で必要な分だけビルドするような説明になっているけど一気に行きます。
$./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=/home/iori/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -release -make libs -prefix /opt/qt5 -reduce-relocations -reduce-exports -make tools -no-pch -device-option DEVICE=wheezy

-no-pchを忘れるとmakeでエラーでます。


4.ビルド
$make -j 2

うちの環境での参考時間
real 215m7.613s
user 203m31.899s
sys 6m22.024s

モジュールを個別にビルドしたい時は、それぞれのディレクトリでmakeすればOKです。


/// インストール ///
$sudo make install

/mnt/rasp-pi-rootfs/opt/qt5にコピーされます。
sudoつけるのを忘れずに。


/// RPiの準備 ///
ビルド待ってる間に準備しておきます。
上の手順でDLしたイメージファイルをSDカードへ書き込みます。
僕は、「DDforWindows」を使ってます。Windowsメインの方は参考にどうぞ。


/// RPiへのファイル転送設定 ///
RPiを起動したらアップデートとrsyncをインストールします。
$sudo apt-get update
$sudo apt-get install rsync
$sudo passwd
#パスワード変更はいらないかも
$sudo reboot

IPアドレス確認
$/sbin/ifconfig

ビルドPCでつながるか確認しておきましょう
$ssh pi@
パスワードのデフォルトは「raspberry」です。


/// データの転送 ///
$rsync -av /mnt/rasp-pi-rootfs/opt/qt5/ root@:/opt/qt5/


/// テスト ///
ダウンロードしてくるとかいろいろありますが。後述のHello WorldなサンプルQMLをRPiに保存します。
$export LD_LIBRARY_PATH=/opt/qt5/lib/
$/opt/qt5/bin/qmlscene -I /opt/qt5/imports/ ~/hello.qml

全画面使って中心に「Hello World」と表示されればおめでとうございます。

サンプル(hello.qml)
import QtQuick 2.0

Rectangle {
   width: 360
   height: 360
   Text {
     anchors.centerIn: parent
     text: "Hello World"
   }
   MouseArea {
     anchors.fill: parent
     onClicked: {
       Qt.quit();
     }
   }
}

アプリのクロスビルドについては・・・
解説ページにちゃんと書いてあるけどQt Creatorにqmake設定するとmkspecのリンクが壊れてると怒られたのでまた今度。