見出し画像

Qt開発環境をソースコードからビルド(ラズパイ5)

ユーザーインタフェースを含むアプリケーション開発環境の一つにQtがあります。ラズパイでもパッケージに含まれているので、パッケージでインストールことができます。

ですが、異なるバージョンのQtを使いたい場合も多々あったりするので、ここではソースコードから開発環境を構築(コンパイル&インストール)する手順を説明します。

Cross-Compile Qt 6 for Raspberry Piにもあるように、これまでは、ラズパイのQt開発環境の構築には、ラズパイとは別のPCを準備してそのPC上のクロス開発環境でコンパイルしたものをラズパイに転送するのが一般的でした。

ラズパイ5はそれなりのPCと同程度のデスクトップマシンとしての性能を持っていますので、別のPCを使ったクロス開発ではなく、ラズパイを直接使ったセルフ開発によってソースコードからQt開発環境を構築してみます。

Qtの現在のバージョンはQt6ですが、Qt5もまだ使われているので、Qt6とQt5、それとQtの統合開発環境(IDE)のQt Creatorを、ソースコードから構築します。


準備

はじめにQtをコンパイルするために必要なパッケージをインストールしておきます。必要となるパッケージはCross-Compile Qt 6 for Raspberry Piを参考にしました。

$ sudo apt install libboost-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev libasound2-dev libpulse-dev gstreamer1.0-omx-generic libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev  gstreamer1.0-alsa libvpx-dev libsrtp2-dev libsnappy-dev libnss3-dev "^libxcb.*" flex bison libxslt-dev ruby gperf libbz2-dev libcups2-dev libatkmm-1.6-dev libxi6 libxcomposite1 libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libx11-dev freetds-dev libsqlite3-dev libpq-dev libiodbc2-dev firebird-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 libxcb-xinerama0 libxcb-xinerama0-dev libatspi2.0-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev libxkbcommon-x11-dev
$ sudo apt install make cmake build-essential libclang-dev clang llvm ninja-build gcc git bison python3 gperf pkg-config libxfixes-dev libxcb-xkb-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

Qt6のqdocのコンパイルにはclangのバージョン15以上が必要なようなので下記もインストールしておきます。Qtのドキュメント(ヘルプ文章)が必要ない場合はqdocが無くても良いので、下記は入れなくても大丈夫です。

$ sudo apt install clang-15 clang-tools-15 libclang-15-dev libclang-common-15-dev libclang-cpp15-dev liblldb-15-dev libopencl-clang-15-dev

準備2(QtWebEngineをインストールしたい場合のみ)

Qt WebEngineをインストールしたい場合は、内部で使っているchromiumのコンパイルにPython2が必要なことや、8GBではメモリが足りないのでスワップの準備が必要です。 

また、以下のパッケージを追加でインストールしました。もしかすると、必要ないパッケージも含まれているかもしれません。

$ sudo apt install libxshmfence-dev libxkbfile-dev libhunspell-dev libsensors-dev gyp nodejs

Python2のインストールですが、最新のラズパイOS(Debian bookworm)ではPython2は完全に削除されてしまっているようで、パッケージからはインストールできないようです。なので、ソースコードをダウンロードしてインストールしました。

$ wget http://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
$ tar xvfz Python-2.7.18.tgz
$ cd Python-2.7.28
$ mkdir build
$ cd build
$ ../configure --enable-unicode=ucs4 --enable-optimizations
$ make -j4
$ sudo make install

デフォルトでは/usr/localディレクトリ内にインストールされるので、他の場所にインストールしたい場合は、configure時に"--prefix インストール先"を付けてください。

次にスワップの設定です。

QtWebEngineのコンパイルには多くのメモリが必要なようです。8GBのラズパイ5を使っていますが足りないので、スワップを準備しておく必要があります。

スワップファイルの設定は、dphys-swapfileで設定する方法と、手動でスワップファイルを準備して設定する方法があります。どちらでも良いですし、両者を併用しても良いです。

dphys-swapfileで設定する場合は、/etc/dphys-swapfileのCONF_SWAPSIZEとCONF_MAXSWAPにスワップ領域の量(MB単位)を設定します。CONF_MAXSWAPは設定できる最大値の設定なので、設定したい値(CONF_SWAPSIZE)より大きければOKです。例えば、32GBのスワップを設定したいのであれば、32,768とすれば良いでしょう。

/etc/dphys-swapfileを設定したらラズパイを再起動するか、systemctlでdphys-swapfileをrestartしてください。

$ sudo vi /etc/dphys-swapfile
 CONF_SWAPSIZE, CONF_MAXSWAPを設定

$ sudo systemctl restart dphys-swapfile

次に、手動でスワップファイルを準備してスワップを設定する場合です。この場合は、必要な容量のファイルを準備して、mkswap, swaponを実行します。

例えば、32GBのスワップファイルの場合は下記のような感じになります。ここでは、スワップファイルのファイル名を/swapfileとしていますが、好きな名前にしてください。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=32000
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

スワップはファイルでなく、パーティションまるごとや、ディスクまるごとでもかまいません。その場合はddでファイルを作成する必要ありません。

例えば、ラズパイ5に差し込んだUSBメモリをまるごとスワップにしたり、パーティションをまるごとスワップにしたいのであれば、ファイル名の代わりにディスク名やパーティション名を指定すればOKです。

例えば、USBメモリが/dev/sdaとして認識されていて、そのディスクをまるごとスワップにしたいのであれば、下記のような感じになります。

$ sudo mkswap /dev/sda
$ sudo swapon /dev/sda

パーティションの場合は、fdiskなどでパーティション領域を確保した上で、そのパーティション名(/dev/sda1など)を指定すればOKです。

Qt5のインストール

Qtのダウンロードサイトからqt-everywhere-src-5.15.13.tar.xzをダウンロードします。ここではバージョン5.15.13を対象としましたが、異なるバージョンにしたい場合は、そのバージョンのソースコードをサイトからダウンロードしてください。

次に、下記の手順で、ソースコードの展開(tar)、設定(configure)、構築(make)、インストール(make install)します。

$ tar xvfJ qt-everywhere-src-5.15.13.tar.xz
$ cd qt-everywhere-src-5.15.13
$ mkdir build
$ cd build
$ ../configure -release -opengl desktop -nomake tests -xcb -xcb-xlib -skip qtwebengine -no-compile-examples -opensource -confirm-license 
$ make -j4
$ sudo make install

サンプルコード(examples)のソースコードをインストールしない場合は、configureで"-nomake examples"を追加すると、インストール先にexamplesがインストールされなくなります。
examplesがインストールされていると、QtCreatorの「ようこそ」にインストールされたサンプルが表示されるようになります。

ヘルプをインストールする場合は、さらに以下を実行します。これをインストールすると、QtCreatorのヘルプが表示されるようになります。

$ make -j4 docs
$ sudo make install_docs

以上で、/usr/local/Qt-5.15.13にインストールされます。
インストール先を変更したい場合は、configureで、"-prefix インストール先のパス名"を追加すれば、指定したパスにインストールされます。

Qt WebEngineをインストールする場合は、configure時の"-skip qtwebengine"を削除してください。また、ラズパイ5の8GBメモリでは足りないので、スワップを設定してください。私は32GBのスワップを追加しました。
Qt WebEngineのコンパイルにはとても時間がかかります(1週間弱)。途中でエラーで終了したり、ハングアップしたりすることもあると思います。その場合は、再度makeを実行すれば、続きからコンパイルが再開されると思います。

QtWebEngineをコンパイルする場合は、htopなどを実行しておいて、メモリやスワップの使用状況などを表示させて、スワップが足りているかや、ハングアップしていないかなどを監視しながら行うと良いと思います。また、ラズパイの時計がきちんと現在時刻になっているかなどもハングアップの判定に使えます。ハングアップしてしまっているようなら、電源を切って再起動してください。

Qt6のインストール

Qtのダウンロードサイトからqt-everywhere-src-6.7.0.tar.xzをダウンロードします。ここではバージョン6.7.0を対象としましたが、異なるバージョンにしたい場合は、そのバージョンのソースコードをサイトからダウンロードしてください。

次に、下記の手順で、ソースコードの展開(tar)、設定(configure)、構築(cmake)、インストール(cmake --install)します。

$ tar xvfJ qt-everywhere-src-6.7.0.tar.xz
$ cd qt-everywhere-src-6.7.0
$ mkdir build
$ cd build
$ ../configure -release -opengl desktop -nomake tests -xcb -xcb-xlib -make examples -install-examples-sources -skip qtwebengine
$ cmake --build . --parallel 4
$ sudo cmake --install .

サンプルコード(examples)のソースコードをインストールしない場合は、configureで"-make examples -install-examples-sources"を削除ます(もし、インストールされてしまう場合は"-nomake examples"を付けてみてください)。

※Qt5ではデフォルトでexamplesがインストールされますが、Qt6ではデフォルトでexamplesがインストールされないように変わったようで、Qt6でexamplesがインストールされなくてずいぶん設定に迷ってしまいました。

また、Qt WebEngineのインストールはスキップする設定にしています。現時点では私はQt6のQt WebEngineのコンパイルには成功していません。

Qt WebEngineのコンパイルにチャレンジしたい場合は、とりあえず--skip qtwebengineでQt WebEngine以外をインストールを完了させてから、Qt WebEngineweのみのコンパイルを行うと良いかと思います。
Qt6をインストールすると、qt-configure-moduleというのもインストールされるので、それを使うとモジュールのみのconfigureが行えます。例えば、webengineのディレクトリのモジュールをコンフィグしたい場合は以下のような感じです。

$ mkdir build_web
$ cd build_web 
$ qt-configure-module ../qtwebengine
$ cmake --build .

スワップのサイズを大きくした(120MBまでは試した)り、下記のようにJumbo Buildをoffにしたりもしてみましたが、コンパイルの途中でエラーになってしまっています。

$ qt-configure-module ../qtwebengine -DQT_FEATURE_webengine_jumbo_build=OFF -DINPUT_webengine_jumbo_file_merge_limit=0

さて、Qt WebEngineについてはここまでとして、話を戻すと、
ヘルプをインストールする場合は、さらに以下を実行してください。これをインストールすると、QtCreatorのヘルプが表示されるようになります。

$ ninja docs
$ sudo ninja install_docs

以上で、/usr/local/Qt-6.7.0にインストールされます。インストール先を変更したい場合は、configureで、"-prefix インストール先のパス名"を追加すれば、指定したパスにインストールされます。

環境変数の設定

インストールしたQtを有効にするために、PATHとLD_LIBRARY_PATHの2つの環境変数を設定します。

ログインシェルがBashの場合だと、ホームディレクトリの.bashrcに下記を追加すれば良いと思います。

export LD_LIBRARY_PATH=/usr/local/Qt-6.7.0/lib:/usr/local/Qt-5.15.13/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/Qt-6.7.0/bin:/usr/local/Qt-5.15.13/bin:$PATH

Qt Creatorのインストール

Qtのダウンロードサイトからqt-creator-opensource-src-13.0.0.tar.gzをダウンロードします。ここではバージョン13.0.0を対象としましたが、異なるバージョンにしたい場合は、そのバージョンのソースコードをサイトからダウンロードしてください。

次に、下記の手順で、ソースコードの展開(tar)、設定(cmake)、構築(make)、インストール(make install)します。

$ tar xvfz qt-creator-opensource-src-13.0.0.tar.gz
$ cd qt-creator-opensource-src-13.0.0
$ mkdir build
$ cd build
$ cmake ..
$ make -j 4
$ sudo make install

Fcitxプラグイン(日本語入力)

以上でQtの開発環境のインストールは完了なのですが、このままだと、Qt Creatorも、構築したQtアプリケーションも日本語の入力が受け付けられないようです。

そのためのFcitx用のプラグインモジュールをインストールします。

まずラズパイに下記のパッケージをインストールします。

$ sudo apt install extra-cmake-modules fcitx-libs-dev

次に、GitHubからfcitx-qt5のソースコードをダウンロード(clone)して、ビルドします。cmakeで"-DENABLE_QT6=ON"を付けることで、Qt5とQt6の両方ともにインストールされます。

$ git clone https://github.com/fcitx/fcitx-qt5.git
$ cd fcitx-qt5
$ mkdir build
$ cmake .. -DENABLE_QT6=ON
$ make
$ sudo make install

Qt Creatorの設定

Qt Creatorの起動はコンソールでqtcreatorと打てば実行されます。

$ qtcreator
Qt Creatorの起動画面

デフォルトではQt6の開発設定のみになっていると思いますのでQt5の設定をします。
メニューの「編集」-「Preferences」を選択すると設定のウインドウが開くきます。

「キット」のタブを開くと、「デスクトップ(既定)」が設定されていると思うので、「追加」を押して、下記のようにQt5の設定を追加し、「適用」を押します。

Qt5のキットの開発設定

デスクトップ(既定)の設定も、名前を「デスクトップ(Qt6)」などとしておくと、プログラムをビルドしたファイルを置くディレクトリ名にQt6が含まれるようになります(デフォルトのままだとunkownが付きます)。
また、私はコンパイラのC++の設定がClangになっていたので、GCCにしています。

Qt6のキットの設定

以上の設定で、Qt5でもQt6でも、サンプルをコンパイルしたり、自分のアプリケーションを作成したりできると思います。

この記事が気に入ったらサポートをしてみませんか?