475行目: 475行目:


== PinePhone ==
== PinePhone ==
==== 概要 ====
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
<br>
Linero社が提供しているGCC ARMツールチェーンをダウンロードする。<br>
* GCC 7.5 : https://releases.linaro.org/components/toolchain/binaries/
* GCC 10.2 : https://snapshots.linaro.org/components/toolchain/binaries/10.2-2021.01-3/aarch64-linux-gnu/
<br>
Linaroは、アップストリームビルドのスナップショットをユーザに提供するGNUツールチェーン・インテグレーションビルドを毎月提供している。<br>
これらのビルドにより、開発者はビルド済みバイナリの機能をアップストリームですぐにテストすることができる。<br>
* GCCツールチェーン群 : https://snapshots.linaro.org/gnu-toolchain/
<br>
tar xf gcc-linaro-<バージョン>-x86_64_aarch64-linux-gnu.tar.xz
<br>


==== '''Wayland-Scannerのインストール(重要)''' ====
Wayland-Scannerをインストールするには、MesonとNinjaをビルドする必要がある。<br>
<br>
まず、Wayland Scannerのビルドに必要なライブラリをインストールする。<br>
sudo zypper install libxml2-devel
<br>
次に、Wayland Scannerのソースコードをダウンロードする。<br>
git clone https://gitlab.freedesktop.org/wayland/wayland
cd wayland && mkdir build 
<br>
Wayland Scannerをビルドする。<br>
<u>Wayland Scannerのインストールディレクトリは、PinePhoneのホスト向けターゲットディレクトリを指定すること。</u><br>
meson ./build/ --prefix=<Wayland-Scannerのインストールディレクトリ> -Ddocumentation=false 
ninja -C build/ install
<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>
Qtライブラリをクロスコンパイルするために必要なライブラリをインストールする。<br>
Qtライブラリのビルド設定によっては、不要なパッケージも含まれている。<br>
# 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
<br>
MobianおよびManjaroにおいて、マルチメディア関連やBluetooth等を使用する場合、下表に示す任意のパッケージをインストールする。<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<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 libdrm-dev<br><br>オプション1 :<br>libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev<br>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 ||
|-
| マルチメディア || 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 (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>
* 上表のライブラリを全てインストールする場合
*: Mobianの場合
*: <code>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 \</code>
*: <code>libx264-dev libx265-dev \</code>
*: <code>libgstreamer1.0-dev libgstreamermm-1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev libopenal-dev libsndio-dev libwayland-dev \</code>
*: <code>unixodbc-dev libsqlite3-dev libcups2-dev \</code>
*: <code>libx11-dev libxcb1-dev libxext-dev libxi-dev libxcomposite-dev libxcursor-dev libxtst-dev libxrandr-dev libx11-xcb-dev libxext-dev \</code>
*: <code>libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev \</code>
*: <code>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 \</code>
*: <code>libxkbcommon-dev libxkbcommon-x11-dev \</code>
*: <code>flex bison gperf libre2-dev libnss3-dev libdrm-dev \</code>
*: <code>libxml2-dev libxslt1-dev libminizip-dev libjsoncpp-dev liblcms2-dev libevent-dev libprotobuf-dev protobuf-compiler libopus-dev libvpx-dev \</code>
*: <code>libatspi2.0-dev libsctp1 libsctp-dev</code>
*: <br>
*: Manjaro ARMの場合
*: <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>
ダウンロードしたシステムルートディレクトリにあるファイルおよびディレクトリのシンボリックリンクを相対的に調整する。<br>
fixQualifiedLibraryPathsが正常に動作しないため、提供されたスクリプトをダウンロードして実行する。<br>
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
<br>
==== Qtのソースコードのダウンロード ====
* Qt Everywhere (推奨)<br>
*: [https://download.qt.io/official%20releases/qt/5.15/ Qtの公式Webサイト]にアクセスして、Qt 5.15のソースコードをダウンロードする。
*: <code>wget https://download.qt.io/official_releases/qt/x.x/x.x.x/single/qt-everywhere-src-x.x.x.tar.xz</code>
*: <code>tar xf qt-everywhere-opensource-src-x.x.x.tar.gz</code>
*: <br>
* Githubの使用
*: GithubからQtのソースコードを個別にダウンロードする。<br>
*: <code>git clone https://github.com/qt/qt5.git</code>
*: <br>
*: ダウンロードしたスーパーリポジトリに移動する。<br>
*: <code>cd qt5</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のビルド ====
===== GCC 11以降を使用する場合 =====
GCC 11以降のツールチェーンを使用する場合、Qt 5.15のビルド時において、以下に示すエラーが発生する。<br>
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();
<br>
これは、std::limitsが削除されて、limits.hファイルに移行されたからである。<br>
もし、GCC 11以降を使用してQt 5.15をビルドする場合は、qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.hファイルを、以下に示すように編集する。<br>
vi qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.h
<br>
<syntaxhighlight lang="c++">
// 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
</syntaxhighlight>
<br>
===== GCC 13を使用する場合の注意点 =====
GCC 13を使用する場合、QtLocationのビルドにおいて、以下に示すようなビルドエラーが出力される場合がある。<br>
error: 'uint8_t' was not declared in this scope
<br>
これは、GCC 13では、いくつかの内部インクルードをシャッフルしているため、<code><cstdint></code>は過渡的にインクルードされない。<br>
<code>uint8_t</code>には<code><cstdint></code>を明示的にインクルードする必要がある。<br>
<br>
<syntaxhighlight lang="c++">
// 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>  // 追加
</syntaxhighlight>
<br>
<br>
===== Qtのビルド =====
Qtをビルドするため、ビルド用のディレクトリを作成する。<br>
mkdir /<Qtのソースコードがあるディレクトリ>/../build && cd /<Qtのソースコードがあるディレクトリ>/../build
<br>
Configureスクリプトを実行する。<br>
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
<br>
Qtをビルドおよびインストールする。<br>
gmake -j $(nproc)
gmake install
<br>
===== Qt Waylandのビルド =====
まず、Qt Waylandのソースコードのディレクトリ(/<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner)に対して、<br>
wayland-text-input-unstable-v2-client-protocolファイル、wayland-text-input-unstable-v2-server-protocol.hファイル、wayland-wayland-client-protocol.hファイルを作成する。<br>
<br>
<u>なお、wayland-text-input-unstable-v2-client-protocolファイルとwayland-text-input-unstable-v2-server-protocol.hファイルは、空のファイルである。</u><br>
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
<br>
vi /<Qtのソースコードがあるディレクトリ>/qtwayland/config.tests/wayland_scanner/wayland-wayland-client-protocol.h
<br>
<syntaxhighlight lang="c++">
// wayland-wayland-client-protocol.hファイル
#include "../../../../../src/client/wayland-wayland-client-protocol.h"
</syntaxhighlight>
<br>
次に、Wayland Scannerをインストールする。<br>
なお、Wayland Scannerのビルドには、Meson(Pythonライブラリ)とNinjaが必要である。<br>
# Wayland Scannerのビルドに必要なライブラリをインストールする。
#: <code>sudo zypper install meson ninja expat-devel libxml2-devel</code>
#: <br>
# Wayland Scannerのソースコードをダウンロードする。<br>
#: <code>git clone https://github.com/wayland-project/wayland.git</code>
#: <code>cd wayland && mkdir build</code>
#: <br>
# Wayland Scannerのビルドおよびインストールする。
#: <code>meson ./build --prefix=<上記でインストールしたQtツールのインストールディレクトリ> -Ddocumentation=false</code>
#: <code>ninja -C ./build install</code>
<br>
最後に、Qt Waylandをビルドおよびインストールする。<br>
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
<br>
===== Qt SVGのビルド =====
もし、Qt SVGをビルドおよびインストールしていない場合は、手動で行う。<br>
<u>なお、Qt SVGをインストールするには、上記でインストールしたQtツール(Linux PC向け)のディレクトリにあるqmakeファイルを使用する必要がある。</u><br>
<br>
まず、Qt SVGのソースコードが存在するディレクトリに移動して、ビルド用ディレクトリを作成する。<br>
cd /<Qtのソースコードがあるディレクトリ>/qtsvg
mkdir build && cd build
<br>
Qt SVGをビルドおよびインストールする。<br>
<u>なお、Qt SVGのインストールディレクトリは、自動的にQtライブラリ(ターゲット向け)のディレクトリにインストールされる。</u><br>
<u>そのため、<code>DESTDIR</code>オプション等は付加しない。(付加しても無視される)</u>
/<上記でインストールしたLinux PC向けのQtツールのディレクトリ>/Host/bin/qmake ../qtsvg.pro
make -j $(nproc)
make install
<br>
<br>
===== Qt Virtual Keyboardのビルド =====
もし、Qt Virtual Keyboardをビルドおよびインストールしていない場合は、手動で行う。<br>
この時、Qt Virtual Keyboardがインストールされているディレクトリを環境変数<code>LD_LIBRARY_PATH</code>に追加する必要がある。<br>
<br>
<u>なお、Qt Virtual Keyboardをインストールするには、上記でインストールしたQtツール(Linux PC向け)のディレクトリにあるqmakeファイルを使用する必要がある。</u><br>
<br>
まず、Qt Virtual Keyboardのソースコードが存在するディレクトリに移動して、ビルド用ディレクトリを作成する。<br>
cd /<Qtのソースコードがあるディレクトリ>/qtvirtualkeyboard
mkdir build && cd build
<br>
Qt Virtual Keyboardをビルドおよびインストールする。<br>
<u>なお、Qt Virtual Keyboardのインストールディレクトリは、自動的にQtライブラリ(ターゲット向け)のディレクトリにインストールされる。</u><br>
<u>そのため、<code>DESTDIR</code>オプション等は付加しない。(付加しても無視される)</u>
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
<br>
==== Qtライブラリのインストール ====
ビルドしたQtライブラリを、PinePhoneにデプロイする。<br>
<br>
まず、~/Program/Qt_Embedded/Qt5ディレクトリに存在する全てのファイルを、PinePhoneの任意のディレクトリ(例. ~/InstallSoftware/Qt_5_x_xディレクトリ)に同期させる。<br>
rsync -avz --rsh="ssh -p <ポート番号> -i <秘密鍵のフルパス>" \
~/Program/Qt_Embedded/Target <PinePhoneのユーザ名>@<PinePhoneのホスト名またはIPアドレス>:/home/<PinePhoneのユーザ名>/InstallSoftware/Qt_5_x_x
<br>
<u>※注意</u><br>
<u>PinePhoneにアップロードしたQtライブラリの所有者がrootになっている場合があるため、</u><br>
<u>以下のコマンドを実行して、所有者をローカルユーザに変更する必要がある。</u><br>
sudo chown -R <ユーザ名>:<グループ名> ~/InstallSoftware/Qt_5_x_x
<br>
PinePhoneのリンカがQtライブラリを読み込むようにするため、以下のコマンドを実行する。<br>
/etc/ld.so.conf.dディレクトリに配置する場合、ファイル名の先頭に"<code>00</code>"を付加すること。<br>
<br>
<u>※注意</u><br>
<u>~/.profileファイルに環境変数<code>LD_LIBRARY_PATH</code>を設定する場合、再度、Qt Creatorで環境変数<code>LD_LIBRARY_PATH</code>を設定する必要がある。</u><br>
<u>Qt Creatorでの設定は、Qt Creatorメイン画面左にある[プロジェクト] - [RUN] - [Environment]で設定する。</u><br>
# .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
<br>
ライブラリを読み込む。<br>
# .profileファイルに設定した場合
source ~/.profile
# /etc/ld.so.conf.d/00-Qt_5_x_x.confファイルに設定した場合
sudo ldconfig
<br>
==== Qtライブラリの設定 ====
さらに、PinePhoneの~/.profileファイルまたは~/.bashrcファイルに、以下の設定を追記する。<br>
# 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
<br>
==== Qt Creatorの設定 ====
次に、Qt Creatorでソフトウェアを開発する時の環境設定を行う。<br>
<br>
まず、プロジェクトの環境変数の設定を行う。<br>
Qt Creatorを起動して、Qt Creatorメイン画面左の[プロジェクト] - 左ペインの[Run] - 右ペインの[ビルド設定] - [Environment]項目 - [詳細]プルダウンを開く。<br>
[詳細]プルダウンから[追加]ボタンを押下して、以下の項目を設定する。<br>
<br>
<u>Qtプロジェクトをデバッグする場合は、必ず[デバイス環境の取得]ボタンを押下すること。</u><br>
* 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
* <del>Variable - XAUTHORITY</del>(不要)
*: <del>Value - /home/<PinePhoneのユーザ名>/.Xauthrity</del>
* <del>Variable - XDG_SESSION_TYPE(不要)</del>
*: <del>Value - wayland</del>
<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=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>
</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_5_15_2
<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>
もし、デバッグ時において、以下の警告が出力される場合は、GDBのみをGCC AArch64 ToolChain 10.2に変更する。<br>
# 警告の内容
while parsing target description (at line 68): Vector "v8f" references undefined type "ieee_half"
Could not load XML target description; ignoring
<br>
GCC AArch64 ToolChain 10.2は、以下に示すURLからダウンロードできる。<br>
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads<br>
<br>
これにより、PinePhoneでQtライブラリが使用できる。<br>
<br><br>
<br><br>