[Rapsberry Pi] Qt 5.12.3 導入 & farmanをビルドしてみた

はじめに

現在開発中の2画面ファイラ farman を Raspberry Pi 3 Model B+ で動かすため、Qt の開発環境を構築することにした。

Qt は Raspberry Pi をサポートしているものの、apt-get で入手できるバージョンは 5.7.1 とちょっと古い。
farman は 5.10 で追加されたAPIを一部使用しているため、ビルドができない。
apt-get_qt_ver.png

ということで、これを書いている時点で最新の 5.12.3 を自分でビルドし、インストールすることにした。

ビルドの方法としては、Raspberry Pi 自身でソースコードをビルドするセルフコンパイルか、Mac なり Windows なりでクロスコンパイルするか、の2種類になるが、3 B+ ならそこそこ性能高いし、クロスコンパイルもかなり時間がかかるため、その間別作業したくても支障をきたすため、今回は Raspberry Pi 自身でセルフコンパイルすることにした。

セルフコンパイルの方法をググったところ、そのものズバリでまとめられていたページを発見した。
基本的にはここの手順通りで進められるが、ちょいトラブルもあったので、備忘録がてら自分の手順を残しておく。

使用環境

  • Raspberry Pi 3 Model B+
  • Raspbian OS ver.9.8
  • Apacer 16GB microSDカード(OS プリインストール済)
Raspberry Pi 本体と microSD は先日 KSY から購入した「Pi3 B+ スターターキット V3 16GB」のもの。
この時点での microSD の空き容量は約9GB。
before_setup_qt_df.png

ダウンロード

/home/pi に Qt のソースコードをダウンロードして展開する。
$ wget http://download.qt.io/official_releases/qt/5.12/5.12.3/single/qt-everywhere-src-5.12.3.tar.xz

$ md5sum qt-everywhere-src-5.12.3.tar.xz
38017e0ed88b9baba063bd723d9ca8b2 qt-everywhere-src-5.12.3.tar.xz

$ tar xf qt-everywhere-src-5.12.3.tar.xz

tar.xz の展開が成功したら、github から configuration 環境を clone し、make を実行。
$ git clone https://github.com/oniongarlic/qt-raspberrypi-configuration.git

$ cd qt-raspberrypi-configuration
$ make install DESTDIR=../qt-everywhere-src-5.12.3

Qt のビルドに必要なライブラリを apt-get で取得。
参考ページの Optional features に記載されていたのはひとまず不要なので追加しなかった。
$ sudo apt-get update
$ sudo apt-get install build-essential libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev libraspberrypi-dev

ビルド

/home/pi にビルド用のディレクトリを作成し、そこに移動。
$ cd ~
$ mkdir build
$ cd build

Configuration 用のスクリプト build-mkspecs-linux-rpi-g++.sh を作成。
3行目を -platform linux-rpi3-g++ に書き換え、RasPi3 に最適化されるようにした。
ただしこの場合、QtScript が使えなくなってしまうので、13行目で -skip qtscript を追加し、ビルド対象から外す必要がある。
(後述するが、自分はうっかり追加し忘れ、ビルドエラーになった)

ちなみに先程 clone した qt-raspberrypi-configuration の build ディレクトリに、Configuration 用のスクリプト build-mkspecs-linux-rpi-g++.sh が置かれているので、それをコピペし、必要箇所を修正して使ってもよさそう。

修正完了したら、スクリプトを実行する。
$ build-mkspecs-linux-rpi-g++.sh

特にエラーが発生しなかったら、いよいよ make。
$ make -j2

参考サイトだと、-j4 オプション付けると4本並列でビルドされて2〜3時間で終了するとのことであるが、自分の環境で試したところ2回中2回ともコンパイラが途中でクラッシュしてしまった。
サイトの注意書きにもあるが、メモリが足りなくなってしまうようだ。
結局、make clean した後、-j2 で2本並列でビルドすることにした。

これで一晩放置して翌朝見てみると、なぜかよくわからんところでビルドエラー。
make_j2_builderror.png

Makefile 読んだりしたものの、原因分からず、ひとまず試しに -j2 オプション付けずに make を実行。
make_qtscript_builderror.png
今度は QtScript でビルドエラー。
しかも "Not supported ARM architecture" ってどーいうこと!?
…って、参考サイトに思いっきり QtScript はビルドできないって書いてあるorz
完全に見落としてた〜。
で、build-mkspecs-linux-rpi-g++.sh に -skip qtscript を追加してスクリプトを実行し、Makefile を作り直して、再度 make してビルドを続行(make clean はしていない)。

そしてまた数時間待ったところ…
qt_make_succeeded.png
お、ビルド成功したっぽい!

インストール

ってことで、インストール。
$ make install

qt_make_install_failed.png
あれ、エラーになった。
/opt にファイル書き込みする権限がないのが原因っぽい。
ってことで sudo で再度インストール。
$ sudo make install

qt_make_install_succeeded.png
インストール成功!ヽ(´ー`)ノ
qmake のバージョンも 5.12.3 になってる。

この時点での microSD の空き容量を見ると、残り約4.5GB。
作業開始時の空き容量が約9GBだったので、Qt で4.5GBほど使用していることになる。
remain_after_qt_build.png
もしこのエントリを見て同様の手順で Qt をビルドしようとしている人は、空き容量十分な microSD カードを用意するか、あるいは参考サイトでも記載されているように、別途USBメモリを用意するなどした方がよいだろう。

最後に、qmake が置かれている /opt/Qt5.12/bin にパスを通すが、今後のことを考え、まず /opt/Qt5.12 へのシンボリックリンク /opt/Qt を作成し、/opt/Qt/bin にパスを通すことにした。
$ sudo ln -s /opt/Qt5.12 /opt/Qt

qt_symbolic_link.png

vi で /home/pi/.bash_profile を開き、以下を記述 。
自分の環境では、この時点では .bash_profile は存在していなかったので、新規作成した。
export PATH=/opt/Qt/bin:$PATH
.bash_profile を保存したら、source コマンドを実行。
パスが通っているか確認のため、続けて qmake を実行。
$ source .bash_profile
$ qmake --version

qt_path_qmake_succeeded.png
問題なくパスが通った。

なお、.bash_profile で $PATH を /opt/Qt/bin より先に記述して qmake を実行したところ、/usr/lib/arm-linux-gnueabinf/qt/bin にある qmake を呼び出そうとするものの、そこには qmake は存在しないのでエラーになった。
qt_path_qmake_failed.png
なぜそんなところの qmake を呼び出そうとしているのか、そもそも /usr/lib/arm-linux-gnueabinf/qt4 というディレクトリがなぜ存在しているのかはよくわからない。

farman をビルド

いよいよ farman のビルド。
まずは github からプロジェクトを clone。
$ git clone https://github.com/haraki/farman.git
問題なければ、カレントディレクトリを farman に移し、qmake → make を続けて実行。
$ cd farman
$ qmake
$ make

qt_farman_build_succeeded.png
お、ビルド通った!
ってことで起動!
$ ./farman

DSC_2208.JPG
動いたーーーーー!!!!!

…けど、何かおかしい。
ウィンドウの枠が表示されておらず、フルスクリーン状態。
右上にあるはずのウィンドウの拡大・縮小や最小化、終了のアイコンが無い。
おまけに Alt + Tab も効かず、他のアプリへの切り替えもできない。
一応、farman 自体は操作できるし、Esc キーで終了させることはできたが、なぜかターミナルごと終了した。
さらに PrintScreen によるスクショも撮れない(なので↑だけスマホで撮った)。
そして Image Viewer で画像を表示したら、その後 Enter キーで戻れるはずが戻れなくなってしまい、他の操作も一切できなくなったため、止む無く電源を入れ直すハメに。

うーん、残念ながらこれでは使い物にならない…orz

Qtおもろい!

一応、Qt で開発したアプリを Raspberry Pi でも動かせることは確認できた。
farman はひとまず置いておくとしても、今後 Raspberry Pi をターゲットとした GUI アプリを開発する際には、Qt を使用することを検討してもよいかも知れない。
ほぼ同一のソースコードで、Mac でも Windows でも Raspberry Pi でも動くアプリが作れるわけだし。
さらに UI さえ何とかすれば、iOS や Android でも同じアプリが動かせるのだ。
しかも C++ ではなく Python でもコード書けるし。

Qt だんだん面白くなってきた!
今後もゲーム開発と平行して、Qt はガッツリやっていきたい。

この記事へのコメント