Windows で RaspberryPi 向け Qt6 クロス開発 (その2：ビルド＆実行編)

[前回](https://qiita.com/tkhshmsy/items/71984bc41e47eb7ed7af)は準備を行いました。  
続けて Qt6 のビルドとサンプルの動作確認を行います。

# クロス開発環境構築の手順(再掲)

1. RaspberryPi 側の準備 (→ [【準備編】](https://qiita.com/tkhshmsy/items/71984bc41e47eb7ed7af))
   1. OS イメージ作成と起動
   2. Qt の開発に必要なパッケージの導入
   3. 環境設定
2. Windows 側の準備
   1. Qt 開発環境の導入
   2. クロスコンパイラを導入
   3. sysroot のコピー
   4. CMake と Ninja-build を実行できるようにする
   5. pkg-config の導入と設定
   6. CMake 用の設定ファイル作成
3. Qt のビルド (→ この記事はここから)
   1. ソースコード取得
   2. configure
   3. ビルドとインストール
   4. RPi へのコピー
4. QtCreator の設定
   1. リモートデバイスの設定
   2. Qt キットの設定
   3. サンプルの動作確認
5. 補足 (→ [【補足編】](https://qiita.com/tkhshmsy/items/579781fde85817174a4c))
   1. クロス開発環境を別の WinPC へ持ち込みたい
   2. RPi側実行環境の OS イメージを小さくしたい
   3. X Window アプリを作れるようにしたい
   4. 32bit のクロス環境を作りたい
   5. まだできていないこと

# Qt のビルド
いよいよ Qt6 をビルドしていきます。  
CLI での操作が中心になりますがガンバりましょう。  

Linux でやったことがある方はここからはそれとほぼ同じ手順です。

## ソースコード取得
git で Qt6 のソースコードを取得します。
ここだけ MinGW64 のコマンドラインではなく、git bash で行います。

:::note info
Qt の MinGW64 には init-repository で使う perl が含まれていません。
:::

```bash
user@host MINGW64 ~
$ cd /c/Qt/qt6build
user@host MINGW64 /c/Qt/qt6build
$ git clone "https://codereview.qt-project.org/qt/qt5"
user@host MINGW64 /c/Qt/qt6build
$ cd qt5
user@host MINGW64 /c/Qt/qt6build/qt5 (dev)
$ git checkout 6.5.1
Switched to a new branch '6.5.1'
branch '6.5.1' set up to track 'origin/6.5.1'.
user@host MINGW64 /c/Qt/qt6build/qt5 (6.5.1)
$ ./init-repository -f --module-subset=qtbase,qtdeclarative,qtquick3d,qtshadertools,qtsvg
```

## configure
MinGW64 のコマンドラインで実行します。  
sysroot の内容から RPi OS 上のどんな機能が使えてどれが使えないかなどが検査され、ビルドするための準備が完了します。

```bash
C:\Qt\6.5.1\mingw_64> cd C:\Qt\qt6build
C:\Qt\qt6build> mkdir build
C:\Qt\qt6build> cd build
C:\Qt\qt6build\build> ..\qt5\configure -release -no-pch -no-xcb -opengl es2 -qpa eglfs \ 
 -nomake examples -nomake tests -qt-host-path C:/Qt/6.5.1/mingw_64 \ 
 -extprefix C:/Qt/qt6-rpi -prefix /opt/qt -device linux-rasp-pi3-g++ \ 
 -device-option CROSS_COMPILE=aarch64-linux-gnu- -- \ 
 -DCMAKE_TOOLCHAIN_FILE=C:/Qt/qt6build/toolchain.cmake
```

オプション設定のポイントは以下の通り
* -no-pch
  * これをつけないとビルドが途中でコケます
* -no-xcb
  * X Window 対応を除外
* -qpa eglfs
  * QPA (Qt の描画システム) のデフォルトプラグインの指定
    * EGLFS (Xorg/X11 を使わず OpenGL/EGL で直接描画) を選択
  * この指定は環境変数(QT_QPA_PLATFORM)や実行時引数(-platform)で上書きできます
* -qt-host-path
  * Windows 側で動作する Qt の環境を教えておきます
* -extprefix
  * クロス環境 (Windows 側)のインストール先
* -prefix
  * RPi 側のインストール先
* -device
  * Raspberry Pi 3 用の設定を指定
  * ソースコードの qtbase/mkspecs/devices/ 以下にいろいろあります
* -DCMAKE_TOOLCHAIN_FILE
  * CMake に toolchain.cmake を指定

## ビルドとインストール
ビルド＆インストールしましょう。

```bash
C:\Qt\qt6build\build> cmake --build . --parallel
C:\Qt\qt6build\build> cmake --install .
```

`C:\Qt\qt6-rpi\` 以下に RPi 向け Qt6.5.1 がインストールされます。

## RPi へのコピー
`C:\Qt\qt6-rpi\` 以下の内容を RPi にコピーします。  
コピー先は configure で指定した `/opt/qt/` 以下です。

```bash
## Windows 側からコピー(WinSCPなどでやってもOK)
C:\Qt\qt6build\build> scp -r C:\Qt\qt6-rpi\* pi@raspberrypi.local:/opt/qt/
```

# QtCreator の設定
クロス開発環境ができたはずなので使ってみましょう  
QtCreator を起動して設定を行います。

## リモートデバイスの設定
まずは QtCreator が RPi へアクセスできるように設定しましょう。  
RPi を起動しネットワークに接続しておき、ssh でログインできることを確認しておくといいでしょう。

QtCreator で、
1. 編集 → Preferences → デバイスを選択します。
2. Add → Remote Linux Device → ウイザード開始
3. 設定名、ホスト名(or IPアドレス)、ログインユーザ名を設定
   1. 設定名にはわかりやすい名前をつけておきましょう
   2. ホスト名 と ログインユーザ名は RPi のものを指定します
4. Create New Key Pair → Generate And Save Key Pair → Deploy Public Key
   1. すでに鍵ペアがあるなら公開鍵ファイルを指定して Deploy Public Key
5. 次へ → 完了、でテストが開始されます。

テストは rsync でエラーが起きますが sftp が使われますので問題ありません。  
「デバイステストが成功しました」と表示されたら OK です。

## Qt キットの設定

### クロスコンパイラの登録  
QtCreatorで、
1. 編集 → Preferences → キット → コンパイラ タブを選択します。
2. 追加 → GCC → C を選択
   1. コンパイラのパスで 編集 → `C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-gcc.exe` を選択
   2. 名前 を適宜変更
2. 追加 → GCC → C++ を選択
   1. コンパイラのパスで 編集 → `C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-g++.exe` を選択
   2. 名前 を適宜変更
3. 適用 を選択

### クロスビルドした Qt 自身の登録
QtCreatorで、
1. 編集 → Preferences → キット → Qt バージョン タブを選択します。
2. 追加 を選択して、`C:\Qt\qt6-rpi\bin\qmake.bat` を選択
3. 適用 を選択

### GDB の登録
:::note warn
デバッガまわり、動作未確認です
:::

QtCreatorで、
1. 編集 → Preferences → キット → デバッガ タブを選択します。
2. 追加 を選択
   1. パスで参照 → `C:\SysGCC\raspberry64\bin\aarch64-linux-gnu-gdb.exe` を選択
   2. 名前 を適宜変更
3. 適用 を選択

### Qt kit の登録
QtCreatorで、
1. 編集 → Preferences → キット → キット タブを選択します。
2. 追加 を選択
   1. 名前 を設定します。RPi 向けの Qt6 だとわかりやすい名前がいいでしょう
   2. デバイスの種類 → Remote Linux Device を指定
      1. デバイス で先ほど設定したリモートデバイスを選択
   3. Sysroot に SysGCC 配下に置いた sysroot ディレクトリを指定
      1. `C:\SysGCC\raspberry64\aarch64-linux-gnu\sysroot`
   4. コンパイラ を指定します
      1. C に登録した C コンパイラを設定
      2. C++ に登録した C++ コンパイラを設定
   5. デバッガ に登録した GDB を設定
   6. Qtバージョンに登録した Qtバージョンを選択
   7. 最下段 CMake 設定 で 変更 を選択
      1. 最下行に以下2行を追記
    ```
    -DCMAKE_TOOLCHAIN_FILE:UNINITIALIZED=C:/Qt/qt6-rpi/lib/cmake/Qt6/qt.toolchain.cmake
    -DCMAKE_INSTALL_PREFIX:UNINITIALIZED=/home/pi
    ```
      2. OK を選択
3. OK を選択

これで、Qt のプロジェクトを作成するときに RPi 向けの設定が選べるようになります。  
![cmakeoptions2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432395/d290b960-1153-9524-925a-00b6e9b2e916.jpeg)
![qtkit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432395/9888d72e-1648-e132-0ac9-90aa51702f9a.jpeg)

## サンプルの動作確認
qtquick3d のサンプル picking を例に動かしてみます。

1. QtCreator のサンプルから picking を選ぶ
2. プロジェクト設定で、作成した RPi 向けの configuration を選ぶ
3. ビルド＆実行
   1. CMAKE_INSTALL_PREFIX に指定されている `/home/pi` 以下にデプロイされます

どうでしょうか、うごきましたか？  

![picking.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432395/203db812-e48c-be9f-19e0-e54c984557e2.jpeg)

以上でクロス開発環境が揃いました。  

次は[補足編](https://qiita.com/tkhshmsy/items/579781fde85817174a4c)です。