GUIフレームワーク Qt と、その開発環境 Qt Creator を Raspberry Pi 上で、実機ビルドします。
Qt のバージョンや Raspbian のバージョンなど、微妙な違いによって、少しでも条件が違うと失敗する可能性が高くなりますので、注意してください。
始める前に、下記ページをよく読んで、予習しておいてください。
本稿執筆時点での Qt の最新版は 5.9.1 です。5.9.2 のRCもありますが、ここでは前者を使用します。また、Qt Creator は 4.3.1 を使用します。
Raspberry Pi 2 または Raspberry Pi 3 を用意します。特に後者は安定した電源を用意するよう、注意してください。キーボードやマウスを接続する場合、セルフパワーUSBハブを使用することをお勧めします。失敗の要因をできるだけ下げるため、USBには必要最小限の機器だけ接続してください。
マイクロSDカードは32GB以上のものが必要です。Qtライブラリだけなら16GBで足りますが、Qt Creatorまでビルドするには、16GBを超えてしまいます。既に稼働中のRaspbian環境は使用せず、Qtのビルド専用SDカードを作成してください。
本稿執筆時点の Raspbian の最新は 2017-08-16-raspbian-stretch ですが、パッケージのバージョンの都合で、これは使用しません。ひとつ前のもの(stretchではなくjessieの最終版)を使用します。
http://downloads.raspberrypi.org/raspbian/images/raspbian-2017-07-05/2017-07-05-raspbian-jessie.zip
※ Raspbian/stretch環境でのビルド方法は、本稿執筆時点では不明です。時を改めて新しい記事を書く予定です。
Raspberry Pi のメモリは限られています。 Qt ライブラリをビルドするには数百MBのスワップ領域が必要です。標準では100MBですが、1GBに拡張します。
スワップサービスを停止
$ sudo /etc/init.d/dphys-swapfile stop
スワップファイルの設定を変更
$ sudo nano /etc/dphys-swapfile
/etc/dphys-swapfile を編集(KB単位で設定)
スワップサービスを再開CONF_SWAPSIZE=1024
$ sudo /etc/init.d/dphys-swapfile start
確認
$ free -h
pi@raspberry:~$ sudo apt-get update pi@raspberry:~$ sudo apt-get upgrade pi@raspberry:~$ sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev libicu-dev libsqlite3-dev libxslt1-dev libssl-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad libraspberrypi-dev libpulse-dev libx11-dev libglib2.0-dev libcups2-dev freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev libmysqlclient-dev firebird-dev libpng12-dev libjpeg9-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev libxi-dev libdrm-dev libssl-dev libxcb-xinerama0 libxcb-xinerama0-dev
作業ディレクトリはお好みで構いませんが、以降の説明では /home/pi/q で作業します。違うディレクトリを使用する場合は、適宜読み替えてください。
pi@raspberry:~$ mkdir q pi@raspberry:~$ cd q pi@raspberry:~/q$
ソースをGitリポジトリからクローンし、v5.9.1をチェックアウトします。
pi@raspberry:~/q$ git clone git://code.qt.io/qt/qt5.git pi@raspberry:~/q$ cd qt5 pi@raspberry:~/q/qt5$ git checkout v5.9.1
上記のcloneはすぐに終わりますが、実際のソースの取得は、下記のinit-repositoryで行います。これには通信環境にもよりますが約60分かかります。
pi@raspberry:~/q/qt5$ ./init-repository
Raspberry Pi 用に qtbase/configure を修正します。
pi@raspberry:~/q/qt5$ nano qtbase/configure/home/pi/q/qt5/qtbase/configure
configureファイルの初めの方(#!/bin/shの直後あたり)に、下記の定義を追記します
QT_CFLAGS_DBUS="-I/usr/include/dbus-1.0/ -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/" QT_LIBS_DBUS=-ldbus-1 QT_CFLAGS_GLIB="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/" QT_LIBS_GLIB=-lglib-2.0 QT_CFLAGS_PULSEAUDIO="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/" QT_LIBS_PULSEAUDIO="-lpulse -lpulse-mainloop-glib" QT_CFLAGS_GSTREAMER="-I/usr/include/gstreamer-0.10/ -I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/ -I/usr/include/libxml2/" QT_LIBS_GSTREAMER= QT_CFLAGS_FONTCONFIG=-I/usr/include/freetype2/
configure します。これにはRaspberry Pi 3 で18分くらいかかります。
pi@raspberry:~/q/qt5$ ./configure -nomake tests -nomake examples -v -opengl desktop -opensource -confirm-license -optimized-qmake -reduce-exports -release -qt-pcre -make libs -prefix /opt/Qt5.9.1
pi@raspberry:~/q/qt5$ ./configure -nomake tests -nomake examples -v -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=/usr/bin/ -opensource -confirm-license -optimized-qmake -reduce-exports -release -qt-pcre -make libs -prefix /opt/Qt5.9.1-opengl-es2
make コマンドでビルドします。並列処理数を指定する -j オプションは 2 より大きい値を指定することは控えてください。もし、大きい数字を指定すると、大量のメモリスワップが発生し、かえって遅くなってしまいます。これにはRaspberry Pi 3 で6時間半くらいかかります。
pi@raspberry:~/q/qt5$ make -j2
モジュール qtscript をビルドします。
pi@raspberry:~/q/qt5$ make -j2 module-qtscript
ファイル数が多いので7分くらいかかります。
pi@raspberry:~/q/qt5$ sudo make install
作業ディレクトリに戻ります。
pi@raspberry:~/q/qt5$ cd .. pi@raspberry:~/q$
Qtのインストール先を、環境変数PATHに追加します。
export PATH=/opt/Qt5.9.1/bin:$PATH
qmakeを実行して、バージョンを確認します。
pi@raspberry:~/q$ qmake -v QMake version 3.1 Using Qt version 5.9.1 in /opt/Qt5.9.1/lib
暗号ライブラリのbotanを取得し、release-1_10をチェックアウトします。
pi@raspberry:~/q$ git clone https://github.com/randombit/botan.git pi@raspberry:~/q$ cd botan pi@raspberry:~/q/botan$ git checkout release-1_10
botan_all.cpp と botan_all.h を作成します。
pi@raspberry:~/q/botan$ ./configure.py --gen-amalgamation
これらのファイルを作業ディレクトリにコピーします。 その際 _all は消します。
pi@raspberry:~/q/botan$ cp botan_all.cpp ../botan.cpp pi@raspberry:~/q/botan$ cp botan_all.h ../botan.h pi@raspberry:~/q/botan$ cd ..
botan.cppを修正します。
pi@beatrice:~/q$ nano botan.cpp
includeの行を変更します。
#include "botan_all.h"↓
#include "botan.h"
Qt Creator のソースコードを取得し、v.4.3.1をチェックアウトします。通信環境にもよりますが、5分くらいかかります。Qtの公式サイトには clone の際、 --recursive というオプションを付ける例が掲載されていますが、Qbsプラグインは使用しないので、このオプションは付けません。もし付けると、後のビルドの工程でエラーが出て失敗することがあります。
pi@raspberry:~/q$ git clone https://code.qt.io/qt-creator/qt-creator.git pi@raspberry:~/q$ cd qt-creator pi@raspberry:~/q/qt-creator$ git checkout v4.3.1
前述の工程で作成した botan.cpp / botan.h をコピーします。
pi@raspberry:~/q/qt-creator$ cd src/libs/3rdparty/botan pi@raspberry:~/q/qt-creator/src/libs/3rdparty/botan$ cp ~/q/botan.cpp . pi@raspberry:~/q/qt-creator/src/libs/3rdparty/botan$ cp ~/q/botan.h .
作業ディレクトリに戻ります。
pi@raspberry:~/q/qt-creator/src/libs/3rdparty/botan$ cd ~/q
ビルドディレクトリの作成、プロジェクトファイルの読み込み、メイクファイルの作成を行います。
pi@raspberry:~/q$ mkdir qt-creator-build pi@raspberry:~/q$ cd qt-creator-build pi@raspberry:~/q/qt-creator-build$ qmake ../qt-creator/qtcreator.pro pi@raspberry:~/q/qt-creator-build$ make qmake_all
makeコマンドを実行します。前述の通り -j オプションは 2 より大きくしないことをおすすめします。これにはRasspberry Pi 3 で4時間半くらいかかります。
pi@raspberry:~/q/qt-creator-build$ make -j2
pi@raspberry:~/q/qt-creator-build$ sudo make install INSTALL_ROOT=/opt/QtCreator4.3.1