インストール - Qt5

提供:MochiuWiki : SUSE, EC, PCB
2023年11月10日 (金) 10:18時点におけるWiki (トーク | 投稿記録)による版 (→‎PinePhoneの設定)
ナビゲーションに移動 検索に移動

概要

Qt 5のインストール手順およびクロスコンパイル手順を記載する。

参考書
q?_encoding=UTF8&ASIN=B07DH9YK9Q&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire0207-22&language=ja_JP
Mastering Qt 5
C++, Qt Widgets, QMLを使用したクロスプラットフォームアプリケーションの作成
q?_encoding=UTF8&ASIN=B07RH6QM95&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire0207-22&language=ja_JP
Hands-On Mobile and Embedded Development with Qt 5
C++/QtでAndroid, iOS, Raspberry Pi用のアプリケーションを作成
q?_encoding=UTF8&ASIN=1789803829&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire0207-22&language=ja_JP
Qt5 C++ GUI Programming Cookbook
Qt5でクロスプラットフォームのアプリケーションの作成



通常のインストール

依存関係のライブラリのインストール

Qtの依存関係のライブラリをインストールする。
これらのライブラリは不要な可能性がある。(調査中)

sudo zypper install Mesa-devel Mesa-KHR-devel
または
sudo zypper install Mesa-KHR-devel Mesa-devel Mesa-dri-devel Mesa-libEGL-devel Mesa-libGL-devel Mesa-libGLESv1_CM-devel Mesa-libGLESv2-devel \
                    Mesa-libglapi-devel kbproto-devel libOSMesa-devel libOSMesa8 libX11-devel libXau-devel libdrm-devel libgbm-devel \
                    libglvnd-devel libxcb-devel libxcb-screensaver0 libxcb-xf86dri0 libxcb-xtest0 libxcb-xvmc0 pthread-stubs-devel xproto-devel


Qtのダウンロード

最新版のQtをダウンロードするため、以下のコマンドを実行する。
ファイル情報を知りたい場合はこのWebサイトを参照する。

wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run

ダウンロードしたファイルのアクセス権限を変更する。

chmod +x qt-unified-linux-x64-online.run


Qtのインストール

/usr/localディレクトリ等にインストールする場合は、スーパーユーザでインストールする。
ホームディレクトリにインストールする場合は、ローカルユーザでインストールする。

次に、GCCおよびmake、付随するライブラリをインストールする。

# CentOS
sudo yum groupinstall "Development tools"

# SUSE
sudo zypper install --type pattern devel_basis


Qtをインストールする。

./qt-unified-linux-x64-online.run


Qtのインストール画面に従って、インストールを実行する。

Qtをインストールした後、必要ならば、以下のコマンドを実行する。
これは、pkg-configコマンドが指すディレクトリを変更する設定である。

cd /<Qtのインストールディレクトリ>/<Qtのバージョン>/gcc_64/lib
cp ./pkgconfig ./pkgconfig_org

cd /<Qtのインストールディレクトリ>/<Qtのバージョン>/gcc_64/lib/pkgconfig
sed -i -e "s/prefix=\/home\/qt\/work\/install/prefix=\/<Qtのインストールディレクトリ>\/<Qtのバージョン>\/gcc_64/g" ./*



ソースコードからインストール

必須環境

  • Qt 5.14.0以降
  • Qt WebEngine module for QtWebEngine based help viewer
  • GCC 7以降
  • オプション : CMake
    CMakeを使用してLLVM / ClangとQt Creatorをビルドする時に必要である。
  • オプション : Ninja
    CMakeを使用してビルドする時に必要である。
  • オプション : LLVM / Clang 8.0.0以降
    Clang Code Model、Clang Tools、ClangFormat、Clang PCH Manager、Clang Refactoringプラグインに必要である。
    LLVM C++ APIは互換性を保証するものではないので、それ以降のバージョンがコンパイルできない場合は、そのバージョンをサポートしていない。
  • オプション : Qbs 1.7.x
    Qtのソースコードには、Qbs自身も含まれている。


また、Qtをビルドする時のオプション設定を以下に記載する。

# オプション : 環境変数PATHにおいて、llvm-configのパスが通っていない場合に必要である
export LLVM_INSTALL_DIR=<LLVMのインストールディレクトリ>

# オプション : Clangのリファクタリングを無効にする場合、1を設定する
export QTC_DISABLE_CLANG_REFACTORING=1

# オプション : QbsProjectManagerプラグインがQbsを使用する場合に必要である
export QBS_INSTALL_DIR=/path/to/qbs

# オプション : KSyntaxHighlightingを使用する場合、KSYNTAXHIGHLIGHTING_LIB_DIRライブラリを保持するディレクトリを設定する
# インクルードディレクトリの自動推定に失敗する場合、KSYNTAXHIGHLIGHTING_INCLUDE_DIRを設定して、
# 両方の設定をqmakeコマンドのオプションで渡すこともできる
export KSYNTAXHIGHLIGHTING_INCLUDE_DIR=<インクルードファイルを保持するディレクトリ>
export KSYNTAXHIGHLIGHTING_LIB_DIR=<ライブラリを保持するディレクトリ>


依存関係のライブラリのインストール

Qtのソースコードをコンパイルするために必要な依存関係のライブラリをインストールする。

sudo zypper install flex bison gperf git-core gcc-c++ make cmake unzip pkg-config python3 ruby perl libicu-devel \
                    glib2-devel dbus-1-devel fontconfig-devel libfontenc-devel libproxy-devel assimp-devel \
                    mozilla-nspr-devel nodejs16 nodejs16-devel re2-devel glproto-devel snappy-devel libSDL2-devel \
                    libinput-devel libhidapi-devel mtdev-devel tslib-devel \
                    Mesa-libGL-devel Mesa-libGLESv1_CM-devel Mesa-libGLESv2-devel Mesa-libGLESv3-devel Mesa-libEGL-devel \
                    wayland-devel wayland-protocols-devel


SUSEにおいて、マルチメディア関連やBluetooth等を使用したソフトウェアを開発する場合、下表に示すパッケージをインストールする。

SUSE向け その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-devel bluez-tools
画像 openjpeg-devel openjpeg2-devel libjpeg62-devel libpng12-devel libpng16-devel
libtiff-devel libmng-devel libwebp-devel libjasper-devel
マルチメディア ffmpeg-4-libavdevice-devel ffmpeg-4-private-devel
gstreamer-devel gstreamermm-devel gstreamer-plugins-base-devel
gstreamer-plugins-bad-devel gstreamer-plugins-rs-devel gstreamer-devtools-devel
gnome-video-effects-devel gstreamer-editing-services-devel
ALSAオーディオ alsa-devel alsa-lib-devel
Pulseオーディオ libpulse-devel pulseaudio-qt-devel
OpenAL openal-soft-devel
GPS libgypsy-devel
Text to Speech festival-devel libspeechd-devel
シリアルポート libserialport-devel
センサ libsensors4-devel
データベース postgresql14-devel postgresql14-server-devel (PostgreSQL)
libmariadb-devel libmariadbd-devel libmariadbprivate (MariaDB)
unixODBC-devel (ODBC)
sqlite3-devel (SQLite)
プリンタ cups-devel
X11 libXft-devel libX11-devel libxcb-devel libXext-devel libXfixes-devel libXrender-devel
libxcb-devel xcb-util-keysyms-devel xcb-util-image-devel xcb-util-wm-devel libXfixes-devel
xcb-util-renderutil-devel libXinerama-devel libXcomposite-devel libXcursor-devel
libXrandr-devel libXtst-devel xcb-proto-devel xcb-util-cursor-devel xcb-util-errors-devel
xcb-util-xrm-devel xorg-x11-libxcb-devel xcb-util-devel xcb-util-image-devel
xcb-util-keysyms-devel xcb-util-wm-devel xorg-x11-devel libxkbcommon-x11-devel
libxkbcommon-devel libXi-devel libxkbfile-devel xorg-x11-util-devel xorg-x11-libs
X Wayland xwayland-devel
WebEngine 必須 :
flex bison gperf glibc-devel-static libcap-devel readline-devel mozilla-nss-devel mozilla-nspr-devel
libgcrypt20 libgcrypt-devel libgudev-1_0-devel ruby npm16 nodejs16-devel nodejs-common
libdrm-devel pciutils-devel xmlsec1-nss-devel systemd-devel libxshmfence-devel
libqt5-qtsvg-devel libqt5-qtsvg-private-headers-devel

オプション1 :
libxml2-devel libxml++-devel libxslt-devel minizip-devel jsoncpp-devel
liblcms2-devel libevent-devel protobuf-devel libprotobuf-c-devel
pipewire-devel krb5-devel

オプション2(不安定なため注意すること) :
libopus-devel libvpx-devel libpoppler-devel libpoppler-glib-devel
アクセシビリティ at-spi2-atk-devel at-spi2-core-devel
SCTP lksctp-tools-devel -sctp


  • 上表のライブラリを全てインストールする場合
    sudo zypper install \
    bluez bluez-devel bluez-tools \
    openjpeg-devel openjpeg2-devel libjpeg62-devel libpng12-devel libpng16-devel libtiff-devel libmng-devel libwebp-devel libjasper-devel \
    ffmpeg-4-libavdevice-devel ffmpeg-4-private-devel \
    gstreamer-devel gstreamermm-devel gstreamer-plugins-base-devel gstreamer-plugins-bad-devel gstreamer-plugins-rs-devel gstreamer-devtools-devel \
    gnome-video-effects-devel gstreamer-editing-services-devel \
    alsa-devel libpulse-devel openal-soft-devel libgypsy-devel \
    festival-devel libspeechd-devel \
    libserialport-devel libsensors4-devel unixODBC-devel sqlite3-devel cups-devel \
    libXft-devel libX11-devel libxcb-devel libXext-devel libXfixes-devel libXrender-devel libxcb-devel xcb-util-keysyms-devel xcb-util-image-devel \
    xcb-util-wm-devel libXfixes-devel xcb-util-renderutil-devel libXinerama-devel libXcomposite-devel libXcursor-devel libXrandr-devel libXtst-devel \
    xcb-proto-devel xcb-util-cursor-devel xcb-util-errors-devel xcb-util-xrm-devel xorg-x11-libxcb-devel xcb-util-devel xcb-util-image-devel \
    xcb-util-keysyms-devel xcb-util-wm-devel xorg-x11-devel libxkbcommon-x11-devel libxkbcommon-devel libXi-devel libxshmfence-devel \
    libxkbfile-devel xorg-x11-util-devel xorg-x11-libs xwayland-devel \
    at-spi2-atk-devel at-spi2-core-devel lksctp-tools-devel \
    flex bison gperf libcap-devel readline-devel mozilla-nss-devel mozilla-nspr-devel libdrm-devel \
    libxml2-devel libxml++-devel libxslt-devel minizip-devel jsoncpp-devel liblcms2-devel libevent-devel protobuf-devel libprotobuf-c-devel pipewire-devel krb5-devel \
    libgcrypt20 libgcrypt-devel libgudev-1_0-devel ruby npm-default pciutils-devel xmlsec1-nss-devel systemd-devel \
    libqt5-qtsvg-devel libqt5-qtsvg-private-headers-devel


fliteライブラリおよびlibspeechdライブラリのインストール

もし、fliteライブラリおよびlibspeechdライブラリがパッケージ管理システムに存在しない場合、
fliteライブラリおよびlibspeechdライブラリのビルドに必要なライブラリをインストールする。

sudo zypper install glib2-devel gcc-c+ automake autoconf pkg-config libtool makeinfo texinfo gettext-runtime gettext-tools \
                    dotconf-devel libsndfile-devel python3-pyxdg festival-devel libpulse-devel espeak-devel


fliteライブラリの公式Webサイト、または、fliteライブラリのGithubにアクセスして、ソースコードをダウンロードする。
または、git cloneコマンドを実行して、fliteライブラリのソースコードをダウンロードする。

git clone https://github.com/festvox/flite.git
cd flite


fliteライブラリをビルドおよびインストールする。

./configure --prefix=<fliteライブラリのインストールディレクトリ> --enable-shared
make -j $(nproc)
make get_voices -j $(nproc)
make install


libspeechdライブラリのGithubにアクセスして、ソースコードをダウンロードする。
または、git cloneコマンドを実行して、libspeechdライブラリのソースコードをダウンロードする。

git clone https://github.com/brailcom/speechd.git
cd speechd


libspeechdライブラリをビルドおよびインストールする。

export PATH="/<fliteライブラリのインストールディレクトリ>/bin:$PATH"
export LD_LIBRARY_PATH="/<fliteライブラリのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"

autoreconf -i

./configure --prefix=<libspeechdライブラリのインストールディレクトリ> --enable-shared --with-flite=<fliteライブラリのインストールディレクトリ>
make -j $(nproc)
sudo make install


ソースコードのダウンロード

Qtのソースコードをダウンロードする。

  • Qt Everywhere (推奨)
    wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz
    tar xf qt-everywhere-opensource-src-x.x.x.tar.gz

  • Githubの使用
    GithubからQtのソースコードを個別にダウンロードする。
    git clone https://github.com/qt/qt5.git

    ダウンロードしたスーパーリポジトリに移動する。
    cd qt5
    git checkout <Qtのバージョン>
    または
    git checkout <Qtのショートバージョン>

    init-repositoryコマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。
    スーパーリポジトリは小さく、全てのモジュール(ライブラリ)はgit submodulesとして保持されている。

    利用可能な全てのモジュールについてはQt5の公式Webサイト、ツールについてはinit-repository --helpコマンドまたはQt5のGithubを参照すること。
    ./init-repository --module-subset=essential,qtsvg,qtvirtualkeyboard,qtquickcontrols
    ./init-repository -f --module-subset=qtquick3d,qtquicktimeline,qtwayland # 必要な場合は個別に追加ダウンロードする


ソースコードのビルド

ビルド用ディレクトリを作成する。

mkdir build && cd build


Qtをビルドおよびインストールする。

  • configureスクリプトを使用する場合
    CC=<GCC 8以降のGCC実行ファイルのパス> CXX=<GCC 8以降のG++実行ファイルのパス> \
    ../configure -release \
    -opensource -confirm-license -v \
    -opengl es2 \ # このオプションは不要の可能性あり
    -no-use-gold-linker -recheck-all \ # このオプションは不要の可能性あり
    -no-compile-examples -make libs \
    -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
    -prefix <Qtのインストールディレクトリ> \
    -no-pch

  • qmakeを使用する場合
    オプションのClang Code Modelプラグインをビルドする場合、LLVMのインストールディレクトリへのパスを指定する必要がある。
    export LLVM_INSTALL_DIR=<LLVMのインストールディレクトリ>

    qmake ../qt-creator/qtcreator.pro
    make qmake_all
    make -j $(nproc)

    もし、Project ERROR: Unknown module(s) in QT: scriptというエラーが出力される場合、以下のコマンドを実行する。
    make -j $(nproc) module-qtscript

  • cmakeを使用する場合
    Qtのソースコードをビルドする。
    cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=<Qtのインストールディレクトリ> <LLVMのインストールディレクトリ> ../qt-creator
    ninja -C ../ build


コンパイルには多くの時間が掛かることに注意する。
(バイナリファイルは、qt-createor-build/binディレクトリに作成される)

Qtのインストール

Qtをインストールする。

make install INSTALL_ROOT=<Qtのインストールディレクトリ>


QtWebEngineのインストール

QtWebEngineを別途インストールする場合は、以下の手順に従う。

  1. もし、必要ならば、Qtの公式WebサイトからQtWebEngineをダウンロードする。
    https://download.qt.io/official_releases/qt/x.x/x.x.x/submodules/qtwebengine-everywhere-src-x.x.x.tar.xz

  2. もし、上記URLからQtWebEngine単体をダウンロードしてビルドする場合は、ローカルヘッダが利用可能であることを確認する。
    find <QtWebEngineのソースコードがあるディレクトリ> -type f -name "*.pr[io]" | xargs sed -i -e 's|INCLUDEPATH += |&$$QTWEBENGINE_ROOT/include |'

  3. QtWebEngineでのジャンボビルドを無効化する。 (標準のジャンボビルドシステムでは、コンパイル時に不明のエラーが出力されるため)
    sed -i -e 's|use_jumbo_build=true|use_jumbo_build=false|' /<QtWebEngineのソースコードがあるディレクトリ>/src/buildtools/config/common.pri

  4. QtWebEngineは、現在のパブリックリリースよりも遅いリリースを目的としているため、Qt 5.15.2向けとしてビルドするように変更する。
    sed -e '/^MODULE_VERSION/s/5.*/5.15.2/' -i /<QtWebEngineのソースコードがあるディレクトリ>/.qmake.conf

  5. PulseAudioライブラリを実行時ではなく、ビルド時にリンクするようにする。
    これは、新しいPulseAudioでの問題を防ぐことにもなる。
    sed -e '/link_pulseaudio/s/false/true/' -i /<QtWebEngineのソースコードがあるディレクトリ>/src/3rdparty/chromium/media/media_options.gni

  6. ビルドシステムの変更点として、make-j 20等を渡す場合、LFSの環境変数NINJAJOBSの使用でビルドが破壊されることを修正する。
    sed -i 's/NINJAJOBS/NINJA_JOBS/' /<QtWebEngineのソースコードがあるディレクトリ>/src/core/gn_run.pro

  7. Qt WebEngineをビルドおよびインストールする。
    mkdir build && cd build

    export PATH="/<Qtのインストールディレクトリ>/bin:$PATH"; \
    export LD_LIBRARY_PATH="/<Qtのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"; \
    export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)" \
    export PKG_CONFIG_PATH="/<Qtのインストールディレクトリ>/lib/pkgconfig:$PKG_CONFIG_PATH"

    qmake .. -- -system-ffmpeg -webengine-icu
    make -j $(nproc)
    make install

  8. インストールされたライブラリ依存ファイル(.prlファイル)から、ビルドディレクトリへの参照を削除する。
    find /<Qtのインストールディレクトリ> -name \*.prl -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;



デスクトップエントリの追加

以下のコマンドを実行して、デスクトップエントリを追加する。

vi ~/.local/share/applications/Qt_Creator.desktop


# Qt_Creator.desktopファイル

[Desktop Entry]
Type=Application
Exec="/home/<ユーザ名>/Qt/Tools/QtCreator/bin/qtcreator" %F
Name=Qt Creator <バージョン名>
GenericName=Qt Creator
Icon=QtProject-qtcreator
StartupWMClass=qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;


vi ~/.local/share/applications/Qt_MaintenanceTool.desktop


# Qt_MaintenanceTool.desktopファイル

[Desktop Entry]
Type=Application
Path=/home/<ユーザ名>/Qt
Name=Qt Maintenance Tool
GenericName=Install or uninstall Qt components.
Exec=/home/<ユーザ名>/Qt/MaintenanceTool
Icon=/home/<ユーザ名>/Qt/QtIcon.png
Terminal=false
Categories=Development;Qt;


vi ~/.local/share/applications/Qt_Designer.desktop


# Qt_Designer.desktopファイル

[Desktop Entry]
Type=Application
Name=Qt Designer <バージョン名>
GenericName=Qt Designer
Comment=
Path=
Exec="/home/<ユーザ名>/Qt/<バージョン名>/gcc_64/bin/designer" %F
Icon=/home/<ユーザ名>/.icons/Qt_Designer.png
StartupNotify=true
StartupWMClass=qtdesigner
Terminal=false
TerminalOptions=
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;
X-DBUS-ServiceName=
X-DBUS-StartupType=
X-KDE-SubstituteUID=false
X-KDE-Username=



日本語入力

専用のインストーラからQtをインストールする場合、Qt Creatorにおいて、日本語が入力できない問題が存在する。

これは、plugins/platforminputcontextsディレクトリにlibfcitxplatforminputcontextplugin.soファイルが欠如しているため、IMEの切り替えができないからである。
そのため、ユーザがlibfcitxplatforminputcontextplugin.soファイルを含むfcitx-qt5ライブラリを、ソースコードからビルドしてインストールする必要がある。

以下に、fcitx-qt5ライブラリをインストールする手順を示す。

  1. まず、Qt Creatorを起動して、[ヘルプ]メインメニューから[About Qt Creator...]を選択、バージョン情報を確認する。
    以下の画像では、Qt Creatorのバージョンは6.0.2、Qt Creatorのビルドに使用されたQt SDKは6.2.2となっている。
    Install Qt 1.png

  2. fcitx-qt5のインストールに必要な依存関係のライブラリをインストールする。
    sudo zypper install extra-cmake-modules libxkbcommon-devel
  3. fcitx-qt5のソースコードをダウンロードする。
    git clone https://github.com/fcitx/fcitx-qt5.git
  4. もし、上記の画像のように、Qt Creatorのビルドに使用されたQt SDKが6の場合、
    Qtメンテナンスツールを起動して、[コンポーネントの追加または削除]から該当するQtのバージョン以降の[Desktop gcc 64-bit]のみをインストールする。

  5. ダウンロードしたfcitx-qt5のディレクトリに移動して、ビルド向けディレクトリを作成する。
    cd fcitx-qt5 && mkdir build && cd build
  6. fcitx-qt5ライブラリをビルドおよびインストールする。
    インストールディレクトリは、自動的に/<Qtのインストールディレクトリ>/<バージョン>/gcc_64/plugins/platforminputcontextsディレクトリにインストールされる。
    # Qt Creatorのビルドに使用されたQt SDKが5の場合
    export PATH="/<Qtのインストールディレクトリ>/<Qt5のバージョン>/gcc_64/bin:$PATH"
    export CPATH="/<Qtのインストールディレクトリ>/<Qt5のバージョン>/gcc_64/include:$CPATH"
    export LD_LIBRARY_PATH="/<Qtのインストールディレクトリ>/<Qt5のバージョン>/gcc_64/lib:$LD_LIBRARY_PATH"
    export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)"
    export PKG_CONFIG_PATH="/<Qtのインストールディレクトリ>/<Qt5のバージョン>/gcc_64/lib/pkgconfig:$PKG_CONFIG_PATH"

    # Qt Creatorのビルドに使用されたQt SDKが6の場合
    export PATH="/<Qtのインストールディレクトリ>/<Qt6のバージョン>/gcc_64/bin:$PATH"
    export CPATH="/<Qtのインストールディレクトリ>/<Qt6のバージョン>/gcc_64/include:$CPATH"
    export LD_LIBRARY_PATH="/<Qtのインストールディレクトリ>/<Qt6のバージョン>/gcc_64/lib:$LD_LIBRARY_PATH"
    export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)"
    export PKG_CONFIG_PATH="/<Qtのインストールディレクトリ>/<Qt6のバージョン>/gcc_64/lib/pkgconfig:$PKG_CONFIG_PATH"

    # ビルドおよびインストール
    ENABLE_LIBRARY=$(pkg-config --exists fcitx icu-uc && echo ON || echo OFF) && \
    cmake .. -DENABLE_LIBRARY=$ENABLE_LIBRARY \
    -DCMAKE_C_COMPILER=<GCC 8以降:Qt Creatorのビルドに使用されたQt SDKが6の場合> -DCMAKE_CXX_COMPILER=<GCC 8以降:Qt Creatorのビルドに使用されたQt SDKが6の場合> \
    -DCMAKE_BUILD_TYPE=Release \
    -DENABLE_QT4=<Qt Creatorのビルドに使用されたQt SDKが4の場合はon、それ以外はoff> \
    -DENABLE_QT5=<Qt Creatorのビルドに使用されたQt SDKが5の場合はon、それ以外はoff> \
    -DENABLE_QT6=<Qt Creatorのビルドに使用されたQt SDKが6の場合はon、それ以外はoff> \
    -DCMAKE_PREFIX_PATH=/<Qtのインストールディレクトリ>/<バージョン>/gcc_64 # Qt Creatorのビルドに使用されたQt SDKのディレクトリ

    make -j $(nproc)
    make install
  7. インストールしたlibfcitxplatforminputcontextplugin.soファイルを、/<Qtのインストールディレクトリ>/Tools/QtCreator/lib/Qt/plugins/platforminputcontextsディレクトリに配置する。
    これにより、Qt Creator等において、FcitxでのIMEの切り替えができるようになる。

    ただし、Qt Creatorをアップデートする場合は、fcitx-qt5を再インストールする必要があるため注意すること。

    cp /<Qtのインストールディレクトリ>/<バージョン>/gcc_64/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so \
    /<Qtのインストールディレクトリ>/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts



Felgoのインストール

Felgoとは

Felgoは、Qtフレームワークをベースに大幅に拡張したクロスプラットフォームのソフトウェア開発ソリューションであり、
PC、Android、iOS、Web(WebAssembly)、組み込みシステム等の多くのプラットフォームでネイティブに動作する。

Felgoは、以下に示すような独自のQt/QMLツール、クラウドサービス、Qtを拡張する200以上のAPIを追加したFelgo SDKを提供している。

  • 高度なコントロールとネイティブなナビゲーション
  • テーマとスタイル
  • レイアウト
  • ファイル操作(ローカル/リモート)
  • データ管理とモデル/ビュー
  • マルチメディア
  • RESTネットワーク(※)
  • ネイティブなダイアログと機能


※RESTとは
Webシステムに適用したソフトウェアの設計様式のことであり、パラメータを指定して特定のURLにHTTPでアクセスする時、
XMLやJSONなどで記述されたメッセージが送られてくるようなシステム、および、そのような呼び出し規約のことである。

本来のRESTの設計原則は主として以下の4つの項目からなる。

  • セッション等の状態管理を行わず、やり取りされる情報はそれ自体で完結して解釈することができる。(WebではHTTP自体にはセッション管理の機構はない)
  • 情報を操作する命令の体系が予め定義・共有されている。(WebではHTTPメソッドに相当)
  • 全ての情報は汎用的な構文で一意に識別される。(URL/URIに相当)
  • 情報の一部として、別の状態や別の情報への参照を含めることができる。(ハイパーメディア的な書式で情報を表現する。HTMLやXMLに相当)


Felgoのインストール

既存のQtにFelgoを拡張機能として追加することができる。

まず、FelgoのQt Marketplaceにアクセスおよびログインした後、[Qt extension]を選択する。
必要な情報を入力して、[Continue to payment]を選択する。

次に、Qtメンテナンスツールを起動して、[コンポーネントの選択]画面の[Marketplace]項目でFelgoを選択およびインストールする。
もし、Felgoをインストールできない場合は、Felgoインストーラを使用して、既存のQtとは別にFelgoをインストールする。

※注意
最新版のQtに対応したFelgoがまだリリースされていない場合は、Felgoはビルドキットに追加されない。

Felgoのアカウントの削除する場合は、Felgoの公式Webサイトにアクセスおよびログインする。
アカウント設定ページ右の[Edit] - アカウント設定ページ下の[Account Termination Request] - [Delete Account]ボタンを押下する。


Raspberry Pi 3B / 4Bのクロスコンパイル

概要

Raspberry Piにおいて、一般的なデスクトップソフトウェアのクロスコンパイルおよび組み込み / デバイス作成のユースケースの
クロスコンパイルを行う手順を記載する。

組み込み / デバイス作成とは、デスクトップソフトウェアをX11の下で実行するためのものではなく、
ソフトウェアがBroadcomドライバを使用して、dispmanx / EGLの上でフルスクリーンで実行するというユースケースのことである。

EGLを使用する場合、Qtソフトウェアはフルスクリーンでのみ動作する。
通常のウインドウで起動する場合は、XCBを使用する必要があるが、XCBはOpenGLやQt Quickは動作しないことに注意すること。

このセクションでは、Raspberry PiにRaspbian Busterをインストールしていることを想定している。

Linux PCの設定

Linux PCにおいて、以下の依存関係のライブラリをインストールする。
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)

sudo zypper install autoconf automake cmake unzip tar git wget pkg-config gperf gcc gcc-c++ \
                    gawk bison openssl flex figlet pigz ncurses-devel ncurses5-devel texinfo


Raspberry Pi専用のGCC ARMツールチェインをダウンロードする。
https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/

表. GCC ARMツールチェーンのダウンロード
Raspberry Piの種類 Raspbian Stretch(32-bit) Raspbian Buster(32-bit)
Raspberry Pi Zero/W/WH
Raspberry Pi 1 Model A / B / A+ / B+
6.3.0
9.3.0
10.2.0
8.3.0
9.3.0
10.2.0
Raspberry Pi 2 Model A / B
Raspberry Pi 3 Model A / B
6.3.0
9.3.0
10.2.0
8.3.0
9.3.0
10.2.0
Raspberry Pi 3 Model A+ / B+
Raspberry Pi 4 Model A+ / B+
Raspberry Pi Compute 3 / 3lite / 3+
6.3.0
8.3.0
10.2.0
8.3.0
9.3.0
10.2.0


また、Linero社が提供しているGCC ARMツールチェーンも使用することができる。
https://releases.linaro.org/components/toolchain/binaries/

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz


上表にあるGCC ARM 8.3.0ツールチェーンが動作しない場合、以下のURLにあるGCC ARM 8.3.0ツールチェーンを試すこともできる。
https://bugfreeblog.page.link/rasplinuxgcc830
GCC ARMツールチェインを解凍して、任意のディレクトリに配置する。
ここでは、~/InstallSoftware/GCC_ARMディレクトリに配置している。

mv cross-gcc-10.2.0-pi_3+.tar.gz GCC_Raspbian_Buster32_10_2_0
cd GCC_Raspbian_Buster32_10_2_0 ~/InstallSoftware/GCC_ARM


GCC ARMツールチェーンは、システム固有のLTO(Link Time Optimization)フラグを使用して構築されているため、
ソフトウェアをコンパイルする時、これらのツールチェーンを使用することで、Raspberry PiのSoC固有の機能を簡単に利用することができる。

Raspberry Pi 4は、Broadcom BCM2711 SoC(Cortex-A72 64bit)を採用しており、Raspberry Pi 3B+と同様、ARMv8-aアーキテクチャを採用している。

表. Raspberry PiとLTO(Link Time Optimization)フラグの関係
Raspberry Piの種類 LTO(Link Time Optimization)フラグ
Raspberry Pi Zero/W/WH
Raspberry Pi 1 Model A / B / A+ / B+
-march=armv6 -mfloat-abi=hard -mfpu=vfp
Raspberry Pi 2 Model A / B
Raspberry Pi 3 Model A / B
-march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4
Raspberry Pi 3 Model A+ / B+ (32Bit)
Raspberry Pi 4 Model A+ / B+ (32Bit)
Raspberry Pi Compute 3 / 3lite / 3+ (32Bit)
-march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8
Raspberry Pi 3 Model A+ / B+ (64Bit)
Raspberry Pi 4 Model A+ / B+ (64Bit)
Raspberry Pi Compute 3 / 3lite / 3+ (64Bit)
-march=armv8-a+fp+simd


Raspberry Piの設定

描画処理に時間が掛かる場合、Raspberry PiのVRAMを128[MB]や256[MB]程度に変更する。

  • VRAMを変更する手順
    sudo raspi-config
    次に、[Performance Options] - [GPU Memory]を選択して、任意の数値を入力する。
    最後に、[Finish]を選択して終了する。


Raspberry Pi 4Bでは、Broadcom EGLはサポートされていないため、Qt 5を使用する場合は、KMSを有効にする必要がある。
また、KMSを有効にするには、libgles2-mesa-devライブラリとlibgbm-devライブラリをインストールする必要がある。

  • GL(FAKE KMS)を有効にする手順
    sudo raspi-config
    次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択することにより、KMSが有効になる。
    最後に、[Finish]を選択して終了する。
    (最小限のビルドを使用する場合、このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする。


次に、/etc/apt/sources.listファイルのdeb-srcから始まる行のコメントを外す。

sudo vi /etc/apt/sources.list


# /etc/apt/sources.listファイル

# 編集前
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

# 編集後
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi


Raspbian Busterのソフトウェアをアップデートする。

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot


Raspberry Piのファームウェアをアップデートする。

sudo rpi-update
sudo reboot


Raspberry Piに、Qtライブラリをインストールする。(ここでは簡単にするために、build-depを使用する)
ここで、build-depコマンドとは、ビルドに必要なパッケージが全てインストールするコマンドである。
ビルド設定によっては、不要なパッケージも含まれている。

# Raspberry Pi 3B
# EGLを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                     libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                     libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# XCBを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                     libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                     libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver \
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合) \
                     libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev \
                     libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev \
                     libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev \
                     libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev \
                     libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev at-spi2-core gir1.2-atspi-2.0 libatspi2.0-dev

# Raspberry Pi 4B
# EGLを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                     libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                     libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev libgbm-dev \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# XCBを使用する場合
sudo apt-get install ccache libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev \
                     libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev libwacom-dev \
                     libfontconfig1-dev libdbus-1-dev libnss3-dev libxkbcommon-dev libjpeg-dev libasound2-dev libudev-dev libgles2-mesa-dev libgbm-dev \
                     libxcb-xinerama0 libxcb-xinerama0-dev gdbserver \
                     python        (QtQuickを使用する場合) \
                     libgtk-3-dev  (QtWidget向けにGTKネイティブテーマを使用する場合) \
                     libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev \
                     libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev \
                     libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev \
                     libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev \
                     libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev
sudo apt-get build-dep libqt5webengine-data (WebEngineを使用する場合)
sudo apt-get build-dep libqt5webkit5        (WebKitを使用する場合)


マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。

その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-tools libbluetooth-dev
画像 libjpeg-dev libpng-dev libtiff-dev
コーデック libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libx265-dev
マルチメディア libgstreamer1.0-0 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base
gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad
libgstreamer-plugins-bad1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-tools
gstreamer1.0-alsa gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5
libwayland-dev(Wayland開発パッケージは、gstreamerヘッダで必要)
ALSAオーディオ libasound2-dev
Pulseオーディオ pulseaudio libpulse-dev
OpenALオーディオ libopenal-data libopenal1 libopenal-dev libsndio7.0 libsndio-dev
データベース unixodbc-dev (ODBC)
libsqlite3-dev (SQLite)
libpq-dev(PostgreSQL)
libmariadbclient-dev(MariaDB / MySQL)
プリンタ libcups2-dev
Wayland libwayland-dev
X11 libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev
libfreetype6-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev
libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev
libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev
libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev
WebEngine 必須 :
flex bison gperf libre2-dev libnss3-dev libdrm-dev

オプション1 :
libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev
protobuf-compiler

オプション2(不安定なため注意すること) :
libopus-dev libvpx-dev
アクセシビリティ libatspi-dev
SCTP libsctp1 libsctp-dev -sctp
Broadcom EGLの代わりに
VC4ドライバを使用する場合

※Raspberry Pi 4では必須
libgles2-mesa-dev libgbm-dev -platform linux-rpi-vc4-g++


ビルドしたQtソフトウェアをRasberry Piにデプロイするためのディレクトリを作成する。
加えて、Qtライブラリを配置するディレクトリも作成する。

mkdir -p ~/InstallSoftware/QtApplication ~/InstallSoftware/Qt_5_x_x_EGL ~/InstallSoftware/Qt_5_x_x_XCB


Raspberry Pi 4Bの場合、以下のシンボリックリンクを作成する。

sudo ln -sf -r /usr/include/arm-linux-gnueabihf/asm /usr/include
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/gnu /usr/include
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/bits /usr/include 
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/sys/* /usr/include/sys
sudo ln -sf -r /usr/include/arm-linux-gnueabihf/openssl/* /usr/include/openssl
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crtn.o /usr/lib/crtn.o && \
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crt1.o /usr/lib/crt1.o && \
sudo ln -sf /usr/lib/arm-linux-gnueabihf/crti.o /usr/lib/crti.o


次のセクションにおいて、rsyncコマンドを使用してLinux PCとRaspberry Piのファイルを同期する。
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。

そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。

echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers


システムルートディレクトリの設定

Linux PCで、Raspberry Pi向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。
Raspberry Pi上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。

Linux PC上に開発用ディレクトリを作成する。
また、Raspberry Piのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。

mkdir -p ~/Program/Qt_Embedded/sysroot ~/Program/Qt_Embedded/sysroot/lib ~/Program/Qt_Embedded/sysroot/opt \
         ~/Program/Qt_Embedded/sysroot/usr ~/Program/Qt_Embedded/sysroot/usr/share 


rsyncコマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。

rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/lib ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/usr/share/pkgconfig ~/Program/Qt_Embedded/sysroot/usr/share
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/opt/vc ~/Program/Qt_Embedded/sysroot/opt


ダウンロードしたファイルおよびディレクトリのシンボリックリンクを相対的に調整する。
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py ~/Program/Qt_Embedded/sysroot


Qtライブラリのダウンロード

Raspberry Pi 3B /4B 共通

まず、Qtライブラリのソースコードをダウンロードする。

以下のコマンドにおいて、<Qtのバージョン>および<Qtのショートバージョン>は、ダウンロードするQtのバージョンに変更する。
例えば、Qt 5.15.2をダウンロードする場合、5.15.2と入力する。Qt 5.15の最新版をダウンロードする場合、5.15と入力する。

  • QtBaseをダウンロードする場合
    cd ~/Program/Qt_Embedded
    git clone git://code.qt.io/qt/qtbase.git -b <Qtのバージョン>
    または
    git clone https://github.com/qt/qtbase -b <Qtのバージョン>

  • Qt Everywhere Opensourceをビルドする場合
    wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz
    tar xf qt-everywhere-opensource-src-x.x.x.tar.gz
    cd qt-everywhere-opensource-src-x.x.x

  • Githubからソースコードをダウンロードする場合
    QtのGithubでは、より多くの新しいアップデートが行われている。
    git clone https://github.com/qt/qt5.git
    cd qt5
    git checkout <Qtのバージョン>またはgit checkout <Qtのショートバージョン>

    init-repositoryコマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。
    super-repoはそれ自体は小さく、他の全てはgit submodulesとして保持されている。
    利用可能な全てのモジュールについてはこちらのWebサイト、ツールについてはinit-repository --helpコマンドまたはこちらのWebサイトを参照すること。
    ./init-repository --module-subset=essential


Raspberry Pi 4B

Raspberry Pi 4Bの場合、以下のように、qmake.confをカスタマイズする必要がある。
qmake.confファイルは、ビルド時の設定を定義するものである。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs
cp -r linux-arm-gnueabi-g++ linux-arm-gnueabihf-g++
sed -i -e 's/arm-linux-gnueabi-/arm-linux-gnueabihf-/g' ./linux-arm-gnueabihf-g++/qmake.conf


Raspberry Pi 3B (XCBを使用する場合)

設定不要だと推測される。

以下のように、qmake.confをカスタマイズする必要がある。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-vc4-g++ linux-rasp-pi3-vc4-brcm-g++
vi linux-rasp-pi3-vc4-brcm-g++/qmake.conf


# linux-rasp-pi3-vc4-brcm-g++/qmake.confファイル

# 編集前
QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL

# 編集後
QMAKE_LIBS_EGL          += -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2   += -lbrcmGLESv2 -lbrcmEGL


Raspberry Pi 3B (EGLを使用する場合)
  • 方法 1

Raspberry Pi 3Bの場合も、以下のように、qmake.confをカスタマイズする必要がある。

cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf


# qmake.confファイル

# qmake configuration for the Raspberry Pi 3 using the Broadcom graphics stack
# MODIFIED to use the library names that are shipped since 2016
#
# Also setting the linker flags according to the pkg-config files that are shipped with the libraries.
# Remove egl.pc and glesv2.pc from /usr/lib/arm-linux-gnueabihf/pkgconfig/ for these to take effect.
# The reason for using static values instead of supplying the correct pkg-config files is that configure ignores -pthread from there
#
# Including headers from /opt/vc first, but also from mesa version of EGL and GLES, since the /opt/vc headers are from 2009 and don't work with qtwebengine.
# This way you can make mesa headers available by manually removing directories EGL, GLES and GLES2 from /opt/vc/include before building.

include(../common/linux_device_pre.conf)

# Let the linker know about /opt/vc/lib. Required for EGL config.test (at least) because brcmGLESv2 also needs brcmEGL.
QMAKE_RPATHLINKDIR_POST   += $$[QT_SYSROOT]/opt/vc/lib
VC_LIBRARY_PATH           =  $$[QT_SYSROOT]/opt/vc/lib
VC_INCLUDE_PATH           =  $$[QT_SYSROOT]/opt/vc/include
MESA_INCLUDE_PATH         =  $$[QT_SYSROOT]/usr/include
QMAKE_LIBDIR_OPENGL_ES2   =  $${VC_LIBRARY_PATH}
QMAKE_LIBDIR_EGL          =  $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG       =  $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_BCM_HOST     =  $$VC_LIBRARY_PATH
QMAKE_INCDIR_EGL          = \
                            $${VC_INCLUDE_PATH} \
                            $${MESA_INCLUDE_PATH} \
                            $${VC_INCLUDE_PATH}/interface/vcos/pthreads \
                            $${VC_INCLUDE_PATH}/interface/vmcs_host/linux
QMAKE_INCDIR_OPENGL_ES2   = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_BCM_HOST     = $$VC_INCLUDE_PATH

# recreating pkg-config --libs glesv2
QMAKE_LIBS_OPENGL_ES2     = -L$${VC_LIBRARY_PATH} -lbrcmGLESv2 -lbcm_host -lvcos -lvchiq_arm -pthread

# recreating pkg-config --libs egl
QMAKE_LIBS_EGL            = -L$${VC_LIBRARY_PATH} -lbrcmEGL -lbrcmGLESv2 -lbcm_host -lvchostif -lbcm_host -lvcos -lvchiq_arm -pthread

#recreating pkg-config --libs bcm_host
QMAKE_LIBS_BCM_HOST       = -L$${VC_LIBRARY_PATH} -lbcm_host -lvcos -lvchiq_arm -pthread
QMAKE_CFLAGS              = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
QMAKE_CXXFLAGS            = $$QMAKE_CFLAGS
DISTRO_OPTS              += hard-float
DISTRO_OPTS              += deb-multi-arch
EGLFS_DEVICE_INTEGRATION  = eglfs_brcm

include(../common/linux_arm_device_post.conf)
load(qt_config)


Raspberry Pi 3Bの場合、上記で作成したqmake.confファイルを使用する必要がある。
これは、Qtをビルドする時、pkg-configを使用して、どのライブラリがどの場所にインストールされているかを判断する。

実際には複数の方法があるが、最良の方法は、上記で作成したqmake.confファイルの静的な定義を使用することである。
そこで、.pcファイルを削除して、configureがMesaのデフォルトを使用せずに、上記の定義を使用する。

cd /<sysrootが存在するディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig
mv egl.pc egl.pc.mesa
mv glesv2.pc glesv2.pc.mesa


  • 方法 2
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi2-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf


# linux-rasp-pi3-ex-g++/qmake.confファイル
# 編集前
QMAKE_LIBS_EGL    = -lEGL -lGLESv2
QMAKE_LIBS_OPENVG = -lEGL -lOpenVG -lGLESv2

# 編集後
QMAKE_LIBS_EGL        = -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2 = -lbrcmEGL -lbrcmGLESv2  # 追記
QMAKE_LIBS_OPENVG     = -lbrcmEGL -lbrcmOpenVG -lbrcmGLESv2


次に、以下のソースコードを編集する。

vi /<Qtのソースコードが存在するディレクトリ>/qtbase/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp


# qxcbeglwindow.cppファイル  96行目あたり
# 編集前
m_surface = eglCreateWindowSurface(m_glIntegration->eglDisplay(), m_config, m_window, 0);

# 編集後
m_surface = eglCreateWindowSurface(m_glIntegration->eglDisplay(), m_config, (void*)m_window, 0);


SysRootディレクトリから、nss.pcファイルがあるディレクトリに対して、パスを追加する。

find <SysRootディレクトリ> -type f -name nss.pc

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)"
export PKG_CONFIG_PATH="<nss.pcファイルが存在するディレクトリ>:$PKG_CONFIG_PATH"


  • 方法 3
cd /<Qtのソースコードが存在するディレクトリ>/qtbase/mkspecs/devices
cp -r linux-rasp-pi3-g++ linux-rasp-pi3-brcm-g++
vi linux-rasp-pi3-brcm-g++/qmake.conf


include(../common/linux_device_pre.conf)

QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib
QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/home/pi/<Qtライブラリをデプロイするディレクトリ>/lib

QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2

QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux

QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}

QMAKE_LIBS_EGL          = -lEGL -lGLESv2
QMAKE_LIBS_OPENVG       = -lEGL -lOpenVG -lGLESv2

QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS

DISTRO_OPTS            += hard-float
DISTRO_OPTS            += deb-multi-arch

# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION= eglfs_brcm

include(../common/linux_arm_device_post.conf)

load(qt_config)


  • 方法 4

この方法は、qt-everywhere-src-5.x.xファイルのみで実行できる。

Githubから、mkspecsを自動編集するツールをダウンロードする。
このツールでは、libbrcm*.soライブラリ名を参照するように設定されている。

git clone https://github.com/oniongarlic/qt-raspberrypi-configuration.git


ツールをQtのソースコードがあるディレクトリにインストールする。

cd ./qt-raspberrypi-configuration
make install DESTDIR=<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-5.x.x


Qtライブラリのビルド

ここでは、Qtソフトウェアは~/Program/Qt_Embedded/QtSoftwareディレクトリ、qmake等のホストツールは~/Program/Qt_Embedded/Hostディレクトリ、
Qtライブラリは~/Program/Qt_Embedded/Target_EGLディレクトリまたは~/Program/Qt_Embedded/Target_XCBディレクトリとしている。

<Raspberry Piのバージョン>は、Raspberry Piの種類に変更する。
ただし、上記のセクションでmkspecを変更した場合は、そのディレクトリ名に合わせること。

  • <Raspberry Piのバージョン>
    • Raspberry Pi 1
      linux-rasp-pi-g++
    • Raspberry Pi 2
      linux-rasp-pi2-g++
    • Reaspberry Pi 3
      • linux-rasp-pi3-g++(EGL)
      • linux-rasp-pi3-vc4-g++(XCB)
      • 上記のセクションで作成したlinux-rasp-pi3-brcm-g++(EGL)
      • その他
    • Raspberry Pi 4
      linux-rasp-pi4-v3d-g++


Raspbian OS 64bitを使用している場合は、-device-optionオプションを以下のように記述する。
-device-option CROSS_COMPILE=/<GCC ARMツールチェインのインストールディレクトリ>/bin/aarch64-linux-gnueabihf-
また、Qt 5.8以降は、-no-use-gold-linkerオプションを追加する必要がある。

  • QtBase / Qt Everywhere Opensource / GithubからダウンロードしたQt
    ビルドディレクトリの作成
    mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build

    GCC ARM 8.3.0以降を使用する場合は、以下の設定をターミナルで実行する。
    CROSS_PI_PATH=/<GCC ARMツールチェインのインストールディレクトリ>
    CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-

    LD_LIBRARY_PATH=$CROSS_PI_PATH/lib:$LD_LIBRARY_PATH
    LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/lib:$LD_LIBRARY_PATH
    LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib:$LD_LIBRARY_PATH
    LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib:$LD_LIBRARY_PATH

    LDFLAGS="-L$CROSS_PI_PATH/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib/"

    Configureスクリプトの実行
    # Raspberry Pi 3B
    PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \
    PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig \
    ../<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-<Qtのバージョン>/configure -release \
    -opengl es2 -eglfs \           EGLを使用する場合
    -opengl es2 \                XCBを使用する場合
    -device <Raspberry Piのバージョン> \
    -device-option CROSS_COMPILE=/<GCC ARMツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf- \
    -opensource -confirm-license -v \
    -nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all -pkg-config \
    -ltcg -iconv \        # 必要な場合は指定する
    -qpa eglfs \               EGLを使用する場合
    -qpa xcb \                XCBを使用する場合
    -skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
    -sysroot /<SysRootがあるディレクトリ>/sysroot \
    -prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
    -extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \
    -hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host
    -no-gcc-sysroot             GCC ARM 8.3.0以降を使用する場合

    # Raspberry Pi 4B
    PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \
    PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig \
    ../<Qtのソースコードがあるディレクトリ>/qt-everywhere-src-<Qtのバージョン>/configure -release \
    -opengl es2 -eglfs \           EGLを使用する場合
    -opengl es2 \               XCBを使用する場合
    -device <Raspberry Piのバージョン> \
    -device-option CROSS_COMPILE=/<GCC ARMツールチェーンのインストールディレクトリ>/bin/arm-linux-gnueabihf- \
    -opensource -confirm-license -v \
    -nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all -pkg-config \
    -ltcg -iconv -fontconfig -ccache \        # 必要な場合は指定する
    -qpa eglfs \               EGLを使用する場合
    -qpa xcb \                XCBを使用する場合
    -skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
    -sysroot /<SysRootがあるディレクトリ>/sysroot \
    -prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
    -extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \
    -hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host
    -no-gcc-sysroot             GCC ARM 8.3.0以降を使用する場合
    -I/<SysRootがあるディレクトリ>/sysroot/usr/include/arm-linux-gnueabihf \ # GCC ARM 8.3.0以降を使用する場合に必要(不要の可能性があるため要調査)
    -L/<SysRootがあるディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf \   # GCC ARM 8.3.0以降を使用する場合に必要(不要の可能性があるため要調査)

    ビルドおよびインストール
    gmake -j $(nproc)
    gmake install

    もし、Linux PCで使用するQtライブラリを配置するディレクトリにrccファイルが存在しない場合は、rccファイルをQtライブラリのbinディレクトリにコピーする。
    (Qtライブラリを使用するソフトウェアをビルドする時、rccファイルが必要である)
    cp /<Qtのソースコードがあるディレクトリ>/qtbase/bin/rcc /<Linux PCで使用するQtライブラリを配置するディレクトリ>/bin


必要ならば、以下のようなシェルスクリプトを作成すると便利である。

 #!/usr/bin/env sh
 
 CROSS_PI_PATH=/<GCC ARM 8.3.0以降のインストールディレクトリ>
 CROSS_COMPILE=$CROSS_PI_PATH/bin/arm-linux-gnueabihf-
 
 LD_LIBRARY_PATH=$CROSS_PI_PATH/lib:$LD_LIBRARY_PATH
 LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/lib:$LD_LIBRARY_PATH
 LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib:$LD_LIBRARY_PATH
 LD_LIBRARY_PATH=$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib:$LD_LIBRARY_PATH
 
 LDFLAGS="-L$CROSS_PI_PATH/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/usr/lib/ -L$CROSS_PI_PATH/arm-linux-gnueabihf/libc/lib/"
 
 PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/arm-linux-gnueabihf/pkgconfig" \
 PKG_CONFIG_LIBDIR=/<SysRootがあるディレクトリ>/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig:/<SysRootがあるディレクトリ>/sysroot/usr/share/pkgconfig \
 ../Qt5_Src/configure -release \
 -opengl es2 -eglfs \                    # EGLを使用する場合
 -opengl es2 \                           # XCBを使用する場合
 -device <Raspberry Piのバージョン> -device-option CROSS_COMPILE=${CROSS_COMPILE} \
 -sysroot /<SysRootがあるディレクトリ>/sysroot \
 -opensource -confirm-license -v \
 -nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
 -ccache -ltcg -iconv -sctp -freetype \  # 必要な場合は指定する
 -skip qtscript -skip qtwayland -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
 -qpa eglfs \                            # EGLを使用する場合
 -qpa xcb \                              # XCBを使用する場合
 -prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
 -extprefix /<Raspberry PiにインストールするQtライブラリを配置するディレクトリ>/Target \
 -hostprefix /<Linux PCで使用するQtライブラリを配置するディレクトリ>/Host \
 -no-gcc-sysroot                         # GCC ARM 8.3.0以降を使用する場合


Qtライブラリのインストール

ビルドしたQtライブラリを、Raspberry Piにデプロイする。
~/Program/Qt_Embedded/Qt5ディレクトリに存在する全てのファイルを、Raspberry Piの/usr/localディレクトリに同期させる。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
~/Program/Qt_Embedded/Target <Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x


※注意
Raspberry PiにアップロードしたQtライブラリの所有者がrootになっている場合があるため、
以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。

sudo chown -R <Raspberry Piのユーザ名>:<Raspberry Piのグループ名> ~/InstallSoftware/Qt_5_x_x


Raspberry PiのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。
/etc/ld.so.conf.dディレクトリに配置する場合、Raspberry Pi 2B / 3Bでは、ファイル名の先頭に"00"を付加すること。

# .profileファイルに設定する場合
export LD_LIBRARY_PATH="/home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x/lib:$LD_LIBRARY_PATH"

# /etc/ld.so.conf.dディレクトリに配置する場合
echo /home/<Raspberry Piのユーザ名>/InstallSoftware/Qt_5_x_x/lib | sudo tee /etc/ld.so.conf.d/00-Qt_5_x_x.conf
sudo ldconfig


これにより、Raspberry PiでQtライブラリが使用できる。

Qtソフトウェアの動作確認

Qtソフトウェアをビルドして、動作確認を行う。

XCBを使用する場合

Raspberry PiのEGL / GLESライブラリを修正する。

Raspberry Piの/usr/lib/arm-linux-gnueabihfディレクトリには、MesaのlibEGLとlibGLESv2が存在する。
XCBを使用したQtソフトウェアは、/opt/vc/libディレクトリにあるlibbrcmEGLとlibbrcmGLESv2ではなく、libEGLとlibGLESv2が自動的に選択される。
しかし、MesaのlibEGLとlibGLESv2は、OpenGLの描画処理と関わりがあるEGLでは、ほとんど役に立たない。(XCBは、OpenGLの描画処理とほぼ関係無い)

そのため、libbrcmEGLとlibbrcmGLESv2を、libEGLとlibGLESv2に入れ替える。
具体的には、libbrcmEGLとlibbrcmGLESv2のシンボリックリンクを/usr/lib/arm-linux-gnueabihfディレクトリに作成する。
(必ず、元のファイルはバックアップすること)

sudo ln -sf /opt/vc/lib/libbrcmEGL.so /opt/vc/lib/libEGL.so
sudo ln -sf /opt/vc/libbrcmGLESv2.so /opt/vc/libGLESv2.so

sudo ln -sf /opt/vc/lib/libEGL.so                    /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1 /usr/lib/arm-linux-gnueabihf/libEGL.so

sudo ln -sf /opt/vc/lib/libGLESv2.so                    /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 /usr/lib/arm-linux-gnueabihf/libGLESv2.so


上記で設定したライブラリを読み込むため、以下のコマンドを実行する。

sudo ldconfig


上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。

sudo rm -rf /opt/vc/lib/libEGL.so /opt/vc/libGLESv2.so

sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1     /usr/lib/arm-linux-gnueabihf/libEGL.so

sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so


次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。

  • Variable - QT_QPA_PLATFOMRTHEME
    Value - qt5ct
  • Variable - DISPLAY
    Value - :0 または :0.0
  • Variable - XAUTHORITY
    Value - /home/<Raspberry Piのユーザ名>/.Xauthrity
  • Variable - XDG_SESSION_TYPE
    Value - x11


さらに、Raspberry Piの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。

export QT_QPA_PLATFOMRTHEME=qt5ct
export DISPLAY=:0 または export DISPLAY=:0.0
export XAUTHORITY=/home/<Raspberry Piのユーザ名>/.Xauthrity
export XDG_SESSION_TYPE=x11


EGL / XCB 共通

Qtソフトウェアのサンプルをダウンロードする。
この時、<Qtソフトウェアのサンプル>と<Qtのバージョン>は合致するものを指定すること。

git clone git://code.qt.io/qt/<Qtソフトウェアのサンプル>.git -b <Qtのバージョン>

cd <Qtソフトウェアのサンプル>

~/Program/Qt_Embedded/Qt5/bin/qmake
make -j $(nproc)
make install DESTDIR=<Qtソフトウェアを配置するディレクトリ>


最後に、QtソフトウェアをRaspberry Piにデプロイする。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" /<Qtソフトウェアを配置するディレクトリ> \
<Raspberry Piのユーザ名>@<Raspberry Piのホスト名またはIPアドレス>:/home/<Raspberry Piのユーザ名>/<Qtソフトウェアをインストールするディレクトリ>


エラー関連

libEGL warning: DRI2: failed to authenticate

以下のコマンドを実行する。

sudo raspi-config


次に、[Advanced Options] - [A8 GL Driver] - [G2 GL (Fake KMS)]を選択する。(KMSが有効になる)
最後に、[Finish]を選択して終了する。
(このオプションが利用可能になる前に、いくつかのアップデートを促される時はアップデートする)

warning : GLX/DRI2 is not supported/failed to authenticate

Qtプロジェクトをリモートデバッグする時、この警告が出力される場合がある。
この警告は、他のソフトウェアが独自のmesaライブラリ(libEGLとlibGLESv2)を追加しているために表示される。

まず、libEGLとlibGLESv2のパスを確認するため、以下のコマンドを実行する。
(おそらく、/opt/vc/lib/libEGL.soと/opt/vc/lib/libGLESv2.soが表示される)

sudo find / -iname "*egl*"
sudo find / -iname "*gles*"


上記で表示されたファイルのシンボリックファイルを、以下のディレクトリに作成する。

# Raspberry Pi 3B
sudo ln -sf /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -sf /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2

# Raspberry Pi 4B
sudo ln -sf /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -sf /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2


※注意
Debian等では、/usr/lib/x86_64-linux-gnu/mesa-eglディレクトリに存在する場合があるため、それに応じてコマンドを変更する必要がある。

最後に、ライブラリファイルを読み込むため、以下のコマンドを実行する。

sudo ldconfig


上記のシンボリックリンクの設定を元に戻す場合は、以下のように実行する。

# Raspberry Pi 3B
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1     /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so

# Raspberry Pi 4B
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0   /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libEGL.so.1       /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ln -sf /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2     /usr/lib/arm-linux-gnueabihf/libGLESv2.so


Note: Disabling X11 Accessibility Bridge: D-Bus or AT-SPI is missing.

Qtのソースコードにおいて、Configureスクリプトを実行する時、この注意が表示される場合がある。
この時、Raspberry Piに対して、以下のライブラリをインストールする。

sudo apt-get install at-spi2-core gir1.2-atspi-2.0 libatspi2.0-dev


QtWebEngineのビルドおよびインストール

上記のセクションでは、QtWebEngineモジュールを無効にしている。
これは、QtWebEngineのビルドには多くの時間とディスクスペースが必要なためである。

勿論、QtWebEngineとQtを同時にビルドすることも可能であるが、ビルドに失敗する場合はビルド全体が失敗したことになるため、
まず、ベースとなるQt 5を個別にビルドした後、QtWebEngineを個別にビルドすることを推奨する。

依存関係のライブラリのインストール
必須およびオプションのライブラリ
ライブラリ名 備考
必須 flex bison gperf libre2-dev libnss3-dev
X11対応に必要 libdrm-dev libxdamage-dev XCB / X11を使用する場合、
これらのライブラリが必要である。
オプション libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev
libevent-dev libprotobuf-dev protobuf-compiler libwebp-dev libpoppler-cpp-dev
追加サポートとして便利である。
(オプション)
システム構築ツール
ninja-build re2c ninjaビルドツールを使用することで、
ビルドを高速化できることがある。
使用できないライブラリ libopus-dev libvpx-dev OpusとVPXメディアのサポートが追加されるが、
Raspbian busterで利用するには古すぎる。


QtWebEngineのダウンロード

Qtの公式Webサイトから、QtWebEngineをダウンロードする。
https://download.qt.io/official_releases/qt/x.x/x.x.x/submodules/qtwebengine-everywhere-src-x.x.x.tar.xz

QtWebEngineのビルド設定

ダウンロードしたQtWebEngineのビルド設定を編集する。

QtWebEngineでのジャンボビルドを無効化する。
標準のジャンボビルドシステムでは、コンパイル時に不明のエラーが出力されるため、無効にする。

sed -i -e 's|use_jumbo_build=true|use_jumbo_build=false|' /<QtWebEngineのソースコードがあるディレクトリ>/src/buildtools/config/common.pri


QtWebEngineのビルドとインストール

次に、QtWebEngineのConfigureスクリプトを実行する。

/opt/Qt/5.15.2/bin/qmake /<QtWebEngineのソースコードがあるディレクトリ> -- -no-webengine-geolocation


正常に終了する時、以下のようなサマリが表示される。

Qt WebEngine:
 Embedded build ......................... no
 Full debug information ................. no
 Pepper Plugins ......................... yes
 Printing and PDF ....................... yes
 Proprietary Codecs ..................... no
 Spellchecker ........................... yes
 Native Spellchecker .................... no
 WebRTC ................................. yes
 Use System Ninja ....................... yes
 Geolocation ............................ no
 WebChannel support ..................... yes
 Use v8 snapshot ........................ yes
 Kerberos Authentication ................ no
 Support qpa-xcb ........................ yes
 Use ALSA ............................... yes
 Use PulseAudio ......................... no
 Optional system libraries used:
   re2 .................................. yes
   icu .................................. no
   libwebp, libwebpmux and libwebpdemux . no
   opus ................................. no
   ffmpeg ............................... no
   libvpx ............................... no
   snappy ............................... no
   glib ................................. yes
   zlib ................................. yes
   minizip .............................. yes
   libevent ............................. yes
   jsoncpp .............................. yes
   protobuf ............................. yes
   libxml2 and libxslt .................. yes
   lcms2 ................................ yes
   png .................................. yes
   JPEG ................................. yes
   harfbuzz ............................. no
   freetype ............................. yes
 Required system libraries:
   fontconfig ........................... yes
   dbus ................................. yes
   nss .................................. yes
   khr .................................. yes
   glibc ................................ yes
 Required system libraries for qpa-xcb:
   x11 .................................. yes
   libdrm ............................... yes
   xcomposite ........................... yes
   xcursor .............................. yes
   xi ................................... yes
   xtst ................................. yes


最後に、QtWebEngineをビルドする。
もし、ビルドするPCのメモリが8[GB]以下の場合、NINJAJOBSを4以下にして、Ninjaの並列ビルドの量を制限する必要がある。

make -j $(nproc)
または
make -j 4 NINJAJOBS=-j4

make install


QtWebEngineのビルド時に発生する問題

下表は、QtWebEngineで見つかった問題とビルドの問題を集めたものである。

ビルド時の問題点と解決策
QtWebEngineのバージョン 問題 解決策
5.15.2 Internal Compiler Error, gcc 8.30

internal compiler error: in convert_move, at expr.c:218
static void exec_ops(const Op* ops, const void** args,
GCC Bugzilla bug report

Build for ARMv7
Patch the source to disable optimization
5.15.2 fatal error: xcb/dri3.h: No such file or directory 以下のライブラリをインストールする。
sudo apt-get install libxcb-dri3-dev
5.15.2 Broadcom EGLを使用するQtのビルドに失敗する。

qtwebengine-everywhere-src-x.x.x/src/3rdparty/chromium/ui/gl/gl_bindings_autogen_egl.h:201:5:
error: ‘EGLDeviceEXT’ has not been declared
Broadcom EGLの代わりに、
VC4 / KMSを使用してビルドする。



PinePhone

概要

Allwinner A64 SoC(sun50iw1)は、Cortex-A53 ARM CPU(クアッドコア)とARM社のMali400 MP2 GPUを搭載している。

A64は、基本的にAllwinner H3のCortex-A7コアをCortex-A53コアに置き換えたものである。
メモリマップ、クロック、割り込みのほとんどを共有しており、IPブロックも同じものを使用している。

H3とA64の違いは以下の通りである。

H3は、USBホストコントローラを3つ搭載しているのに対して、A64は1つしか搭載していない。
どちらのSoCもUSB-OTGコントローラを追加しているが、これは通常のホストコントローラとしても使用することを想定している。

H3のDRAMコントローラは最大2[GB]のRAMをサポートしており、A64は最大3[GB]をサポートしている。
64bitチップでありながら、物理的には完全に3bitのSoCとなっている。

H3は5個のUARTをサポートしており、A64は6個のUARTをサポートしている。
MMCコントローラーが更新され、より高速な転送モードをサポートしている。
MMCのクロックは途中で変更され、現在はMMCコントローラ自身が出力とサンプルフェーズをサポートしている。

H3はSRAM A1がアドレス0にマッピングされており、BROMは0xffff0000にある。
A64はBROMがアドレス0にマッピングされており、SRAM A1はそのすぐ後ろの0x10000(64KB)にマッピングされている。

pinmuxの構成はまだ多少似ているが、互換性のない程度に異なる。
顕著な例は(デバッグ用の)UART0で、H3ではPortAにあるが、A64ではPortBにある。
H3にはPortBが無い。

Linux PCの設定

Linux PCにおいて、以下の依存関係のライブラリをインストールする。
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)

sudo zypper install autoconf automake cmake unzip tar git wget pkg-config gperf gcc gcc-c++ \
                    gawk bison openssl flex figlet pigz ncurses-devel ncurses5-devel texinfo


Linero社が提供しているGCC ARMツールチェーンをダウンロードする。
https://releases.linaro.org/components/toolchain/binaries/

wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz


Wayland-Scannerのインストール(重要)

Wayland-Scannerをインストールするには、MesonとNinjaをビルドする必要がある。

まず、Wayland Scannerのビルドに必要なライブラリをインストールする。

sudo zypper install libxml2-devel


次に、Wayland Scannerのソースコードをダウンロードする。

git clone https://gitlab.freedesktop.org/wayland/wayland
cd wayland && mkdir build  


Wayland Scannerをビルドする。
Wayland Scannerのインストールディレクトリは、PinePhoneのホスト向けターゲットディレクトリを指定すること。

meson ./build/ --prefix=<Wayland-Scannerのインストールディレクトリ> -Ddocumentation=false  
ninja -C build/ install


PinePhoneの設定

Qtのクロスコンパイルの手順において、SSH接続ができることが必須のため、SSH Serverをインストールおよび設定する。

# Mobian
sudo apt-get install openssh-server

# Manjaro
sudo pacman -S openssh


必要に応じて、公開鍵認証を行う場合は、設定 - SSHの公開鍵認証を参照すること。

SSH Serverの自動起動設定および開始する。

sudo systemctl enable ssh
sudo systemctl restart ssh


MobianまたはManjaroをアップデートする。

# Mobian
sudo apt-get update
sudo apt-get dist-upgrade
sudo systemctl reboot

# Manajro
sudo pacman -Syyu
sudo systemctl reboot


Qtライブラリをクロスコンパイルするために必要なライブラリをインストールする。
Qtライブラリのビルド設定によっては、不要なパッケージも含まれている。

# Mobian
sudo apt-get install  unzip ccache pkg-config build-essential make cmake gcc gfortran gdb gdbserver python3 \
                      libglib2.0-0 libglib2.0-dev libglib2.0-dev-bin libgmp-dev libmpc-dev libmpfr-dev libisl-dev \
                      libdbus-1-3 libdbus-1-dev libdbus-c++-bin libdbus-c++-dev libsctp1 libsctp-dev libatspi2.0-0 libatspi2.0-dev libzstd1 libzstd-dev \
                      libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev libicu-dev icu-devtools \
                      libblkid1 libblkid-dev libffi8 libffi-dev libmount1 libmount-dev libudev1 libudev-dev libhd21 libhd-dev libtsm-dev \
                      pcre2-utils libpcre2-32-0 libpcre2-dev libselinux1 libselinux1-dev libsepol2 libsepol-dev libwacom9 libwacom-dev libassimp5 libassimp-dev \
                      libproxy-dev liblttng-ctl0 liblttng-ctl-dev libb2-1 libb2-dev libsdl2-dev \
                      libfontconfig1 libfontconfig-dev libfontconfig1-dev libjpeg-dev libjpeg62-turbo libjpeg62-turbo-dev libjpeg-dev libasound2 libasound2-dev \
                      libxkbcommon-dev libxcb-xinerama0 libxcb-xinerama0-dev \
                      sqlite3 libsqlite3-0 libsqlite3-dev libssl3 libssl-dev libnss3 libnss3-dev libxslt1.1 libxslt1-dev libpugixml1v5 libpugixml-dev \
                      libwayland-bin libwayland-dev libwayland-egl1 libwayland-egl++1 libwayland-egl1-mesa libwayland-egl-backend-dev \
                      libwayland-client++1 libwayland-client-extra++1 libwayland-cursor++1 wayland-scanner++ wayland-protocols waylandpp-dev \
                      libgl1-mesa-dev libgles-dev libgles2-mesa-dev libegl-dev libegl1-mesa-dev libgegl-dev libglu1-mesa libglu1-mesa-dev libglfw3-dev libglew-dev libgbm-dev \
                      libweston-10-0 libweston-10-dev

# Manjaro
sudo pacman -S --needed base-devel util-linux-libs glib2 cmake unzip pkg-config gdb gdb-common gdbm gcc gcc-libs gcc-fortran python3 \
                        gmp libmpc mpfr libisl ccache icu lksctp-tools python-atspi zstd libinput libtsm mtdev libevdev libffi pcre pcre2 \
                        libwacom assimp fontconfig dbus dbus-c++ nss libxkbcommon alsa-lib libxinerama pugixml sqlite libxslt openssl \
                        wayland wayland-utils wayland-protocols egl-wayland waylandpp waylandpp wrapland wlc wayfire glew-wayland glfw-wayland libva1 \
                        mesa mesa-utils glu libglvnd libb2 lttng-ust libproxy


MobianおよびManjaroにおいて、マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。

Mobian向け その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-tools libbluetooth-dev
画像 libjpeg-dev libpng-dev libtiff-dev libmng-dev
コーデック libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libx265-dev
マルチメディア libgstreamer1.0-0 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base
gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad
libgstreamer-plugins-bad1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-tools
gstreamer1.0-alsa gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5
libwayland-dev(Wayland開発パッケージは、gstreamerヘッダで必要)
ALSAオーディオ libasound2-dev
Pulseオーディオ pulseaudio libpulse-dev
OpenALオーディオ libopenal-data libopenal1 libopenal-dev libsndio7.0 libsndio-dev
Text to Speech flite1-dev libspeechd-dev
シリアルポート libserialport
センサ sensorfw
データベース unixodbc unixodbc-common unixodbc-dev (ODBC)
libsqlite3-dev (SQLite)
libpq-dev(PostgreSQL)
libmariadbclient-dev(MariaDB / MySQL)
プリンタ libcups2-dev
Wayland libwayland-dev
X11 libfontconfig-dev libfontconfig1-dev libfreetype6-dev
libx11-dev libx11-xcb-dev
libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev
libxfixes-dev libxrender-dev
libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev
libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev
libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libxcb-damage0-dev
libxcb-composite0-dev libxcb-record0-dev libxcb-present-dev libxcb-res0-dev libxcb-render0-dev
libxcb-xinput-dev libxcb-xv0-dev libxcb-xtest0-dev libxcb-cursor-dev libxcb-util-dev libxcb-ewmh-dev libxcb-xvmc0-dev
libxcb-imdkit-dev
libxcb-xrm-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-dpms0-dev libxcb-xf86dri0-dev
WebEngine 必須 :
flex bison gperf libre2-dev libnss3-dev libdrm-dev

オプション1 :
libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev
protobuf-compiler

オプション2(不安定なため注意すること) :
libopus-dev libvpx-dev
アクセシビリティ libatspi2.0-dev
SCTP libsctp1 libsctp-dev -sctp


Manjaro向け その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-tools bluez-libs bluez-utils
画像 openjpeg2 libjpeg-turbo libpng libtiff libmng
マルチメディア gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good
gst-plugins-bad gst-plugins-bad-libs
gst-plugins-ugly gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk
qt-gstreamer gst-plugin-qmlgl gst-plugin-opencv
ALSAオーディオ alsa-lib
Pulseオーディオ pulseaudio-alsa
OpenAL openal
Text to Speech flite
シリアルポート libserialport
センサ sensorfw
データベース postgresql-libs libpqxx (PostgreSQL)
mariadb-clients mariadb-libs (MariaDB)

unixodbc (ODBC)
sqlite (SQLite)

プリンタ libcups
Wayland (X11) xorg-xwayland
X11
WebEngine 必須 :
flex bison gperf readline nss libdrm

オプション1 :
libxml2 libxml++ libxslt minizip jsoncpp lcms2 libevent protobuf protobuf-c

オプション2(不安定なため注意すること) :
opus libvpx
アクセシビリティ at-spi2-core at-spi2-atk
SCTP lksctp-tools -sctp


  • 上表のライブラリを全てインストールする場合
    Mobianの場合
    sudo apt install bluez bluez-tools libbluetooth-dev libjpeg-dev libpng-dev libtiff-dev libmng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev \
    libx264-dev libx265-dev \
    libgstreamer1.0-dev libgstreamermm-1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev libopenal-dev libsndio-dev libwayland-dev \
    unixodbc-dev libsqlite3-dev libcups2-dev \
    libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev libx11-xcb-dev libxext-dev \
    libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev \
    libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev \
    libxkbcommon-dev libxkbcommon-x11-dev \
    flex bison gperf libre2-dev libnss3-dev libdrm-dev \
    libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev protobuf-compiler libopus-dev libvpx-dev \
    libatspi2.0-dev libsctp1 libsctp-dev

    Manjaro ARMの場合
    sudo pacman -S --needed bluez bluez-libs openjpeg2 libjpeg-turbo libpng libtiff libmng gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good \
    gst-plugins-bad gst-plugins-bad-libs gst-plugins-ugly gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk qt-gstreamer gst-plugin-qmlgl gst-plugin-opencv alsa-lib \
    pulseaudio-alsa openal flite libserialport sensorfw unixodbc sqlite libcups xorg-xwayland flex bison gperf readline nss libdrm libxml2 libxml++ libxslt minizip jsoncpp \
    lcms2 libevent protobuf protobuf-c opus libvpx at-spi2-core at-spi2-atk lksctp-tools


次のセクションにおいて、rsyncコマンドを使用してLinux PCとPinePhoneのファイルを同期する。
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。

そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。

echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers


システムルートディレクトリの設定

Linux PCで、PinePhone向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。
PinePhone上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。

Linux PC上に開発用ディレクトリを作成する。
また、PinePhoneのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。

mkdir -p ~/Program/Qt_Embedded/sysroot \
         ~/Program/Qt_Embedded/sysroot/usr \
         ~/Program/Qt_Embedded/sysroot/usr/share 


rsyncコマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。

rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/lib ~/Program/Qt_Embedded/sysroot
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/include ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/lib ~/Program/Qt_Embedded/sysroot/usr
rsync -avz --rsync-path="sudo rsync" --delete --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/usr/share/pkgconfig ~/Program/Qt_Embedded/sysroot/usr/share


ダウンロードしたシステムルートディレクトリにあるファイルおよびディレクトリのシンボリックリンクを相対的に調整する。
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py

./sysroot-relativelinks.py ~/Program/Qt_Embedded/sysroot


Qtのソースコードのダウンロード

  • Qt Everywhere (こちらを推奨する)
    wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz
    tar xf qt-everywhere-opensource-src-x.x.x.tar.gz

  • Githubの使用
    GithubからQtのソースコードを個別にダウンロードする。
    git clone https://github.com/qt/qt5.git

    ダウンロードしたスーパーリポジトリに移動する。
    cd qt5
    git checkout <Qtのバージョン>
    または
    git checkout <Qtのショートバージョン>

    init-repositoryコマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。
    スーパーリポジトリは小さく、全てのモジュール(ライブラリ)はgit submodulesとして保持されている。

    利用可能な全てのモジュールについてはこちらのWebサイト、ツールについてはinit-repository --helpコマンドまたはこちらのWebサイトを参照すること。
    ./init-repository --module-subset=essential,qtsvg,qtvirtualkeyboard,qtquickcontrols
    ./init-repository -f --module-subset=qtquick3d,qtquicktimeline,qtwayland # 必要な場合は個別に追加ダウンロードする


Qtの設定

Qtのソースコードがあるディレクトリにおいて、qtbase/mkspecs/devices/linux-pinephone-g++ディレクトリを作成する。

mkdir <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++


次に、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.hファイルを以下の内容で作成する。

vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.h


 // qplatformdefs.hファイル
 #include "../../linux-g++/qplatformdefs.h"


さらに、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.confファイルを以下の内容で作成する。

vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.conf


# qmake.confファイル

# qmake configuration for the PinePhone(Based A20_OlinuxinO boards)

include(../common/linux_device_pre.conf)

#QT_QPA_DEFAULT_PLATFORM = eglfs     # 不要の可能性があるため要調査
QT_QPA_DEFAULT_PLATFORM = wayland   # 不要の可能性があるため要調査

SYSROOT_INC = $$[QT_SYSROOT]/usr/include
SYSROOT_LIB = $$[QT_SYSROOT]/usr/lib

# Extra stuff (OpenGL, DirectFB, ...)
QMAKE_INCDIR_EGL        = $$[SYSROOT_INC] \
                          $$[SYSROOT_INC]/aarch64-linux-gnu \
                          $$[SYSROOT_INC]/GL \
                          $$[SYSROOT_INC]/EGL \
                          $$[SYSROOT_INC]/GLES \
                          $$[SYSROOT_INC]/GLES2 \
                          $$[SYSROOT_INC]/GLES3 \
                          $$[SYSROOT_INC]/GLFW
QMAKE_LIBDIR_EGL        = $$[SYSROOT_LIB] \
                          $$[SYSROOT_LIB]/aarch64-linux-gnu
QMAKE_INCDIR_OPENGL_ES2 = $$[QMAKE_INCDIR_EGL]
QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL}
QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}          # 不要の可能性があるため要調査
QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}          # 不要の可能性があるため要調査

QMAKE_LIBS_EGL          = -lEGL
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}   # 不要の可能性があるため要調査

# modifications to gcc-base.conf
QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53       # PinePhoneの場合
#QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a72 -lts  # PinePhone Proの場合
QMAKE_CFLAGS_RELEASE   += -O3
QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_RELEASE += -O3

QMAKE_LIBS              += -lrt -lpthread -ldl -lz      # Linaro GCC ARM 7.5 ツールチェーンを使用する場合
#QMAKE_LIBS              += -lrt -lpthread -ldl          # GCC ARM 8.3 以降のツールチェーンを使用する場合

DISTRO_OPTS += aarch64
DISTRO_OPTS += deb-multi-arch  # Mobian OSを使用する場合は指定する
                               # 他のOSを使用する場合は、削除またはコメントアウトする

# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_mali

include(../common/linux_arm_device_post.conf)

load(qt_config)


Qtのビルド

GCC 11以降を使用する場合

GCC 11以降のツールチェーンを使用する場合、Qt 5.15のビルド時において、以下に示すエラーが発生する。

error: 'numeric_limits' is not a member of 'std'  static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max();

error: expected primary-expression before '>' token  static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max();

error: '::max' has not been declared; did you mean 'std::max'?   static_cast<quint16>(numbers.size()) : std::numeric_limits<quint16>::max();


これは、std::limitsが削除されて、limits.hファイルに移行されたからである。
もし、GCC 11以降を使用してQt 5.15をビルドする場合は、qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.hファイルを、以下に示すように編集する。

vi qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.h


 // qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.hファイル
 // 45〜48行目あたり
 
 // 編集前
 #ifdef __cplusplus
 #  include <type_traits>
 #  include <cstddef>
 #  include <utility>
 #endif
 
 // 編集後
 #ifdef __cplusplus
 #  include <type_traits>
 #  include <cstddef>
 #  include <utility>
 #include <limits>
 #endif


Qtのビルド

Qtをビルドするため、ビルド用のディレクトリを作成する。

mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build


Configureスクリプトを実行する。

export PATH="/<Wayland Scannerのインストールディレクトリ>/bin:$PATH"
export LD_LIBRARY_PATH="/<Wayland Scannerのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"

export PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig"
export PKG_CONFIG_LIBDIR="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig"

# コンパイラの設定
export COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-"
# または
# export COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-unknown-linux-gnu-"

../<Qtのソースコードがあるディレクトリ>/configure -v 
-release \
-opensource \
-confirm-license \
-opengl es2 \
-qpa wayland \
-device linux-pinephone-g++ \
-device-option CROSS_COMPILE=$COMPILER \
-nomake examples -no-compile-examples -nomake tests -make libs -no-use-gold-linker -recheck-all \
-skip qtscript -skip qtwebengine -skip qtandroidextras -skip qtmacextras -skip qtwinextras \
-skip qtgamepad -skip qtpurchasing -skip qtcharts -skip qtsensors \   (不要な場合)
-skip qtlocation -skip qtspeech -skip qtlottie \                      (不要な場合)
-skip qtdoc \
-sysroot /<SysRootが存在するディレクトリ>/sysroot \
-prefix /<Qtソフトウェアを配置するディレクトリ>/QtSoftware \
-extprefix /<PinePhoneにインストールするQtライブラリを配置するディレクトリ>/Target \
-hostprefix /<Linux PCで使用するQtツールを配置するディレクトリ>/Host


Qtをビルドおよびインストールする。

gmake -j $(nproc)
gmake install


Qt Waylandのビルド

まず、Qt Waylandのソースコードのディレクトリ(/<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner)に対して、
wayland-text-input-unstable-v2-client-protocolファイル、wayland-text-input-unstable-v2-server-protocol.hファイル、wayland-wayland-client-protocol.hファイルを作成する。

なお、wayland-text-input-unstable-v2-client-protocolファイルとwayland-text-input-unstable-v2-server-protocol.hファイルは、空のファイルである。

touch /<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner/wayland-text-input-unstable-v2-client-protocol.h \
      /<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner/wayland-text-input-unstable-v2-server-protocol.h \
      /<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner/wayland-wayland-client-protocol.h


vi /<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner/wayland-wayland-client-protocol.h


 // wayland-wayland-client-protocol.hファイル
 #include "../../../../../src/client/wayland-wayland-client-protocol.h"


次に、Wayland Scannerをインストールする。
なお、Wayland Scannerのビルドには、Meson(Pythonライブラリ)とNinjaが必要である。

  1. Wayland Scannerのビルドに必要なライブラリをインストールする。
    sudo zypper install meson ninja expat-devel libxml2-devel

  2. Wayland Scannerのソースコードをダウンロードする。
    git clone https://github.com/wayland-project/wayland.git
    cd wayland && mkdir build

  3. Wayland Scannerのビルドおよびインストールする。
    meson ./build --prefix=<上記でインストールしたQtツールのインストールディレクトリ> -Ddocumentation=false
    ninja -C ./build install


最後に、Qt Waylandをビルドおよびインストールする。

export PATH="/<Wayland Scannerのインストールディレクトリ>/bin:$PATH"
export LD_LIBRARY_PATH="/<Wayland Scannerのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"

export LD_LIBRARY_PATH="/<上記でインストールしたQtライブラリのインストールディレクトリ>/lib:$LD_LIBRARY_PATH"

export PKG_CONFIG_PATH="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig"
export PKG_CONFIG_LIBDIR="/<SysRootがあるディレクトリ>/usr/lib/pkgconfig:/<SysRootがあるディレクトリ>/usr/lib/aarch64-linux-gnu/pkgconfig:/<SysRootがあるディレクトリ>/usr/share/pkgconfig"

cd /<Qtのソースコードがあるディレクトリ>/qtwayland
mkdir build && cd build

/<上記でインストールしたQtツールがあるディレクトリ>/bin/qmake ../qtwayland.pro


Qt SVGのビルド

もし、Qt SVGをビルドおよびインストールしていない場合は、手動で行う。
なお、Qt SVGをインストールするには、上記でインストールしたQtツール(Linux PC向け)のディレクトリにあるqmakeファイルを使用する必要がある。

まず、Qt SVGのソースコードが存在するディレクトリに移動して、ビルド用ディレクトリを作成する。

cd /<Qtのソースコードがあるディレクトリ>/qtsvg
mkdir build && cd build


Qt SVGをビルドおよびインストールする。
なお、Qt SVGのインストールディレクトリは、自動的にQtライブラリ(ターゲット向け)のディレクトリにインストールされる。
そのため、DESTDIRオプション等は付加しない。(付加しても無視される)

/<上記でインストールしたLinux PC向けのQtツールのディレクトリ>/Host/bin/qmake ../qtsvg.pro
make -j $(nproc)
make install



Qt Virtual Keyboardのビルド

もし、Qt Virtual Keyboardをビルドおよびインストールしていない場合は、手動で行う。
この時、Qt Virtual Keyboardがインストールされているディレクトリを環境変数LD_LIBRARY_PATHに追加する必要がある。

なお、Qt Virtual Keyboardをインストールするには、上記でインストールしたQtツール(Linux PC向け)のディレクトリにあるqmakeファイルを使用する必要がある。

まず、Qt Virtual Keyboardのソースコードが存在するディレクトリに移動して、ビルド用ディレクトリを作成する。

cd /<Qtのソースコードがあるディレクトリ>/qtvirtualkeyboard
mkdir build && cd build


Qt Virtual Keyboardをビルドおよびインストールする。
なお、Qt Virtual Keyboardのインストールディレクトリは、自動的にQtライブラリ(ターゲット向け)のディレクトリにインストールされる。
そのため、DESTDIRオプション等は付加しない。(付加しても無視される)

export LD_LIBRARY_PATH="/<上記でインストールしたQtライブラリ(ターゲット向け)のディレクトリ>/lib:$LD_LIBRARY_PATH"

/<上記でインストールしたLinux PC向けのQtツールのディレクトリ>/Host/bin/qmake "CONFIG+=lang-all" ../qtvirtualkeyboard.pro
make -j $(nproc)
make install


Qtライブラリのインストール

ビルドしたQtライブラリを、PinePhoneにデプロイする。

まず、~/Program/Qt_Embedded/Qt5ディレクトリに存在する全てのファイルを、PinePhoneの任意のディレクトリ(例. ~/InstallSoftware/Qt_5_x_xディレクトリ)に同期させる。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
~/Program/Qt_Embedded/Target <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x


※注意
PinePhoneにアップロードしたQtライブラリの所有者がrootになっている場合があるため、
以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。

sudo chown -R <ユーザ名>:<グループ名> ~/InstallSoftware/Qt_5_x_x


PinePhoneのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。
/etc/ld.so.conf.dディレクトリに配置する場合、ファイル名の先頭に"00"を付加すること。

※注意
~/.profileファイルに環境変数LD_LIBRARY_PATHを設定する場合、再度、Qt Creatorで環境変数LD_LIBRARY_PATHを設定する必要がある。
Qt Creatorでの設定は、Qt Creatorメイン画面左にある[プロジェクト] - [RUN] - [Environment]で設定する。

# .profileファイルに設定する場合
export LD_LIBRARY_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/lib:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins/qmltooling:$LD_LIBRARY_PATH"  

# /etc/ld.so.conf.d/00-Qt_5_x_x.confファイルに設定する場合
echo /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/lib | sudo tee /etc/ld.so.conf.d/00-Qt_5_x_x.conf
echo /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins/qmltooling | sudo tee /etc/ld.so.conf.d/00-Qt_5_x_x.conf


ライブラリを読み込む。

# .profileファイルに設定した場合
source ~/.profile

# /etc/ld.so.conf.d/00-Qt_5_x_x.confファイルに設定した場合
sudo ldconfig


Qtライブラリの設定

さらに、PinePhoneの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。

# Enable Qt Debug
export QT_QPA_PLATFORMTHEME="qt5ct"
export DISPLAY=":0" または export DISPLAY=":0.0"
# export XAUTHORITY="/home/<PinePhoneのユーザ名>/.Xauthrity"    (不要)
# export XDG_SESSION_TYPE="wayland"                 (不要)
# export XDG_RUNTIME_DIR="<XDG_RUNTIME_DIRに指定するディレクトリ>" (不要)

# Enable Qt Quick Debug
export QML_IMPORT_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/qml"
export QML2_IMPORT_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/qml"
export QT_PLUGIN_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins"
export QT_QPA_PLATFORM_PLUGIN_PATH="/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x/plugins/platforms"
export QML_IMPORT_TRACE=1


Qt Creatorの設定

次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。

まず、プロジェクトの環境変数の設定を行う。
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。

Qtプロジェクトをデバッグする場合は、必ず[デバイス環境の取得]ボタンを押下すること。

  • Variable - QT_QPA_PLATFORMTHEME
    Value - qt5ct
  • Variable - DISPLAY
    Value - :0 または :0.0
  • Variable : PATH
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/bin ※PATHの設定が既に存在する場合は、追記する
  • Variable : LD_LIBRARY_PATH (PinePhoneの~/.profileファイルに環境変数LD_LIBRARY_PATHを設定している場合)
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/lib:/home/<PinePhone's User Name>/InstallSoftware/Qt_5_15_2/plugins/qmltooling
  • Variable : QML_IMPORT_PATH
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/qml
  • Variable : QML2_IMPORT_PATH
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/qml
  • Variable : QT_PLUGIN_PATH
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/plugins
  • Variable : QT_QPA_PLATFORM_PLUGIN_PATH
    Value : /home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/plugins/platforms
  • Variable - XAUTHORITY(不要)
    Value - /home/<PinePhoneのユーザ名>/.Xauthrity
  • Variable - XDG_SESSION_TYPE(不要)
    Value - wayland


また、上記の設定を簡潔に行う場合、Qtプロジェクトのディレクトリにある.pro.userファイルにおいて、
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">〜</valuemap>要素内に、以下の設定を追記する。
以下の設定を追記する場合、必ず、Qtプロジェクトを閉じた状態で行うこと。

 # .pro.userファイル
 
 <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
   <!-- ...略 -->
   <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes">
     <value type="QString">QT_QPA_PLATFORMTHEME=qt5ct</value>
     <value type="QString">DISPLAY=:0</value>
     <value type="QString">PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games</value>
     <value type="QString">LD_LIBRARY_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/lib:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/plugins/qmltooling</value>
     <value type="QString">QML_IMPORT_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/qml</value>
     <value type="QString">QML2_IMPORT_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/qml</value>
     <value type="QString">QT_PLUGIN_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/plugins</value>
     <value type="QString">QT_QPA_PLATFORM_PLUGIN_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_15_2/plugins/platforms</value>
   </valuelist>
   <!-- ...略 -->
 </valuemap>


もし、デバッグにおいて、以下のようなエラーが出力される場合は、
Qt Creatorのサイドメニューから、[プロジェクト] - [Build & Run] - [Run] - [コマンドライン引数:]項目に、-platform waylandを記述する。

# エラー内容
Failed to create wl_display (No such file or directory)
...
error: XDG_RUNTIME_DIR not set in the environment
...
qt.qpa.plugin: Could not load the Qt platform plugin "wayland"



次に、GDBデバッガの設定を行う。
リモートターゲットをデバッグする時、GDBは、Linux PC側にダウンロードしているPinePhoneのシステムルートディレクトリを検索する。
そのため、GDBにターゲット側のPinePhoneのシステムルートディレクトリを検索するように設定する必要がある。

これは、Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。
ただし、この設定はQt Quickを使用する時のみである。(Qt Widgetを使用する場合は設定不要)

set sysroot target:/


しかし、上記の[追加の起動コマンド]において、set sysroot target:/オプションを使用する場合、デバッグの開始に時間が掛かる。
そのため、以下のように、[追加の起動コマンド]を記述して、
システムルートディレクトリに対して、Qtライブラリのインストールディレクトリのシンボリックリンクを作成することを推奨する。

システムルートディレクトリに対して、Linux PCに保存したPinePhone向けのQtライブラリがあるディレクトリのシンボクリックリンクを作成する。

mkdir -p /<PinePhoneのシステムルートディレクトリ>/home/mobian/InstallSoftware
ln -s /<Qtライブラリのインストールディレクトリ> /<PinePhoneのシステムルートディレクトリ>/home/mobian/InstallSoftware

# シンボリックリンク名の変更
mv /<PinePhoneのシステムルートディレクトリ>/home/mobian/InstallSoftware/<Qtライブラリのインストールディレクトリ> \
   /<PinePhoneのシステムルートディレクトリ>/home/mobian/InstallSoftware/Qt_5_15_2


Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。

# Kit名に"PinePhone"という文字列が入っている場合のみ、PinePhoneのシステムルートディレクトリを参照する
# x86 / x64のKitを使用する場合は、PinePhoneのシステムルートディレクトリを参照しない
[ -n $(grep -i PinePhone %{ActiveProject:Kit:Name}) ] && set sysroot /<PinePhoneのシステムルートディレクトリ>

# または

set sysroot /<PinePhoneのシステムルートディレクトリ>


もし、デバッグ時において、以下の警告が出力される場合は、GDBのみをGCC AArch64 ToolChain 10.2に変更する。

# 警告の内容
while parsing target description (at line 68): Vector "v8f" references undefined type "ieee_half"
Could not load XML target description; ignoring


GCC AArch64 ToolChain 10.2は、以下に示すURLからダウンロードできる。
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

これにより、PinePhoneでQtライブラリが使用できる。


PinePhone向けソフトウェアの設計

PinePhone向けソフトウェアのUIをデザインする場合、375x812[px]のウィンドウサイズで動作するように指定する。
これは、PhoshシェルでPinephoneに表示されるソフトウェアのサイズである。(2倍の拡大率で700x1200[px]の解像度まで)

また、画面を横向きする場合は、812x375[px]に反転させる。