「インストール - Qt6」の版間の差分

ナビゲーションに移動 検索に移動
1,243行目: 1,243行目:
<br><br>
<br><br>


== PinePhone ==
== PinePhoneのクロスコンパイル ==
==== 概要 ====
PinePhoneでクロスコンパイルを行う場合、[[インストール_-_Qt6_PinePhone]]のページを参照すること。<br>
Allwinner A64 SoC(sun50iw1)は、Cortex-A53 ARM CPU(クアッドコア)とARM社のMali400 MP2 GPUを搭載している。<br>
<br>
A64は、基本的にAllwinner H3のCortex-A7コアをCortex-A53コアに置き換えたものである。<br>
メモリマップ、クロック、割り込みのほとんどを共有しており、IPブロックも同じものを使用している。<br>
<br>
H3とA64の違いは以下の通りである。<br>
<br>
H3は、USBホストコントローラを3つ搭載しているのに対して、A64は1つしか搭載していない。<br>
どちらのSoCもUSB-OTGコントローラを追加しているが、これは通常のホストコントローラとしても使用することを想定している。<br>
<br>
H3のDRAMコントローラは最大2[GB]のRAMをサポートしており、A64は最大3[GB]をサポートしている。<br>
64bitチップでありながら、物理的には完全に3bitのSoCとなっている。<br>
<br>
H3は5個のUARTをサポートしており、A64は6個のUARTをサポートしている。<br>
MMCコントローラーが更新され、より高速な転送モードをサポートしている。<br>
MMCのクロックは途中で変更され、現在はMMCコントローラ自身が出力とサンプルフェーズをサポートしている。<br>
<br>
H3はSRAM A1がアドレス0にマッピングされており、BROMは0xffff0000にある。<br>
A64はBROMがアドレス0にマッピングされており、SRAM A1はそのすぐ後ろの0x10000(64KB)にマッピングされている。<br>
<br>
pinmuxの構成はまだ多少似ているが、互換性のない程度に異なる。<br>
顕著な例は(デバッグ用の)UART0で、H3ではPortAにあるが、A64ではPortBにある。<br>
H3にはPortBが無い。<br>
<br>
==== Linux PCの設定 ====
Linux PCにおいて、以下の依存関係のライブラリをインストールする。<br>
(Texinfoは、GNU公式Webサイトにアクセスして、ソースコードからインストールすることを推奨する)<br>
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
                    libicu-devel libopus-devel openjpeg2-devel pciutils-devel libpciaccess-devel libxshmfence-devel python3-html5lib \  # QtWebEngineをインストールする場合
                    libvpx-devel                                                                                                        # QtWebEngineをインストールする場合
                    ffmpeg-4-libavcodec-devel ffmpeg-4-libavdevice-devel ffmpeg-4-libavfilter-devel ffmpeg-4-libavformat-devel      \  # QtWebEngineをインストールする場合 (デフォルトパッケージ)
                    ffmpeg-4-libavresample-devel ffmpeg-4-libavutil-devel ffmpeg-4-libpostproc-devel ffmpeg-4-libswresample-devel    \  # QtWebEngineをインストールする場合 (デフォルトパッケージ)
                    ffmpeg-4-libswscale-devel ffmpeg-4-private-devel                                                                    # QtWebEngineをインストールする場合 (デフォルトパッケージ)
                    ffmpeg-6-libavcodec-devel ffmpeg-6-libavdevice-devel ffmpeg-6-libavfilter-devel ffmpeg-6-libavformat-devel      \  # QtWebEngineをインストールする場合 (Packmanパッケージ)
                    ffmpeg-6-libavresample-devel ffmpeg-6-libavutil-devel ffmpeg-6-libpostproc-devel ffmpeg-6-libswresample-devel    \  # QtWebEngineをインストールする場合 (Packmanパッケージ)
                    ffmpeg-6-libswscale-devel ffmpeg-6-private-devel                                                                    # QtWebEngineをインストールする場合 (Packmanパッケージ)
<br>
<u>GCC ARMツールチェーンにおいて、GCC 8以降が必要である</u><br>
Linaroは、アップストリームビルドのスナップショットをユーザに提供するGNUツールチェーン・インテグレーションビルドを毎月提供している。<Br>
これらのビルドにより、開発者はビルド済みバイナリの機能をアップストリームですぐにテストすることができる。<br>
<br>
Linero社が提供しているGCC ARMツールチェーンをダウンロードする。<br>
<br>
<u>※注意</u><br>
<u>クロスコンパイラのlibstdc++.so.6ファイルにおいて、PinePhone OSのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。</u><br>
<u>例えば、Mobian 12.0のlibstdc++.so.6ファイルはGLIBCXX_3.4.30までであるため、GCC 12.2ツールチェーン、または、それ以前のものを使用する。</u><br>
<br>
GCCツールチェーン群 : https://snapshots.linaro.org/gnu-toolchain/
tar xf gcc-linaro-<バージョン>-x86_64_aarch64-linux-gnu.tar.xz
<br>
また、開発者がGCC ARMツールチェーンを作成する場合、[[インストール - GCC#クロスコンパイラ向けGCCツールチェーンのインストール]]を参照すること。<br>
<br>
Qt 6を使用してクロスコンパイルする場合、x86 64向けのQtライブラリも必要となる。<br>
そのため、Qtオンラインインストーラからx86 64向けのQtライブラリをインストールする。<br>
<br>
<u>(Qt 6のソースコードからx86 64向けのQt 6ライブラリをビルドおよびインストールしてもよいが、煩雑なため推奨しない)</u><br>
<br>
wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
<br>
ダウンロードしたファイルに実行権限を付加する。<br>
chmod +x qt-unified-linux-x64-online.run
<br>
次に、GCCおよびmake等の開発に付随するライブラリをインストールする。<br>
# RHEL
sudo dnf groupinstall "Development tools"
# SUSE
sudo zypper install --type pattern devel_basis
<br>
Qtオンラインインストーラを実行する。<br>
./qt-unified-linux-x64-online.run
<br>
Qtのインストール画面に従って、Qt 6をインストールする。<br>
<br>
 
==== PinePhoneの設定 ====
Qtのクロスコンパイルの手順において、SSH接続ができることが必須のため、SSH Serverをインストールおよび設定する。<br>
# Mobian
sudo apt-get install openssh-server
# Manjaro
sudo pacman -S openssh
<br>
必要に応じて、公開鍵認証を行う場合は、[[設定 - SSHの公開鍵認証|設定 - SSHの公開鍵認証]]を参照すること。<br>
<br>
SSH Serverの自動起動設定および開始する。<br>
sudo systemctl enable ssh
sudo systemctl restart ssh
<br>
MobianまたはManjaroをアップデートする。<br>
# Mobian
sudo apt-get update
sudo apt-get dist-upgrade
sudo systemctl reboot
# Manajro
sudo pacman -Syyu
sudo systemctl reboot
<br>
不要なライブラリをアンインストールする。<br>
<u>Qt6 D-Busがインストールされている場合、Qt SharedToolsライブラリのクロスコンパイルがエラーになることに注意する。</u>
sudo pacman -R --needed qt6-base
<br>
Qtライブラリをクロスコンパイルするために必要なライブラリをインストールする。<br>
Qtライブラリのビルド設定によっては、不要なパッケージも含まれている。<br>
# 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 libdbus-glib-1-dev-bin libsctp1 libsctp-dev \
                      libatspi2.0-0 libatspi2.0-dev at-spi2-core gir1.2-atspi-2.0 libatk1.0-dev libatkmm-1.6-dev libatk-bridge2.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 clang-tools clang-format              \  # QDoc, Clangベースのlupdateパーサーを使用する場合はインストールする
                      llvm-dev llvm-runtime                                                \  # 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 gconfmm \
                        libwacom assimp fontconfig dbus dbus-c++ nss libxkbcommon xcb-util-cursor libxinerama xorg-xinput xcb-util-xrm alsa-lib \
                        pugixml libxslt openssl libproxy libb2 lttng-ust libglvnd systemd double-conversion \
                        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
<br>
Manjaroにおいて、マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。<br>
Mobianの場合、[[インストール - Qt6#Raspberry Piの設定|上記のセクションにあるRaspberry Piの表]]も参照すること。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|+ Mobian向け その他のライブラリ(オプション)
|-
! style="background-color:#66CCFF;" | 機能
! style="background-color:#66CCFF;" | インストールするライブラリ
! style="background-color:#66CCFF;" | 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<br>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<br>gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad<br>libgstreamer-plugins-bad1.0-dev gstreamer1.0-libav gstreamer1.0-pulseaudio gstreamer1.0-tools<br>gstreamer1.0-alsa gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5<br>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)<br>libsqlite3-dev (SQLite)<br>libpq-dev(PostgreSQL)<br>libmariadbclient-dev(MariaDB / MySQL) ||
|-
| プリンタ || libcups2-dev ||
|-
| Wayland || libwayland-dev ||
|-
| X11 || libfontconfig-dev libfontconfig1-dev libfreetype6-dev<br>libx11-dev libx11-xcb-dev libsm-dev libice-dev<br>libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev<br>libxfixes-dev libxrender-dev libxdamage-dev libxkbfile-dev<br>libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev  libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev<br>libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util0-dev<br> libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libxcb-damage0-dev<br>libxcb-composite0-dev libxcb-record0-dev libxcb-present-dev libxcb-res0-dev libxcb-render0-dev<br>libxcb-xinput-dev libxcb-xv0-dev libxcb-xtest0-dev libxcb-cursor-dev libxcb-util-dev libxcb-ewmh-dev libxcb-xvmc0-dev<br>libxcb-imdkit-dev<br>libxcb-xrm-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-dpms0-dev libxcb-xf86dri0-dev ||
|-
| WebEngine || 必須 :<br>flex bison gperf libre2-dev libnss3-dev libopenjp2-7-dev libdrm-dev libxshmfence-dev python3-html5lib<br><br>オプション1 :<br>libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev<br>libpci-dev libpciaccess-dev libevent-dev libev-dev libev-libevent-dev libevhtp-dev libuev-dev libuv1-dev<br>libprotobuf-dev protobuf-compiler<br><br>オプション2(不安定なため注意すること) :<br>libopus-dev libvpx-dev ||
|-
| アクセシビリティ || libatspi2.0-dev ||
|-
| SCTP || libsctp1 libsctp-dev || -sctp
|}
</center>
<br>
<center>
{| class="wikitable" | style="background-color:#fefefe;"
|+ Manjaro向け その他のライブラリ(オプション)
|-
! style="background-color:#66CCFF;" | 機能
! style="background-color:#66CCFF;" | インストールするライブラリ
! style="background-color:#66CCFF;" | configureスクリプトのオプション
|-
| Bluetooth || bluez bluez-tools bluez-libs bluez-utils ||
|-
| 画像 || openjpeg2 libjpeg-turbo libpng libtiff libmng libwebp ||
|-
| マルチメディア || libwmf<br>gstreamer gstreamermm gst-plugins-base gst-plugins-base-libs gst-plugins-good<br>gst-plugins-bad gst-plugins-bad-libs<br>gst-plugins-ugly gst-libav gst-plugin-wpe gst-plugin-pipewire gst-plugin-gtk<br>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)<br>mariadb-clients mariadb-libs (MariaDB)
unixodbc libiodbc (ODBC)<br>sqlite (SQLite)
|
|-
| プリンタ || libcups ||
|-
| Wayland (X11) || xorg-xwayland ||
|-
| X11 ||  ||
|-
| WebEngine || 必須 :<br>flex bison gperf readline nss libdrm<br><br>オプション1 :<br>libxml2 libxml++ libxslt minizip jsoncpp lcms2 libevent protobuf protobuf-c<br><br>オプション2(不安定なため注意すること) :<br>opus libvpx ||
|-
| アクセシビリティ || at-spi2-core at-spi2-atk ||
|-
| SCTP || lksctp-tools || -sctp
|}
</center>
<br>
* 上表のライブラリを全てインストールする場合
*: <code>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 \</code>
*: <code>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 \</code>
*: <code>pulseaudio-alsa openal flite libserialport sensorfw unixodbc sqlite libcups xorg-xwayland flex bison gperf readline nss libdrm libxml2 libxml++ libxslt minizip jsoncpp \</code>
*: <code>lcms2 libevent protobuf protobuf-c opus libvpx at-spi2-core at-spi2-atk lksctp-tools</code>
<br>
次のセクションにおいて、rsyncコマンドを使用してLinux PCとPinePhoneのファイルを同期する。<br>
しかし、同期するファイルには、スーパユーザ権限が必要なものがある。<br>
<br>
そのため、一般ユーザでも全てのファイルを同期できるように、/etc/sudoersファイルに以下の設定を追記する。<br>
以下の設定により、rsyncコマンドは、必要に応じてスーパユーザ権限で実行される。<br>
echo "$USER ALL=NOPASSWD:$(which rsync)" | sudo tee --append /etc/sudoers
<br>
 
==== システムルートディレクトリの設定 ====
Linux PCで、PinePhone向けのQtソフトウェアをクロスコンパイルできるように開発環境を設定する。<br>
PinePhone上でネイティブにコンパイルすることもできるが、Linux PCの方がスループットが良い。<br>
<br>
Linux PC上に開発用ディレクトリを作成する。<br>
また、PinePhoneのいくつかのルートディレクトリと同期する必要があるため、システムルートディレクトリも作成する。<br>
mkdir -p ~/Program/Qt_Embedded/sysroot \
          ~/Program/Qt_Embedded/sysroot/usr \
          ~/Program/Qt_Embedded/sysroot/usr/share
<br>
<code>rsync</code>コマンドを使用して、Raspberry Piに存在するいくつかのディレクトリから、ファイルをダウンロードする。<br>
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
<br>
==== Qtのソースコードのダウンロード ====
* Qt Everywhere (推奨)
*: [https://download.qt.io/official%20releases/qt/ Qtの公式Webサイト]にアクセスして、Qt 6のソースコードをダウンロードする。
*: <code>wget https://download.qt.io/official_releases/qt/6.x/6.x.x/single/qt-everywhere-src-6.x.x.tar.xz</code>
*: <code>tar xf qt-everywhere-opensource-src-6.x.x.tar.gz</code>
*: <br>
* Githubの使用
*: GithubからQt 6のソースコードを個別にダウンロードする。<br>
*: <code>git clone https://github.com/qt/qt5.git qt6</code>
*: <br>
*: ダウンロードしたスーパーリポジトリに移動する。<br>
*: <code>cd qt6</code>
*: <code>git checkout <Qtのバージョン></code>
*: または
*: <code>git checkout <Qtのショートバージョン></code>
*: <br>
*: <code>init-repository</code>コマンドは、Qtが提供する指定したモジュールのソースコードを取得するためのツールである。<br>
*: スーパーリポジトリは小さく、全てのモジュール(ライブラリ)はgit submodulesとして保持されている。<br>
*: <br>
*: 利用可能な全てのモジュールについては[https://doc.qt.io/qt-5/qtmodules.html こちらのWebサイト]、ツールについては<code>init-repository --help</code>コマンドまたは[https://github.com/qt/qt5/blob/dev/init-repository こちらのWebサイト]を参照すること。<br>
*: <code>./init-repository --module-subset=essential,qtsvg,qtvirtualkeyboard,qtquickcontrols</code>
*: <code>./init-repository -f --module-subset=qtquick3d,qtquicktimeline,qtwayland</code>  # 必要な場合は個別に追加ダウンロードする
<br>
 
==== Qtの設定 ====
Qtのソースコードがあるディレクトリにおいて、qtbase/mkspecs/devices/linux-pinephone-g++ディレクトリを作成する。<br>
mkdir <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++
<br>
次に、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.hファイルを以下の内容で作成する。<br>
vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qplatformdefs.h
<br>
<syntaxhighlight lang="c++">
// qplatformdefs.hファイル
#include "../../linux-g++/qplatformdefs.h"
</syntaxhighlight>
<br>
さらに、<Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.confファイルを以下の内容で作成する。<br>
vi <Qtのソースコードがあるディレクトリ>/qtbase/mkspecs/devices/linux-pinephone-g++/qmake.conf
<br>
# 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)
<br>
==== Qtのビルド ====
===== CMakeツールチェーンファイルの作成 =====
ターゲット向けQt 6ライブラリのビルドで使用するCMakeツールチェーンファイルを作成する。<br>
vi ToolChain_for_PinePhone.cmake
<br>
<syntaxhighlight lang="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)
</syntaxhighlight>
<br>
<syntaxhighlight lang="cmake">
# 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)
</syntaxhighlight>
<br>
 
===== Qtのビルド =====
Qt 6をクロスビルドするため、クロスビルド向けディレクトリを作成する。<br>
mkdir build && cd build
<br>
Qt 6のクロスビルド向けの設定を行う。<br>
<syntaxhighlight lang="sh">
# 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
</syntaxhighlight>
<br>
<syntaxhighlight lang="sh">
# 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ライブラリを配置するディレクトリ>
</syntaxhighlight>
<br>
Qt 6をクロスビルドおよびインストールする。<br>
また、Ninjaのビルドエラーの出力は、後方で起きている可能性があるため、テキストファイル等に一時的に出力した方がよい。<br>
cmake --build . --parallel $(nproc)  または  cmake --build . --parallel $(nproc) > compile.txt 2>&1
cmake --install .
<br>
===== ビルドエラー関連 : GCC 13を使用する場合 =====
GCC 13を使用してQt 6をビルドする場合、以下に示すようなエラーが出力される場合がある。<br>
バグレポートURL : https://bugreports.qt.io/browse/QTBUG-111604?focusedCommentId=718489<br>
# エラー出力 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'?
<br>
この時、以下に示すファイルを編集する。<br>
<syntaxhighlight lang="c++">
// 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>
</syntaxhighlight>
<br>
===== ビルドエラー関連 : X Keyboardに関するエラー =====
コンパイル時において、以下に示すようなエラーが出力される場合がある。<br>
error: XKB_KEY_dead_lowline was not declared in this scope; did you mean XKB_KEY_dead_belowring?
または
error: 'XKB_KEY_dead_lowline' was not declared in this scope; did you mean 'XKB_KEY_dead_belowring'?
<br>
この時、<code>cmake</code>コマンドの実行時において、<code>-DFEATURE_xkbcommon=OFF</code>オプションを付加する。<br>
<br>
 
===== ビルドエラー関連 : Qt Toolのqhelpgeneratorに関するエラー =====
<code>cmake</code>コマンドの実行時において、以下に示すようなエラーが出力される場合がある。<br>
-- Configuring submodule 'qttools'
CMake Error at qttools/src/assistant/qhelpgenerator/CMakeLists.txt:66 (add_dependencies):
  Cannot add target-level dependencies to non-existent target
  "qhelpgenerator".
The add_dependencies works for top-level logical targets created by the
add_executable, add_library, or add_custom_target commands.  If you want to
add file-level dependencies see the DEPENDS option of the add_custom_target
and add_custom_command commands.
<br>
この時、以下に示すファイルを編集する。<br>
vi /<Qt 6のソースコードがあるディレクトリ>/qttools/src/assistant/qhelpgenerator/CMakeLists.txt
<br>
<syntaxhighlight lang="cmake">
# /<Qt 6のソースコードがあるディレクトリ>/qttools/src/assistant/qhelpgenerator/CMakeLists.txtファイル 66行目
# 編集前
add_dependencies(qhelpgenerator ${needed_plugins})
# 編集後
#add_dependencies(qhelpgenerator ${needed_plugins})
</syntaxhighlight>
<br>
===== ビルドエラー関連 : Qt Toolのqhelpgeneratorに関するエラー =====
ビルド時において、以下に示すようなエラーが出力される場合がある。<br>
error: 'google::protobuf::FileDescriptor::Syntax google::protobuf::FileDescriptor::syntax() const'
<br>
この時、以下に示す<code>cmake</code>コマンドのオプションを付加する。<br>
cmake -G Ninja \
# ...略
-DBUILD_qtgrpc
# ...略
<br>
 
===== Qt 6ライブラリのアップロード =====
クロスビルドしたQtライブラリを、PinePhoneにデプロイする。<br>
<br>
まず、PinePhone向けQt 6ライブラリのインストールディレクトリに存在する全てのファイルを、PinePhoneの任意のディレクトリ(例. ~/InstallSoftware/Qt_6_x_xディレクトリ)に同期させる。<br>
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
<PinePhone向けQt 6ライブラリのインストールディレクトリ> <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_6_x_x
<br>
<u>※注意</u><br>
<u>PinePhoneにアップロードしたQtライブラリの所有者がrootになっている場合があるため、</u><br>
<u>以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。</u><br>
sudo chown -R <ユーザ名>:<グループ名> ~/InstallSoftware/Qt_6_x_x
<br>
 
==== Qt Creatorの設定 ====
Qt Creatorを起動して、キットの設定を行う。<br>
<br>
* QMakeの設定
*: クロスコンパイルしたQt 6のインストールディレクトリに移動する。
*: binディレクトリにあるhost-qmakeファイルのシンボリックファイル(ここでは、qmake-hostファイルとする)を作成する。
*: <code>ln -s host-qmake qmake-host</code>
*: <br>
* キットの作成
*: [編集] - [設定]を選択して、[設定]画面を開く。
*: [設定]画面左にある[キット] - [設定]画面右の[Qtバージョン]タブから[追加]ボタンを押下する。
*: 上記で作成したシンボリックファイルを選択する。
*: <br>
*: [設定]画面左にある[キット] - [設定]画面右の[キット]タブから[追加]ボタンを押下する。
*: [デバイスの種類]プルダウンから、[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を選択する。
*: <br>
*: [CMakeの設定]項目の[変更...]ボタンを押下して、
*: <code>-DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/<クロスコンパイルしたQt 6のインストールディレクトリ>/lib/cmake/Qt6/qt.toolchain.cmake</code>と入力する。
*: [適用]ボタンを押下する。
*: [[ファイル:Install Q6 PP 1.png|フレームなし|中央]]
*: [[ファイル:Install Q6 PP 2.png|フレームなし|中央]]
*: <br>
*: <u>ただし、この設定は、Qt Creatorの左サイド画面にある[プロジェクト] - [キット名] - [ビルド]を選択して、</u>
*: <u>Qt Creatorメイン画面右ペインの[ビルド設定]にある<code>CMAKE_TOOLCHAIN_FILE</code>の値を編集することにより、プロジェクトごとに設定することができる。</u>
*: [[ファイル:Install Q6 PP 3.png|フレームなし|中央]]
<br>
==== Qtプロジェクトの設定 ====
次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。<br>
<br>
まず、プロジェクトの環境変数の設定を行う。<br>
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。<br>
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。<br>
<br>
<u>Qtプロジェクトをデバッグする場合は、必ず[デバイス環境の取得]ボタンを押下すること。</u><br>
* 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
<br>
また、上記の設定を簡潔に行う場合、Qtプロジェクトのディレクトリにある.pro.userファイルにおいて、<br>
<code><valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">〜</valuemap></code>要素内に、以下の設定を追記する。<br>
<u>以下の設定を追記する場合、必ず、Qtプロジェクトを閉じた状態で行うこと。</u><br>
<syntaxhighlight lang="xml">
# .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>
</syntaxhighlight>
<br>
もし、デバッグにおいて、以下のようなエラーが出力される場合は、<br>
Qt Creatorのサイドメニューから、[プロジェクト] - [Build & Run] - [Run] - [コマンドライン引数:]項目に、<code>-platform wayland</code>を記述する。<br>
# エラー内容
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"
<br>
 
<br>
次に、GDBデバッガの設定を行う。<br>
リモートターゲットをデバッグする時、GDBは、Linux PC側にダウンロードしているPinePhoneのシステムルートディレクトリを検索する。<br>
そのため、GDBにターゲット側のPinePhoneのシステムルートディレクトリを検索するように設定する必要がある。<br>
<br>
これは、Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。<br>
<u>ただし、この設定はQt Quickを使用する時のみである。(Qt Widgetを使用する場合は設定不要)</u><br>
set sysroot target:/
<br>
しかし、上記の[追加の起動コマンド]において、<code>set sysroot target:/</code>オプションを使用する場合、デバッグの開始に時間が掛かる。<br>
そのため、以下のように、[追加の起動コマンド]を記述して、<br>
システムルートディレクトリに対して、Qtライブラリのインストールディレクトリのシンボリックリンクを作成することを推奨する。<br>
<br>
システムルートディレクトリに対して、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
<br>
Qt Creatorメイン画面から、[ツール]メニューバー - [オプション] - [デバッガ] - [GDB]タブ - [追加の起動コマンド]に、以下の内容を設定する。<br>
# Kit名に"PinePhone"という文字列が入っている場合のみ、PinePhoneのシステムルートディレクトリを参照する
# x86 / x64のKitを使用する場合は、PinePhoneのシステムルートディレクトリを参照しない
[ -n $(grep -i PinePhone %{ActiveProject:Kit:Name}) ] && set sysroot /<PinePhoneのシステムルートディレクトリ>
# または
set sysroot /<PinePhoneのシステムルートディレクトリ>
<br>
これにより、PinePhoneでQtライブラリが使用できる。<br>
<br><br>
<br><br>


案内メニュー