インストール - Qt6

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

概要

Qtは、デスクトップ、組み込み、モバイルプラットフォーム向けのソフトウェアやユーザーインターフェイスの作成を効率化するために設計されたツールを備えた完全な開発フレームワークである。

Qt 6.2 LTSのサポート期間は、2024年9月30日まで、Qt 6.5 LTSのサポート期間は2026年3月30日までである。

Qtライセンスを購入するには、http://www.qt.io/download/ を参照すること。

参考書
q?_encoding=UTF8&ASIN=148427489X&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP
Introducing Qt 6
C++でモバイルとデスクトップ向けのアプリとゲームを作ることを学ぶ
q?_encoding=UTF8&ASIN=1800204582&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP
Cross-Platform Development with Qt 6 and Modern C++
プラットフォーム依存性を気にすることなく、
モダンなグラフィカルユーザーインターフェースを持つアプリケーションを設計・構築する
q?_encoding=UTF8&ASIN=B08XLLDZSG&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=presire22-22&language=ja_JP
A Guide to Qt 6
Qt 6の初心者向けガイド



Qt ライセンス

Qtは、様々なユーザのニーズに対応できるよう、様々なライセンスオプションが用意されている。

商用ライセンスでライセンスされたQtは、第三者とソースコードを共有したくない場合やGNU LGPL version 3の条項に準拠できない場合、プロプライエタリ / 商用ソフトウェアの開発に適している。
LGPL version 3の下でライセンスされたQtは、GNU LGPL version 3またはGNU GPL version 3の条項と条件に従うことができれば、Qtアプリケーションの開発に適している。

Qtマーケットプレイスライセンス契約に基づいてライセンスされたQtコンポーネントは、
商用またはGNU LGPL version 3またはGNU GPL version 3の条件に基づいてライセンスされたQtソフトウェアコンポーネントと共通のQtアプリケーションの開発に適している。

Qtには、元の開発者から特定のオープンソースライセンスの下でライセンスされているサードパーティのコードも含まれている。
また、Qtのサンプルは、The Qt Companyの商用ライセンスおよびBSD 3条項ライセンスの下で入手可能である。

Qtライセンスの概要については、http://qt.io/licensing/ を参照すること。


通常のインストール

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

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 u+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 6.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 git-core gcc-c++ make flex bison gperf libicu-devel python3 perl \
                    mozilla-nss-devel nodejs10 nodejs10-devel ruby mozilla-nspr-devel \
                    xorg-x11-libxcb-devel xcb-util-devel xcb-util-image-devel xcb-util-keysyms-devel xcb-util-renderutil-devel \
                    xcb-util-wm-devel xorg-x11-devel libxkbcommon-x11-devel libxkbcommon-devel libXi-devel \
                    dbus-1-devel libXcomposite-devel libXcursor-devel libXrandr-devel libXtst-devel wayland-devel \
                    pulseaudio-libs-devel alsa-devel alsa-lib-devel gstreamer1-devel gstreamer1-plugins-base-devel


  • fontconfig-devel
  • libfontenc-devel
  • libXft-devel
  • libx11-devel
  • libxcb-devel
  • libXext-devel
  • libXfixes-devel
  • libXrender-devel
  • Mesa-libGL-devel
  • libXinerama-devel
  • libxcb-shm0-dev
  • libxcb-sync0-dev
  • libxcb-shape0-dev


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

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

git clone --recursive https://code.qt.io/qt-creator/qt-creator.git


ソースコードのビルド

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

mkdir build
cd build


  • 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 -D CMAKE_BUILD_TYPE=Release -D CMAKE_PREFIX_PATH=<Qtのインストールディレクトリ>; <LLVMのインストールディレクトリ> ../qt-creator
    cmake --build .. --parallel $(nproc)


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

Qtのインストール

Qtをインストールする。

# qmakeを使用する場合
make install

# cmakeを使用する場合
cmake --install ..



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

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

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


# Qt_Creator.desktopファイル

[Desktop Entry]
Type=Application
Exec=/<Qt 6のインストールディレクトリ>/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=/<Qt 6のインストールディレクトリ>/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=/<Qt 6のインストールディレクトリ>/<バージョン名>/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において、Fcitxで日本語が入力できない問題が存在する。

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

FcitxおよびFcitx5を使用している場合で手順が異なることに注意すること。

Fcitxを使用している場合

fcitx-qt5ライブラリ(Fcitx)をインストールする。

  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 5のインストールディレクトリ>/<バージョン>/gcc_64 # Qt Creatorのビルドに使用されたQt SDKが5の場合
      -DCMAKE_PREFIX_PATH=/<Qt 6のインストールディレクトリ>/<バージョン>/gcc_64 # Qt Creatorのビルドに使用されたQt SDKが6の場合

      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


Fcitx5を使用している場合

fcitx5-qtライブラリ(Fcitx5)をインストールする。

  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/fcitx5-qt
  4. もし、上記の画像のように、Qt Creatorのビルドに使用されたQt SDKが6の場合、
    Qtメンテナンスツールを起動して、[コンポーネントの追加または削除]から該当するQtのバージョン以降の[Desktop gcc 64-bit]のみをインストールする。

  5. ダウンロードしたfcitx5-qtのディレクトリに移動して、ビルド向けディレクトリを作成する。
    cd fcitx5-qt && mkdir build && cd build
  6. fcitx5-qtライブラリをビルドおよびインストールする。
    インストールディレクトリは、自動的に/<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 5のインストールディレクトリ>/<バージョン>/gcc_64 # Qt Creatorのビルドに使用されたQt SDKが5の場合
      -DCMAKE_PREFIX_PATH=/<Qt 6のインストールディレクトリ>/<バージョン>/gcc_64 # Qt Creatorのビルドに使用されたQt SDKが6の場合

      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) Raspbian Bullseye(32-bit)
Raspberry Pi Zero/W/WH
Raspberry Pi 1 Model A / B / A+ / B+
6.3
9.4
10.3
8.3
9.3
10.3
10.3
Raspberry Pi 2 Model A / B
Raspberry Pi 3 Model A / B
6.3
9.4
10.3
8.3
9.4
10.3
10.3
Raspberry Pi 3 Model A+ / B+
Raspberry Pi 4 Model A+ / B+
Raspberry Pi Compute 3 / 3lite / 3+
6.3
9.4
10.3
8.3
9.4
10.3
10.3


GCC ARMツールチェーンにおいて、GCC 8以降が必要なため、Linaro社のGCC ARMツールチェーンは使用できない。
上表にあるGCC ARM 8.3.0ツールチェーンが動作しない場合、以下のURLにあるGCC ARM 8.3.0ツールチェーンを使用する。
https://bugfreeblog.page.link/rasplinuxgcc830

または、開発者がGCC ARMツールチェーンを作成する。
詳細は、インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストールを参照すること。

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


Qt 6を使用してクロスコンパイルする場合、x86 64向けのQtライブラリも必要となる。
そのため、Qtオンラインインストーラからx86 64向けのQtライブラリをインストールする。

(Qt 6のソースコードからx86 64向けのQt 6ライブラリをビルドおよびインストールしてもよいが、煩雑なため推奨しない)

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


ダウンロードしたファイルに実行権限を付加する。

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


次に、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 6をインストールする。

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 flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libboost1.71-all-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 \
                     mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev \
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# XCBを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libboost1.71-all-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 \
                     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 \
                     python (QtQuickを使用する場合) \
                     libgtk-3-dev (QtWidget向けにGTKネイティブテーマを使用する場合)

# Raspberry Pi 4B
# EGLを使用する場合
sudo apt-get install ccache flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libboost1.71-all-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 flex bison gperf ruby libicu-dev icu-devtools libhidrd0 libhidrd0-dev libsctp1 libsctp-dev libzstd1 libzstd-dev \
                     libatkmm-1.6-dev libinput-bin libinput-dev libts0 libts-bin libts-dev libmtdev1 libmtdev-dev libevdev2 libevdev-dev \
                     libboost1.71-all-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 \
                     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 \
                     python        (QtQuickを使用する場合) \
                     libgtk-3-dev  (QtWidget向けにGTKネイティブテーマを使用する場合)

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
マルチメディア gstreamer1.0-omx 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 libsndio7.0 libopenal1 libopenal-dev
データベース 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


GCC ARMツールチェーンにおいて、GCC 8以降が必要である
Linaroは、アップストリームビルドのスナップショットをユーザに提供するGNUツールチェーン・インテグレーションビルドを毎月提供している。
これらのビルドにより、開発者はビルド済みバイナリの機能をアップストリームですぐにテストすることができる。

Linero社が提供しているGCC ARMツールチェーンをダウンロードする。

※注意
クロスコンパイラのlibstdc++.so.6ファイルにおいて、PinePhone OSのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。
例えば、Mobian 12.0のlibstdc++.so.6ファイルはGLIBCXX_3.4.30までであるため、GCC 12.2ツールチェーン、または、それ以前のものを使用する。

GCCツールチェーン群 : https://snapshots.linaro.org/gnu-toolchain/

tar xf gcc-linaro-<バージョン>-x86_64_aarch64-linux-gnu.tar.xz


また、開発者がGCC ARMツールチェーンを作成する場合、インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストールを参照すること。

Qt 6を使用してクロスコンパイルする場合、x86 64向けのQtライブラリも必要となる。
そのため、Qtオンラインインストーラからx86 64向けのQtライブラリをインストールする。

(Qt 6のソースコードからx86 64向けのQt 6ライブラリをビルドおよびインストールしてもよいが、煩雑なため推奨しない)

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


ダウンロードしたファイルに実行権限を付加する。

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


次に、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 6をインストールする。

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


不要なライブラリをアンインストールする。
Qt6 D-Busがインストールされている場合、Qt SharedToolsライブラリのクロスコンパイルがエラーになることに注意する。

sudo pacman -R --needed qt6-base


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

# Mobian
sudo apt-get install  unzip ccache pkgconf-bin pkg-config libpkgconf3 pkgconf build-essential make cmake gcc gfortran gdb gdbserver python3 libgtk-3-dev \
                      libc6 libc6-dev linux-libc-dev glibc-source libc-dev-bin libc-devtools libglib2.0-0 libglib2.0-dev libglib2.0-dev-bin \
                      libgmp-dev libmpc-dev libmpfr-dev libisl-dev gconf2 gconf2-common libgconf2-dev \
                      libdbus-1-3 libdbus-1-dev libdbus-c++-bin libdbus-c++-dev libdbus-cpp-dev libdbus-glib-1-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 \
                      libproxy-dev liblttng-ust1 liblttng-ust-common1 liblttng-ust-dev libb2-1 libb2-dev libsdl2-dev libsystemd-dev \
                      libfontconfig1 libfontconfig-dev libfontconfig1-dev libjpeg-dev libjpeg62-turbo libjpeg62-turbo-dev libjpeg-dev libasound2 libasound2-dev \
                      sqlite3 libsqlite3-0 libsqlite3-dev libssl3 libssl-dev libnss3 libnss3-dev libxslt1.1 libxslt1-dev libpugixml1v5 libpugixml-dev \
                      libbz2-dev libatkmm-1.6-dev libsrtp2-dev libsnappy-dev re2c libpoppler-dev libmd4c-dev libmd4c-html0-dev liblitehtml0 liblitehtml-dev \
                      libxkbcommon-dev libxcb-xinerama0 libxcb-xinerama0-dev libglut3.12 libglut-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 \
                      libosmesa6-dev mesa-common-dev libopengl-dev libgl-dev libglm-dev libgl1-mesa-dev libgle3-dev libgles-dev libgles2-mesa-dev libegl-dev libegl1-mesa-dev \
                      libgegl-dev libglu1-mesa libglu1-mesa-dev libglw1-mesa-dev libglfw3-dev libglew-dev libglx-dev libgbm-dev libdrm-dev libdirectfb-dev \
                      libglvnd-dev libglvnd-core-dev libglut-dev libopenal-dev libalut-dev \
                      libweston-10-0 libweston-10-dev                                      \
                      libvulkan1 libvulkan-dev                                             \  # Vulkanを使用する場合
                      libclang-dev libclang-cpp-dev llvm-dev                               \  # QDoc, Clangベースのlupdateパーサーを使用する場合はインストールする
                      libassimp5 libassimp-dev                                             \  # 現在(2023/11)において、libassimp-devをインストールするとlibdracoライブラリの探索に失敗するため、
                                                                                           \  # libassimp-devはインストールしない
                      libdouble-conversion3 libdouble-conversion-dev                       \  # 現在(2023/11)において、libdouble-conversion-devをインストールするとdouble-conversionのヘッダファイルの探索に失敗するため、
                                                                                           \  # libdouble-conversion-devはインストールしない
                      linux-headers-arm64 linux-headers-6.1-sunxi64                           # 不要の可能性あり

# 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 mtdev libevdev libffi pcre pcre2 \
                        libwacom assimp fontconfig dbus dbus-c++ nss libxkbcommon alsa-lib libxinerama xorg-xinput xcb-util-xrm \
                        pugixml libxslt openssl libproxy libb2 lttng-ust libglvnd \
                        clang llvm \  # QtDocをインストールする場合
                        wayland wayland-utils wayland-protocols egl-wayland waylandpp waylandpp wlc wayfire glew-wayland glfw-wayland libva1 \
                        mesa mesa-utils glu vulkan-headers qt6ct


Manjaroにおいて、マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。
Mobianの場合、上記のセクションにあるRaspberry Piの表も参照すること。

Mobian向け その他のライブラリ(オプション)
機能 インストールするライブラリ configureスクリプトのオプション
Bluetooth bluez bluez-tools libbluetooth-dev
画像 libjpeg-dev libpng-dev libtiff-dev libmng-dev libwebp-dev
コーデック libavcodec-dev libavformat-dev libavutil-dev libavdevice-dev libavfilter-dev libswscale-dev libswresample-dev
libpostproc-dev libv4l-dev libxvidcore-dev libx264-dev libx265-dev
マルチメディア libwmf-dev libgstreamer1.0-0 libgstreamer1.0-dev libgstreamermm-1.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-dev
センサ libsensors-dev libsensors4-dev ※要調査
GPS libgps-dev ※要調査
データベース 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 libsm-dev libice-dev
libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev
libxfixes-dev libxrender-dev libxdamage-dev libxkbfile-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 libxshmfence-dev

オプション1 :
libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev
libpci-dev libpciaccess-dev libevent-dev libev-dev libev-libevent-dev libevhtp-dev libuev-dev libuv1-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 libwebp
マルチメディア libwmf
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 libiodbc (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


  • 上表のライブラリを全てインストールする場合
    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


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

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

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

    ダウンロードしたスーパーリポジトリに移動する。
    cd qt6
    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のビルド

CMakeツールチェーンファイルの作成

ターゲット向けQt 6ライブラリのビルドで使用するCMakeツールチェーンファイルを作成する。

vi ToolChain_for_PinePhone.cmake


 # ToolChain_for_PinePhone.cmake
 # Manjaro ARM向け
 
 cmake_minimum_required(VERSION 3.18)
 include_guard(GLOBAL)
 
 set(CMAKE_SYSTEM_NAME Linux)
 set(CMAKE_SYSTEM_PROCESSOR arm)
 
 # Set path to System Root.
 set(TARGET_SYSROOT <PinePhoneのシステムルートディレクトリ>)
 set(CMAKE_SYSROOT ${TARGET_SYSROOT})
 
 # Set path to package config.
 #set(ENV{PKG_CONFIG_PATH}        ${TARGET_SYSROOT}/usr/lib/pkgconfig)
 #set(ENV{PKG_CONFIG_LIBDIR}      ${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig)
 set(ENV{PKG_CONFIG_PATH}        $PKG_CONFIG_PATH:${TARGET_SYSROOT}/usr/lib/pkgconfig)
 set(ENV{PKG_CONFIG_LIBDIR}      /usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig)
 set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
 
 # Set path to Cross Compiler.
 set(CMAKE_C_COMPILER    <クロスコンパイル向けGCCまたはClangのパス>)
 set(CMAKE_CXX_COMPILER  <クロスコンパイル向けG++またはClang++のパス>)
 
 #set(CMAKE_C_FLAGS   "${CMAKE_CXX_FLAGS} -fPIC -Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib -L${TARGET_SYSROOT}/usr/lib")
 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib -L${TARGET_SYSROOT}/usr/lib")
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
 set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
 
 set(QT_COMPILER_FLAGS           "-march=armv8-a -mtune=cortex-a53")
 #set(QT_COMPILER_FLAGS_RELEASE   "-O2 -pipe")
 set(QT_COMPILER_FLAGS_RELEASE   "-O3")
 set(QT_LINKER_FLAGS             "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
 
 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 
 set(CMAKE_THREAD_LIBS_INIT "-lrt -lpthread -ldl")
 set(CMAKE_HAVE_THREADS_LIBRARY 1)
 set(CMAKE_USE_WIN32_THREADS_INIT 0)
 set(CMAKE_USE_PTHREADS_INIT 1)
 set(THREADS_PREFER_PTHREAD_FLAG ON)
 
 # Set ODBC
 set(ODBC_LIBRARY ${TARGET_SYSROOT}/usr/lib/libodbc.so)
 
 # Set WMF
 set(WMF_STRMIIDS_LIBRARY ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_AMSTRMID_LIBRARY ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_DMOGUIDS_LIBRARY ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_MSDMO_LIBRARY    ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_OLE32_LIBRARY    ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_OLEAUT32_LIBRARY ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_MF_LIBRARY       ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_MFUUID_LIBRARY   ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_MFPLAT_LIBRARY   ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_MFCORE_LIBRARY   ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 set(WMF_PROPSYS_LIBRARY  ${TARGET_SYSROOT}/usr/lib/libwmf.so)
 
 # Set AssImp
 set(ASSIMP_LIBRARY  ${TARGET_SYSROOT}/usr/lib/libassimp.so)


 # ToolChain_for_PinePhone.cmake
 # Mobian向け
 
 cmake_minimum_required(VERSION 3.18)
 include_guard(GLOBAL)
 
 set(CMAKE_SYSTEM_NAME Linux)
 set(CMAKE_SYSTEM_PROCESSOR arm)
 
 # Set path to System Root.
 set(TARGET_SYSROOT <PinePhoneのシステムルートディレクトリ>)
 set(CMAKE_SYSROOT ${TARGET_SYSROOT})
 
 # Set path to package config.
 set(ENV{PKG_CONFIG_PATH}        $PKG_CONFIG_PATH:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig)
 set(ENV{PKG_CONFIG_LIBDIR}      /usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:${TARGET_SYSROOT}/usr/lib/pkgconfig:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig:${TARGET_SYSROOT}/usr/share/pkgconfig)
 set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
 
 # Set path to Cross Compiler.
 set(CMAKE_C_COMPILER    <クロスコンパイル向けGCCまたはClangのパス>)
 set(CMAKE_CXX_COMPILER  <クロスコンパイル向けG++またはClang++のパス>)
 
 # Set Linker Flags for GCC.
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${TARGET_SYSROOT}/usr/include")
 set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
 set(CMAKE_EXE_LINKER_FLAGS_INIT     "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu")
 set(CMAKE_MODULE_LINKER_FLAGS_INIT  "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu")
 set(CMAKE_SHARED_LINKER_FLAGS_INIT  "-Wl,-rpath-link,${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu")
 
 # Set Compiler Flags.
 set(QT_COMPILER_FLAGS           "-march=armv8-a -mtune=cortex-a53")
 set(QT_COMPILER_FLAGS_RELEASE   "-O3")
 #set(QT_COMPILER_FLAGS_RELEASE   "-O2 -pipe")
 set(QT_LINKER_FLAGS             "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")
 
 set(CMAKE_THREAD_LIBS_INIT "-lrt -lpthread -ldl")
 set(CMAKE_HAVE_THREADS_LIBRARY 1)
 set(CMAKE_USE_WIN32_THREADS_INIT 0)
 set(CMAKE_USE_PTHREADS_INIT 1)
 set(THREADS_PREFER_PTHREAD_FLAG ON)
 
 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 
 # Set GL, EGL, GLESv2
 set(GL_INC_DIR ${TARGET_SYSROOT}/usr/include)
 set(GL_LIB_DIR ${TARGET_SYSROOT}:${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/:${TARGET_SYSROOT}/usr:${TARGET_SYSROOT}/usr/lib)
 
 set(OPENGL_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 set(OPENGL_opengl_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libOpenGL.so)
 
 set(EGL_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 set(EGL_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libEGL.so)
 
 set(GLESv2_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 set(GLESv2_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libGLESv2.so)
 
 set(gbm_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 set(gbm_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libgbm.so)
 
 set(Libdrm_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 set(Libdrm_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libdrm.so)
 
 #set(XCB_XCB_INCLUDE_DIR ${TARGET_SYSROOT}/usr/include)
 #set(XCB_XCB_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libxcb.so)
 
 # Set ODBC
 set(ODBC_LIBRARY ${TARGET_SYSROOT}/usr/lib/libodbc.so)
 
 # Set WMF
 set(WMF_STRMIIDS_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_AMSTRMID_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_DMOGUIDS_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_MSDMO_LIBRARY    ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_OLE32_LIBRARY    ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_OLEAUT32_LIBRARY ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_MF_LIBRARY       ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_MFUUID_LIBRARY   ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_MFPLAT_LIBRARY   ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_MFCORE_LIBRARY   ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)
 set(WMF_PROPSYS_LIBRARY  ${TARGET_SYSROOT}/usr/lib/aarch64-linux-gnu/libwmf.so)


Qtのビルド

Qt 6をクロスビルドするため、クロスビルド向けディレクトリを作成する。

mkdir build && cd build


Qt 6のクロスビルド向けの設定を行う。

 # Manjaro ARM向け
 
 # Wayland Scannerのパスを設定
 export PATH="/<Wayland Scannerのインストールディレクトリ>/bin:$PATH"
 export LD_LIBRARY_PATH="/<Wayland Scannerのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
 
 # PinePhoneのシステムルートディレクトリを設定
 export SYSROOT=<PinePhoneのシステムルートディレクトリ>
 
 # Pkg-Configの設定
 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 CROSS_COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-"
 # または
 # export CROSS_COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-unknown-linux-gnu-"
 
 cmake -G Ninja \
 <Qt 6のソースコードがあるディレクトリ>       \
 -DCMAKE_BUILD_TYPE=Release          \
 -DINPUT_opengl=es2                  \
 -DQT_FEATURE_opengles2=ON           \
 -DQT_FEATURE_opengles3=ON           \
 -DCMAKE_TOOLCHAIN_FILE=<CMakeデバイスファイルのパス>           \
 -DQT_BUILD_TOOLS_WHEN_CROSSCOMPILING=ON                  \
 -DQT_QMAKE_TARGET_MKSPEC=devices/linux-pinephone-g++     \
 -DQT_QMAKE_DEVICE_OPTIONS=CROSS_COMPILE=$CROSS_COMPILER  \
 -DQT_BUILD_EXAMPLES=OFF  \
 -DQT_BUILD_TESTS=OFF     \
 -DBUILD_qtdoc=OFF        \  # QtDocをインストールしない場合
 -DBUILD_qtwebengine=OFF  \  # QtWebEngineをインストールしない場合
 -DBUILD_qtwebview=OFF    \  # QtWebViewをインストールしない場合
 -DBUILD_qtwebchannel=OFF \  # QtWebChannelをインストールしない場合
 -DFEATURE_clang=ON       \  # QtDocをインストールする場合
 -DFEATURE_clangcpp=ON    \  # QtDocをインストールする場合
 -DCMAKE_SYSROOT=$SYSROOT \
 -DQT_HOST_PATH=<x86 64向けQt 6のパスのトップディレクトリ  例: /home/user/Qt/6.x.x/gcc_64>                       \
 -DQT_HOST_PATH_CMAKE_DIR=/<x86 64向けQt 6のパスのcmakeディレクトリ  例: /home/user/Qt/6.x.x/gcc_64/lib/cmake> \
 -DCMAKE_STAGING_PREFIX=<PinePhone向けQt 6ライブラリを配置するディレクトリ>                                        \
 -DCMAKE_INSTALL_PREFIX=<Qtソフトウェアを配置するディレクトリ>                                                     \
 -DCMAKE_PREFIX_PATH=$SYSROOT/usr/lib


 # Mobian向け
 
 # Wayland Scannerのパスを設定
 export PATH="/<Wayland Scannerのインストールディレクトリ>/bin:$PATH"
 export LD_LIBRARY_PATH="/<Wayland Scannerのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
 
 # PinePhoneのシステムルートディレクトリを設定
 export SYSROOT=<PinePhoneのシステムルートディレクトリ>
 
 # コンパイラの設定
 export CROSS_COMPILER="/<GCC ARMツールチェーンのインストールディレクトリ>/bin/aarch64-linux-gnu-"
 
 cmake -G Ninja \
 <Qt 6のソースコードがあるディレクトリ>       \
 -DCMAKE_BUILD_TYPE=Release          \
 -DINPUT_opengl=es2                  \
 -DQT_FEATURE_opengles2=ON           \
 -DQT_FEATURE_opengles3=ON           \
 -DQT_QPA_DEFAULT_PLATFORM=wayland   \
 -DCMAKE_TOOLCHAIN_FILE=<CMakeデバイスファイルのパス>           \
 -DQT_BUILD_TOOLS_WHEN_CROSSCOMPILING=ON                  \
 -DQT_QMAKE_TARGET_MKSPEC=devices/linux-pinephone-g++     \
 -DQT_QMAKE_DEVICE_OPTIONS=CROSS_COMPILE=$CROSS_COMPILER  \
 -DQT_BUILD_EXAMPLES=OFF  \
 -DQT_BUILD_TESTS=OFF     \
 -DBUILD_qtdoc=OFF        \  # QtDocをインストールしない場合
 -DBUILD_qtwebengine=OFF  \  # QtWebEngineをインストールしない場合
 -DBUILD_qtwebview=OFF    \  # QtWebViewをインストールしない場合
 -DBUILD_qtwebchannel=OFF \  # QtWebChannelをインストールしない場合
 -DFEATURE_clang=ON       \  # QtDocをインストールする場合
 -DFEATURE_clangcpp=ON    \  # QtDocをインストールする場合
 -DCMAKE_SYSROOT=$SYSROOT \
 -DQT_HOST_PATH=<x86 64向けQt 6のパスのトップディレクトリ  例: /home/user/Qt/6.x.x/gcc_64>                       \
 -DQT_HOST_PATH_CMAKE_DIR=/<x86 64向けQt 6のパスのcmakeディレクトリ  例: /home/user/Qt/6.x.x/gcc_64/lib/cmake> \
 -DCMAKE_STAGING_PREFIX=<PinePhone向けQt 6ライブラリを配置するディレクトリ>                                        \
 -DCMAKE_INSTALL_PREFIX=<Qtソフトウェアを配置するディレクトリ>                                                     \
 -DCMAKE_PREFIX_PATH=<PinePhone向けQt 6ライブラリを配置するディレクトリ>


Qt 6をクロスビルドおよびインストールする。
また、Ninjaのビルドエラーの出力は、後方で起きている可能性があるため、テキストファイル等に一時的に出力した方がよい。

cmake --build . --parallel $(nproc)  または  cmake --build . --parallel $(nproc) > compile.txt 2>&1
cmake --install .


GCC 13を使用してQt 6をビルドする場合、以下に示すようなエラーが出力される場合がある。
バグレポートURL : https://bugreports.qt.io/browse/QTBUG-111604?focusedCommentId=718489

# エラー出力 1
error: 'uint32_t' is not a member of 'std'; did you mean 'wint_t'?

# エラー出力 2
error: 'FeatureType' does not name a type; did you mean 'ToFeatureType'?


この時、以下に示すファイルを編集する。

 // qt-everywhere-src-6.x.x/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cppファイル
 // 53行目
 // 変更前
 #include <stdint.h>
 // 変更後
 #include <cstdint>
 
 
 // qt-everywhere-src-6.x.x/qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cppファイル
 // 53行目
 // 変更前
 #include <stdint.h>
 // 変更後
 #include <cstdint>
 
 
 // qt-everywhere-src-6.x.x/qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXTokenizer.cppファイル
 // 58行目
 // 変更前
 #include <stdint.h>
 // 変更後
 #include <cstdint>


Qt 6ライブラリのアップロード

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

まず、PinePhone向けQt 6ライブラリのインストールディレクトリに存在する全てのファイルを、PinePhoneの任意のディレクトリ(例. ~/InstallSoftware/Qt_6_x_xディレクトリ)に同期させる。

rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<PinePhone向けQt 6ライブラリのインストールディレクトリ> <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x


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

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


Qt Creatorの設定

Qt Creatorを起動して、キットの設定を行う。

  • QMakeの設定
    クロスコンパイルしたQt 6のインストールディレクトリに移動する。
    binディレクトリにあるhost-qmakeファイルのシンボリックファイル(ここでは、qmake-hostファイルとする)を作成する。
    ln -s host-qmake qmake-host

  • キットの作成
    [編集] - [設定]を選択して、[設定]画面を開く。
    [設定]画面左にある[キット] - [設定]画面右の[Qtバージョン]タブから[追加]ボタンを押下する。
    上記で作成したシンボリックファイルを選択する。

    [設定]画面左にある[キット] - [設定]画面右の[キット]タブから[追加]ボタンを押下する。
    [デバイスの種類]プルダウンから、[Remote Linux Device]を選択する。
    [デバイス]プルダウンから、[設定]画面左にある[デバイス]で作成したターゲットを選択する。
    [ビルドデバイス]プルダウンから、[ローカルPC]を選択する。
    [Sysroot]項目に、PinePhoneのシステムルートディレクトリのパスを入力する。
    [コンパイラ]項目の[C]プルダウンから、C向けのクロスコンパイラを選択する。
    [コンパイラ]項目の[C++]プルダウンから、C++向けのクロスコンパイラを選択する。
    [GDB]プルダウンから、クロスコンパイラ向けGDBを選択する。
    [Qtバージョン]プルダウンから、上記で設定した[Qtバージョン]を選択する。
    [Qt mkspec]項目から、/<クロスコンパイルしたQt 6のインストールディレクトリ>/mkspecs/devices/linux-pinephone-g++ファイルのパスを入力する。
    [CMake Tool]プルダウンから、クロスコンパイルで使用したCMakeを選択する。

    [CMakeの設定]項目の[変更...]ボタンを押下して、
    -DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/<クロスコンパイルしたQt 6のインストールディレクトリ>/lib/cmake/Qt6/qt.toolchain.cmakeと入力する。
    [適用]ボタンを押下する。
    Install Q6 PP 1.png
    Install Q6 PP 2.png

    ただし、この設定は、Qt Creatorの左サイド画面にある[プロジェクト] - [キット名] - [ビルド]を選択して、
    Qt Creatorメイン画面右ペインの[ビルド設定]にあるCMAKE_TOOLCHAIN_FILEの値を編集することにより、プロジェクトごとに設定することができる。
    Install Q6 PP 3.png


Qtプロジェクトの設定

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

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

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

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


また、上記の設定を簡潔に行う場合、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=qt6ct</value>
     <value type="QString">DISPLAY=:0</value>
     <value type="QString">PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games</value>
     <value type="QString">LD_LIBRARY_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/lib:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/plugins/qmltooling</value>
     <value type="QString">QML_IMPORT_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/qml</value>
     <value type="QString">QML2_IMPORT_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/qml</value>
     <value type="QString">QT_PLUGIN_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/plugins</value>
     <value type="QString">QT_QPA_PLATFORM_PLUGIN_PATH=/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x/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_6_x_x


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

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

# または

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


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


エラー関連

libdbusに関する問題

以下に示すようなlibdbusに関するコンパイルエラーが発生する場合がある。

# ...略

/<GCCクロスコンパイラのパス>/bin/ld: /<PinePhoneのシステムルート>/usr/lib/aarch64-linux-gnu/libdbus-1.a(libdbus_1_la-dbus-message.o):
relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `dbus_message_unref' which may bind externally can not be used when making a shared object; recompile with -fPIC

# ...略


これは、システムルート内にあるlibdbusが動的共有オブジェクトでない場合に発生する可能性がある。
これは通常、Mobian / Manjaro ARMの再インストールすることで解決できる。

別の方法としては、libdbus-1-devパッケージを再インストールすることである。
しかし、この問題が解決せず、D-Busが不要の場合は-DFEATURE_dbus=OFFオプションを付加することにより、D-Bus機能を無効にすることができる。

さらに別の方法として、set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")の行を、
set(QT_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -ldbus-1")に変更する。
この場合、/<PinePhoneのシステムルート>/usr/lib/aarch64-linux-gnu/libdbus-1.soへのリンクが有効であることを確認する。
(同階層のディレクトリのlibdbus-1.so.X.XX.XXにリンクされているはずである)

※注意
Bluetoothモジュールを動作させるにはD-Bus機能が必要である。

libstdc++のエラー

デバッグ時において、以下に示すようなエラーが出力される場合はある。

/Path/to/<Project Name>/bin/<Binary Name>: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.XX' not found (required by /Path/to/Qt6 Library/lib/libQt6Qml.so.6)


クロスコンパイラのlibstdc++.so.6ファイルにおいて、ターゲットとなるOSのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。
例えば、Debian 12 (Mobian 12)はGLIBCXX_3.4.30であるため、GCC 12.2ツールチェーン以前のものを使用する。

以下に示すコマンドを実行して、GLIBCXXのバージョンを確認することができる。

# クロスコンパイラ
strings /<クロスコンパイラのインストールディレクトリ>/<アーキテクチャ名  例: aarch64-linux-gnu>/lib64/libstdc++.so.6 | grep -E '^GLIBCXX'

# Manjaro
strings /usr/lib/libstdc++.so.6 | grep -E '^GLIBCXX'

# Mobian
strings /usr/lib/aarch64-linux-gnu/libstdc++.so.6 | grep -E '^GLIBCXX'


GDBデバッグ実行時におけるキャッシュファイルの警告

デバッグ実行時において、以下に示すような警告が非常に多く出力される場合がある。

index cache: could not make cache directory: Permission denied


この警告は、デバッグ実行時のターゲットデバイスのディレクトリが存在しない場合、または、該当ディレクトリに書き込み権限が無い場合に出力される。

この警告を抑制する場合は、以下に示す設定を行う。

  1. Qt Creatorの[編集]メニューバー - [Preferences...]を選択する。
  2. [設定]ダイアログが開くので、画面左ペインにある[デバッガ] - 画面右ペインにある[GDB]タブ - [追加の起動コマンド]に、以下に示す設定を入力する。
    set index-cache directory /tmp/GDB


この設定により、/tmp/GDBディレクトリにデバッグ関連のログファイルが出力されるようになる。