読者です 読者をやめる 読者になる 読者になる

kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

Qt 5をRaspberry Pi向けにビルドする

Raspberry Pi向けにQtをビルドします。以下は元記事。

結構手順があるのですが、慣れるとそれほど手間はかかりません。DLとビルドの時間は別ですが。

Beginner's Guideは失敗時のフォローやQt Creatorの設定もあるので記事は長くなっていますが、ビルドだけ見れば、手順はそれほどでもありません。また、情報量は多く、エラーが出た場合ググるよりも先にBeginner's Guideを確認したほうがよいです。

手順

手順は次のとおり。

  1. ディレクトリなどの準備
  2. Raspberry PiのイメージのDLとマウント
  3. ロスコンパイラとツールの入手
  4. Qtソースの取得
  5. ビルドとインストール
  6. SDカードへ書き込み

ライブラリのビルドと同時に、Raspberry Piのイメージ(をマウントしたところ)にシステムを構築していきます。

ビルド

ディレクトリなどの準備

ツール類などのインストールが必要なので、ディレクトリを準備します。元記事では~/optになっていますがお好みで。

$ mkdir -p ~/local/opt      #ツール用
$ mkdir -p ~/raspi/Images   #イメージ用
$ mkdir -p ~/raspi/Projects #ビルド用

Raspberry PiのイメージのDLとマウント

本家から落とします。定期的に更新されていますが、最新版をDLすればよいでしょう。DLが完了したら解凍します。

$ cd ~/raspi/Images
$ wget http://downloads.raspberrypi.org/images/raspbian/2013-07-26-wheezy-raspbian/2013-07-26-wheezy-raspbian.zip
$ unzip 2013-07-26-wheezy-raspbian.zip

で、マウント。マウントするディレクトリはあらかじめ作ります。

$ sudo mkdir /mnt/rasp-pi-rootfs
$ sudo mount -o loop,offset=62914560 2013-07-26-wheezy-raspbian.img /mnt/rasp-pi-rootfs

ここで「loop,offset=62914560」ですが、システム側のパーティションをマウントするための細工で、fdiskによって調べることができます。

$ fdisk 2013-07-26-wheezy-raspbian.img 

Command (m for help): p

Disk 2013-07-26-wheezy-raspbian.img: 1939 MB, 1939865600 bytes
255 heads, 63 sectors/track, 235 cylinders, total 3788800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00047c7a

                         Device Boot      Start         End      Blocks   Id  System
2013-07-26-wheezy-raspbian.img1            8192      122879       57344    c  W95 FAT32 (LBA)
2013-07-26-wheezy-raspbian.img2          122880     3788799     1832960   83  Linux

Sector sizeかUnitsあたりの値とStartの値より、512 * 122880 = 62914560です。変わることはなさそうですが、OSイメージは定期的に更新されるので、念のため。

ロスコンパイラとツールの入手

記事どおりDLします。元のほうはファイルが無いようなので、ミラーから落とします。

$ cd ~/local/opt
$ wget http://swap.tsmt.eu/gcc-4.7-linaro-rpi-gnueabihf.tbz
$ tar xf gcc-4.7-linaro-rpi-gnueabihf.tbz

名前からしてlinaro版のクロスコンパイラだと思われるので、このあたりから入れたものでも大丈夫なんじゃなかろうかとは思いますが。

また、これとは別にツール類をDLします。

$ git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git

httpの場合は「http://git.gitorious.org/cross-compile-tools/cross-compile-tools.git」です。

Qtソースの取得

gitでQtのソースを取得して、スクリプトで初期化します。

$ cd ~/raspi/Projects
$ git clone git://gitorious.org/qt/qt5.git #httpはhttp://git.gitorious.org/qt/qt5.git
$ cd qt5
$ ./init-repository

こちらもhttpの場合、微妙にURLが異なるので注意。

元記事ではこの後パッチを当てますが、今のリポジトリではコンフリクトを起こします。同じような修正が適用されているような...けど完全には一致して無いし...といった感じなんですが、当てなくても動作するので無視しときます。

ビルドとインストール

まず、スクリプトを実行して、環境を整えます。

$ cd ~/local/opt/cross-compile-tools
$ sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/ ~/local/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc

そして、qtbaseをビルドします。まずディレクトリに入って、git branchでソースの状態を確認。stableやmasterで無い場合は、checkoutしておきます。

$ cd ~/raspi/Projects/qt5/qtbase
* (no branch)
  stable
$ git checkout stable

で、configure。長いですが、コンパイラのパスに注意して実行し、make。

$ ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/local/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-relocations -reduce-exports -release -make libs -prefix /usr/local/qt5pi
$ make -j2
$ sudo make install

これで以降に必要なqmakeなどがローカルにビルド、インストールされ、Raspberry Piのイメージをマウントしたところに、ビルドしたライブラリがインストールされます。

qtbaseの後は、個別にライブラリをビルドしていきます。記事を参考に順番にビルドしていきます。なんかソースが無いやつがあったりしますが。

  • qtimageformats
  • qtsvg
  • qtjsbackend
  • qtscript
  • qtxmlpatterns
  • qtdeclarative
  • qtsensors
  • qt3d (ソースなし)
  • qtgraphicaleffects
  • qtjsondb (ソースなし)
  • qtlocation (ソースなし)
  • qtdocgallery (ソースなし)
  • qtquickcontrols (Qt QuickのControlsとLayouts)

Qt 5.1から入ったQt QuickのControlsなどはqtquickcontrolsのビルドが必要なため追加でビルドします。

ビルドの手順はqmakeからのmakeですが、qtbase同様にgit branchでソースの状態を確認してからビルドを行います。

$ cd qtimageformats
$ git checkout stable # stableで無い場合
$ /usr/local/qt5pi/bin/qmake .
$ make -j2
$ sudo make install

SDカードへ書き込み

ビルドが完了したらイメージをSDカードに書き込みます。

$ sudo umount /dev/sdX* # sdXはdfかdmesgで調べて、適宜書き換え 
$ cd ~/raspi/Images
$ sync;sudo umount /mnt/rasp-pi-rootfs
$ sudo dd bs=1M if=2013-07-26-wheezy-raspbian.img of=/dev/sdX; sync # sdXは適宜書き換え

完了後、

SDカードの準備はこれで完了したので、後は通常通り起動します。初期の2GBだと開発時の容量が足りなくなっていくので容量は拡張したほうがよいです。

いったんRaspberry Piで起動してパーティションの容量を拡張し、PC側でddを使ってイメージを保存。そのイメージをrasp-pi-rootfsにマウントして使うようにするとよいです。