Yocto Project 4.0.23(kirkstone) は Raspberry Pi 5向けにビルドできるもののカーネルが不整合であるため組み合わせてはいけないという話 

**下記の記事でビルドしたLinux Kernelに対応するSDKを `bitbake core-image-weston -c populate_sdk` で生成したところ、Linux Kernel Moduleをビルドする準備である `make modules_prepare` を実行した際にエラーとなることがわかりました。 <font color="red">この問題は、Raspberry Pi 5向けのビルドにはLinux Kernel 6.1.xが必要であるが、yocto 4.0.23(kirkstone)のビルドスクリプトがLinux Kernel 5.15.xまでしか対応していないことが原因でした。</font>**

![WIN_20241230_15_41_05_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/be15738c-c0f9-0949-9031-b56833138080.jpeg)

### kirkstoneにはLinux Kernel 6.1.xに対応したビルドスクリプトが含まれていない

Yocto 5.1(2024年最新)とYocto 4.0.23(Kirkstone)を比較すると、以下のようにLinux Kernel 6.1.x向けのビルドに関する記述がないことがわかります。

https://git.yoctoproject.org/poky/tree/meta/recipes-kernel/linux/kernel-devsrc.bb?h=styhead

https://git.yoctoproject.org/poky/tree/meta/recipes-kernel/linux/kernel-devsrc.bb?h=kirkstone

#### kirkstoneは5.15までの対応となっている

kirkstoneはLinux Kernel 5.15.x系を採用しているようです。

https://docs.yoctoproject.org/migration-guides/release-notes-4.0.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/fdbbf666-4da1-5f1e-c71e-6dc852ee2ba4.png)


## 本状況により発生する問題

### カーネルモジュールをビルドできない(gen-sysreg.awkが存在せず生成できないことによるエラーが発生する)

yocto 4.0.23 × Raspberry Pi 5の環境で私の手元でビルドした際、`-c populate_sdk` により生成したSDKで、カーネルモジュールをビルドするためSDKに含まれる`/usr/src/kernel`で`make modules_prepare`を実行した際に下記のエラーが発生して停止する問題を確認しました。

<font color="red">**No rule to make target '.../qemux86_64-tdx-linux/perf/1.0/perf-1.0/arch/arm64/tools/gen-sysreg.awk', needed by '.../qemux86_64-tdx-linux/perf/1.0/perf-1.0/tools/arch/arm64/include/generated/asm/sysreg-defs.h'.  Stop.**</font>

以下の記事の現象に似ています。これはLinux Kernel 5.15.x以降の設定がビルドスクリプトに含まれていないことが原因です。

https://patchwork.yoctoproject.org/project/oe-core/patch/20231107090852.1478021-1-max.oss.09@gmail.com/#14743

https://lore.kernel.org/lkml/20231122022805.511839-1-irogers@google.com/T/

下記のように、自分でbitbakeの設定を書き足すことも考えましたが、 **その他の箇所も6.1.x対応できていないので焼け石に水** ですね...

```bash
# ビルドディレクトリから作業する
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build

# meta/recipes-kernel/perf/perf.bbに以下の変更を加える
$ vi ../meta/recipes-kernel/perf/perf.bb
### 変更を加える
### -->> 解決しない(ビルドスクリプトが存在しないため)
```

```diff
--- a/meta/recipes-kernel/perf/perf.bb
+++ b/meta/recipes-kernel/perf/perf.bb
@@ -135,6 +135,7 @@  PERF_SRC ?= "Makefile \
              tools/perf \
              tools/scripts \
              scripts/ \
+             arch/arm64/tools \
              arch/${ARCH}/Makefile \
 "
 
@@ -180,7 +181,8 @@  python copy_perf_source_from_kernel() {
         src = oe.path.join(src_dir, s)
         dest = oe.path.join(dest_dir, s)
         if not os.path.exists(src):
-            bb.fatal("Path does not exist: %s. Maybe PERF_SRC does not match the kernel version." % src)
+            bb.warn("Path does not exist: %s. Maybe PERF_SRC lists more files than what your kernel version provides and needs." % src)
+            continue
         if os.path.isdir(src):
             oe.path.copyhardlinktree(src, dest)
         else:
```

https://dot-h2o2.hatenadiary.org/entry/20080526/p1

https://www.elwsc.co.jp/knowledge/7414/

https://yoctobbq.lineo.co.jp/?q=node/366

### meta-raspberrypi でLinux Kernel 5.15.xを選択してもNG

Linux Kernel 5.15.xを利用するようにスクリプトを変更してみたところ、 **Linux Kernel 5.15.xにRaspberry Pi 5向けとしてLinuxをビルドするためのKernel configが存在せず、ビルドできませんでした。**

https://github.com/raspberrypi/linux/blob/rpi-6.6.y/arch/arm64/configs/bcm2712_defconfig

```bash
# 6.1.xが選択されている箇所を抽出
$ find ../meta-raspberrypi -type f | xargs grep -n "6\.1"
../meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer/0003-Remove-strip-step-in-Makefile.patch:8:WARNING: File '/usr/lib/omxplayer/libavutil.so.51.56.100' from
../meta-raspberrypi/conf/machine/raspberrypi5.conf:8:#PREFERRED_VERSION_linux-raspberrypi = "6.1%"
grep: ../meta-raspberrypi/.git/index: binary file matches
../meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.1.bb:1:LINUX_VERSION ?= "6.1.77"
../meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.1.bb:2:LINUX_RPI_BRANCH ?= "rpi-6.1.y"
../meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.1.bb:3:LINUX_RPI_KMETA_BRANCH ?= "yocto-6.1"

# 6.1.xの箇所を5.15.xへと変更する
$ vi ../meta-raspberrypi/conf/machine/raspberrypi5.conf
# kirkstone向けにKernelを入れ替える
# PREFERRED_VERSION_linux-raspberrypi = "6.1%"
# kirkstoneは5.15.xまでに対応している
PREFERRED_VERSION_linux-raspberrypi = "5.15.%"

# 6.1.x系のrecipeを削除しておく
$ mv ../meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_6.1.bb ../meta-raspberrypi/recipes-kernel/linux/_remove_linux-raspberrypi_6.1.bb.remove

# この状態でビルドするも、失敗
$ bitbake core-image-weston -c populate_sdk
## -->> エラー内容は下記の通り
```

<font color="red">**ERROR: linux-raspberrypi-1_5.15.92+gitAUTOINC+509f4b9d68_14b35093ca-r0 do_kernel_metadata: A KBUILD_DEFCONFIG 'bcm2712_defconfig' was specified, but not present in the source tree (/home/shino/yocto-work-2024_v1/poky/aiot-build/tmp/work-shared/raspberrypi5/kernel-source/arch/arm64/configs/)**</font>

## 対策

新しいバージョンのYocto 5.0.5(scarthgap)とRaspberry Pi 5の組み合わせを試してみました。 **が、Raspberry Pi 5 AI Kitを制御するためのmeta-hailoやmeta-tensorflowがYocto 5.x系向けのブランチを持っていないため、Kirkstoneでは動作していたもののScarthgapではビルドできなくなっています...**

### 本問題の影響を受ける記事

#### 非推奨な組み合わせ：Yocto Project 4.0.23 × Raspberry Pi 5

https://qiita.com/xtrizeShino/items/fcfd4491c09570a51cad

https://qiita.com/xtrizeShino/items/9c4a8cc28198243a7fab

#### 推奨された組み合わせ：Yocto Project 5.0.5(scarthgap) × Raspberry Pi 5

整合性に関する問題を修正し、 **Linux Kernel 6.xに対応したYocto Project 5.0.5(scarthgap)を利用してLinuxカーネルのビルド環境も含む開発環境を構築する方法** を以下をご確認ください。こちらが正規手順となります。

https://qiita.com/xtrizeShino/items/91974cdc84bc8af24017