インストール - Qt5

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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

Qt 5.15 LTSのサポート期間は、Qtレガシーライセンスは2023年5月26日まで、Qtサブスクリプションライセンスは2025年5月26日までである。

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

参考書
71ZdxoixPvL._SL1500_.jpg
Mastering Qt 5
C++, Qt Widgets, QMLを使用したクロスプラットフォームアプリケーションの作成
91V16o+L03L._SL1500_.jpg
Hands-On Mobile and Embedded Development with Qt 5
C++/QtでAndroid, iOS, Raspberry Pi用のアプリケーションを作成
717s6aji8ZL._SL1360_.jpg
Qt5 C++ GUI Programming Cookbook
Qt5でクロスプラットフォームのアプリケーションの作成



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の依存関係のライブラリをインストールする。
これらのライブラリは不要な可能性がある。(調査中)

# RHEL
sudo dnf install mesa-libOSMesa-devel

# SUSE
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、付随するライブラリをインストールする。

# RHEL
sudo dnf 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でクロスコンパイルを行う場合、インストール - Qt5 Raspberry Piのページを参照すること。


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ツールチェーンをダウンロードする。


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


tar xf gcc-linaro-<バージョン>-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 pkgconf-bin pkg-config libpkgconf3 pkgconf build-essential make autoconf cmake extra-cmake-modules 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 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-ust1 liblttng-ust-common1 liblttng-ust-dev libb2-1 libb2-dev libsdl2-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 \
                      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

# 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 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
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 (推奨)
    Qtの公式Webサイトにアクセスして、Qt 5.15のソースコードをダウンロードする。
    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


GCC 13を使用する場合の注意点

GCC 13を使用する場合、QtLocationのビルドにおいて、以下に示すようなビルドエラーが出力される場合がある。

error: 'uint8_t' was not declared in this scope


これは、GCC 13では、いくつかの内部インクルードをシャッフルしているため、<cstdint>は過渡的にインクルードされない。
uint8_tには<cstdint>を明示的にインクルードする必要がある。

 // qt-everywhere-src-5.15.XX/qtlocation/src/3rdparty/mapbox-gl-native/include/mbgl/util/string.hppファイル
 // 7行目
 #include <cstdint>  // 追加
 
 
 // qt-everywhere-src-5.15.XX/qtlocation/src/3rdparty/mapbox-gl-native/include/mbgl/util/geometry.hppファイル
 // 6行目
 #include <cstdint>  // 追加
 
 
 // qt-everywhere-src-5.15.XX/qtlocation/src/3rdparty/mapbox-gl-native/src/mbgl/gl/stencil_mode.hppファイル
 // 4行目
 #include <cstdint>  // 追加



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]に反転させる。