みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

meta-raspberrypyの環境でlinux5.0のdevice-tree-overlaysがビルドできない問題の調査(3/15追記)

はじめに

ただしこっちのカーネルでもoverlaysがビルドエラーを起こすので、それは調査する必要がある。

ので調査した。

ログを観察する

タスクごとのログファイルはtmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/temp/log.do_compileで参照できる。

log.do_compile自体は最新のログへのシンボリックリンクになっている。実際のファイルは実行時のプロセスIDが末尾についてlog.do_compile.12345みたいになっている。

成功ログ

ビルドがうまく行くデバイスツリーのログ。

| NOTE: make -j 16 HOSTCC=gcc  -isystem/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2 HOSTCPP=gcc  -E bcm2710-rpi-cm3.dtb
|   Using /home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work-shared/raspberrypi3/kernel-source as source for kernel
|   DTC     arch/arm/boot/dts/bcm2710-rpi-cm3.dtb

失敗ログ

ビルドが失敗するoverlaysのデバイスツリーのログ

| NOTE: make -j 16 HOSTCC=gcc  -isystem/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2 HOSTCPP=gcc  -E overlays/at86rf233.dtbo

違いがほとんど無い。

実行コマンドを観察する

実際に実行されるコマンドはtmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/temp/run.do_compileで参照できる。

これも最新のファイルへのシンボリックリンク

...(snip)...

do_compile() {
    kernel_do_compile
    for dtbf in           bcm2708-rpi-0-w.dtb     bcm2708-rpi-b.dtb     bcm2708-rpi-b-plus.dtb     bcm2709-rpi-2-b.dtb     bcm2710-rpi-3-b.dtb     bcm2710-rpi-3-b-plus.dtb     bcm2708-rpi-cm.dtb     bcm2710-rpi-cm3.dtb               overlays/at86rf233.dtbo     overlays/dwc2.dtbo     overlays/gpio-key.dtbo     overlays/hifiberry-amp.dtbo     overlays/hifiberry-dac.dtbo     overlays/hifiberry-dacplus.dtbo     overlays/hifiberry-digi.dtbo     overlays/i2c-rtc.dtbo     overlays/iqaudio-dac.dtbo     overlays/iqaudio-dacplus.dtbo     overlays/lirc-rpi.dtbo     overlays/pi3-disable-bt.dtbo     overlays/pi3-miniuart-bt.dtbo     overlays/pitft22.dtbo     overlays/pitft28-resistive.dtbo     overlays/pitft35-resistive.dtbo     overlays/pps-gpio.dtbo     overlays/rpi-ft5406.dtbo     overlays/rpi-poe.dtbo     overlays/vc4-kms-v3d.dtbo     overlays/w1-gpio-pullup.dtbo     overlays/w1-gpio.dtbo          ; do
        dtb=`normalize_dtb "$dtbf"`
        oe_runmake $dtb
    done
}

oe_runmake() {
    oe_runmake_call "$@" || die "oe_runmake failed"
}

...(snip)...

oe_runmake_call() {
    bbnote make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "$@"
    make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "$@"
}

ログと付き合わせると、エラーが発生しているのはoe_runmake_callっぽいことが分かる。

実際に実行してみる

ログから得た情報を元に、手動でコマンドを実行してみる。

devshellを使用する。

bitbake -c devshellを使用すると、クロスコンパイル用の環境変数が解決された状態のシェル(ターミナル)を開くことができる。

これを使用して、エラーが発生するコマンドを実際に実行してみる。

$ bitbake virtual/kernel -c devshell

devshellでは起動時に${S}(ソースコード展開用)に相当するディレクトリがカレントディレクトリとなっている。

しかし${B}(ビルド用)に相当するディレクトリで実行したいので移動する。

ここではtmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/linux-raspberrypi3-standard-build/${B}に相当する。

$ cd ../../../work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/linux-raspberrypi3-standard-build/

(3/15 追記) devshellでカーネルをビルドする場合、${S}でmakeを実行しても${B}に成果物が生成されるようにきちんと環境設定がされているようだ。

ログのコマンドを実行する。

まずは、ログの文字列をコピペしてdevshell上で実行してみる。

$ make -j 16 HOSTCC=gcc  -isystem/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2 HOSTCPP=gcc  -E bcm2710-rpi-cm3.dtb

bcm2710-rpi-cm3.dtbのmake

成功例であるbcm2710-rpi-cm3.dtbの方から試してみる。

# No files, no impossibilities in 0 directories.

# Implicit Rules

# No implicit rules.

# Files

# Not a target:
bcm2710-rpi-cm3.dtb:
#  Command line target.
#  Implicit rule search has not been done.
#  Modification time never checked.
#  File has not been updated.

# files hash-table stats:
# Load=1/1024=0%, Rehash=0, Collisions=0/1=0%
# VPATH Search Paths

# No 'vpath' search paths.

# No general ('VPATH' variable) search path.

# strcache buffers: 1 (0) / strings = 11 / storage = 1391 B / avg = 126 B
# current buf: size = 8162 B / used = 1391 B / count = 11 / avg = 126 B

# strcache performance: lookups = 12 / hit rate = 8%
# hash-table stats:
# Load=11/8192=0%, Rehash=0, Collisions=0/12=0%
# Finished Make data base on Wed Mar 13 08:12:22 2019

成功例のはずが何やら失敗しているらしい。

run.do_compileoe_runmake_callと比較すると、ダブルクォーテーションの有無が異なっている。

make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "$@"

$@の部分がターゲットのルール名に展開されるようなのでbcm2710-rpi-cm3.dtbに置き換えて実行してみる。

$ make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "bcm2710-rpi-cm3.dtb"
  HOSTCC  scripts/basic/fixdep
  Using /home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work-shared/raspberrypi3/kernel-source as source for kernel
  HOSTLD  scripts/dtc/dtc
  DTC     arch/arm/boot/dts/bcm2710-rpi-cm3.dtb

今度は成功した。

overlays/at86rf233.dtboのmake

こんどはoverlays/at86rf233.dtboを実行してみる。

$ make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "overlays/at86rf233.dtbo" 
make[2]: *** ターゲット 'overlays/at86rf233.dtbo' を make するルールがありません.  中止.
Makefile:152: recipe for target 'sub-make' failed
make[1]: *** [sub-make] Error 2
Makefile:15: recipe for target '__sub-make' failed
make: *** [__sub-make] Error 2

失敗した。

基の実装を確認する

oe_runmake_callの元の実装、つまり変数展開前の実装を確認してみる。

元の実装はpoky/meta/classes/base.bbclassにある。

oe_runmake_call() {
    bbnote ${MAKE} ${EXTRA_OEMAKE} "$@"
    ${MAKE} ${EXTRA_OEMAKE} "$@"
}

キモとなるのは${EXTRA_OEMAKE}っぽい事が分かる。

次のコマンドでEXTRA_OEMAKEの内容を表示できるので、どのようになっているか見てみる。

$ bitbake virtual/kernel -e | grep '^EXTRA_OEMAKE='

5.0 EXTRA_OEMAKE

まずは、overlaysのビルドが通らない5.0のEXTRA_OEMAKE。

EXTRA_OEMAKE=" HOSTCC=\"gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2\" HOSTCPP=\"gcc  -E\""

4.19 EXTRA_OEMAKE

meta-raspberrypiのthudブランチでは4.14が最新カーネルだが、masterブランチでは4.19が使用できるようなので、こちらのEXTRA_OEMAKEと比較してみた。

ちなみに、こちらは問題なくビルドが通っている。

EXTRA_OEMAKE=" HOSTCC=\"gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2\" HOSTCPP=\"gcc  -E\""

バージョン意外に差がほとんど見当たらない。

4.19 oe_runmake_call

run.do_compileの内容も比較してみた。

 make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_4.19.27+gitAUTOINC+c0e09b3420-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "overlays/at86rf233.dtbo"

こちらもほとんど差分が無い。

5.0と4.19のソースツリーをそれぞれ眺めてみる

基本的には5.0は4.19をベースとしているはずなので大きな差は無いと思っていたが、いろいろ差分を取ってみるとMakefileのデバイスツリーのルールを定義している部分が変更されていることに気づいた。

4.19

arm/arch/Makefileに次のように定義されている(抜粋)。

%.dtb: | scripts
    $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@
%.dtbo: | scripts
    $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@

PHONY += dtbs dtbs_install

dtbs: prepare scripts
    $(Q)$(MAKE) $(build)=$(boot)/dts

dtbs_install:
    $(Q)$(MAKE) $(dtbinst)=$(boot)/dts

5.0

ルートのMakefileに次のように定義されている(抜粋)。

# ---------------------------------------------------------------------------
# Devicetree files

ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),)
dtstree := arch/$(SRCARCH)/boot/dts
endif

ifneq ($(dtstree),)

%.dtb: prepare3 scripts_dtc
    $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@

PHONY += dtbs dtbs_install dt_binding_check
dtbs dtbs_check: prepare3 scripts_dtc
    $(Q)$(MAKE) $(build)=$(dtstree)

dtbs_check: export CHECK_DTBS=1
dtbs_check: dt_binding_check

dtbs_install:
    $(Q)$(MAKE) $(dtbinst)=$(dtstree)

ifdef CONFIG_OF_EARLY_FLATTREE
all: dtbs
endif

endif

PHONY += scripts_dtc
scripts_dtc: scripts_basic
    $(Q)$(MAKE) $(build)=scripts/dtc

dt_binding_check: scripts_dtc
    $(Q)$(MAKE) $(build)=Documentation/devicetree/bindings

いろいろチェックは増えているようだが、だいたい似たようなルールが定義されているように見える。

しかしよく見てみると、こちらには%.dtboのルールが無いことに気づいた。

dtboのルールを追加してみる

とりあえず、tmp/work-shared/raspberrypi3/kernel-sourceデバッグ用のブランチを作成してMakefileを修正し、devshellで実行してみる。

$ bitbake virtual/kernel -c cleansstate
$ bitbake virtual/kernel  #ここで失敗する
$ cd tmp/work-shared/raspberrypi3/kernel-source
$ git checkout -b debug

そしてエディタなどで次の内容で修正する。

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 9db3c584b2cb..9e43f8119be7 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -343,6 +343,9 @@ $(BOOT_TARGETS): vmlinux
 $(INSTALL_TARGETS):
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
 
+%.dtbo: | scripts
+       $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@
+
 PHONY += vdso_install
 vdso_install:
 ifeq ($(CONFIG_VDSO),y)

arch/arm/Makefile%.dtbと同じ内容で%.dtboを追加している。

次にdevshellを実行する。

$ bitbake virtual/kernel -c devshell

開いたdevshell上で次のコマンドを実行する。

$ cd ../../../work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/linux-raspberrypi3-standard-build/
$ make -j 16  HOSTCC="gcc  -isystem/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/include -O2 -pipe -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -L/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath-link,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/usr/lib -Wl,-rpath,/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work/raspberrypi3-poky-linux-gnueabi/linux-raspberrypi/1_5.0.0+gitAUTOINC+00794df915-r0/recipe-sysroot-native/lib -Wl,-O1 -Wl,--allow-shlib-undefined -Wl,--dynamic-linker=/home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2" HOSTCPP="gcc  -E" "overlays/at86rf233.dtbo" 
  Using /home/mickey/work/yocto/rpi-thud-lk5/build_lk5_rpi/tmp/work-shared/raspberrypi3/kernel-source as source for kernel
  HOSTCC  scripts/basic/fixdep
  HOSTLD  scripts/dtc/dtc
  DTCO    arch/arm/boot/dts/overlays/at86rf233.dtbo

できた。

arch/arm/Makefileへの修正について

本来であれば%.dtbの定義と揃えてルートのMakefile%.dtboを定義したいところだが、このファイルはカーネルバージョンも記述されるため、 メインラインの修正も頻繁に行われることが予想される。

devicetree-overlaysはサポートしているアーキテクチャも限られるため、あえてarch/arm/Makefileに追加することにした。

レシピに組み込む

せっかく原因が解ったので、レシピにパッチを組み込む。

パッチの作成

devshellを閉じて次のコマンドを実行し、パッチを作成する。

$ git add -u
$ git commit -m "Fix missing rules for devicetree overlays"
$ git format-patch HEAD^
$ mv 0001-Fix-missing-rules-for-devicetree-overlays.patch ~/

これでパッチは作成できた。

パッチをレシピへ追加

前回のレシピに組み込んで見る。

ビルドディレクトリで次のコマンドを実行し、レシピから参照できるところにパッチを追加する。

$ mkdir ../layers/meta-rpi-lk5_r/recipes-kernel/linux/files
$ mv ~/0001-Fix-missing-rules-for-devicetree-overlays.patch ../layers/meta-rpi-lk5_r/recipes-kernel/linux/files

layers/meta-rpi-lk5_r/recipes-kernel/linux/linux-raspberrypi_5.0.bbを次の内容に修正する。

LINUX_VERSION ?= "5.0.0"

SRCREV = "00794df915cda0a4603f0a22c802dbad9045c181"
SRC_URI = " \
    git://github.com/raspberrypi/linux.git;branch=rpi-5.0.y \
    file://0001-Fix-missing-rules-for-devicetree-overlays.patch \
    "
require recipes-kernel/linux/linux-raspberrypi.inc

LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"

まとめ

紆余曲折ありながらも、無事に原因を見つけて修正する方法がわかった。 恐らく遠くないうちに修正されるとは思うが、こういう調査は意外に骨が折れる。

おまけ(3/15 追記)

今回作成したパッチをラズパイカーネルの方にプルリクエストしてみた。

すると、こんな返信が帰ってきた。

The required .dtbo rule is in scripts/Makefile.lib. This PR is unnecessary.

しかしエラーがyocto環境でエラーが発生しているのは事実なので、次のように返した。

Thanks for reply.

However, when this kernel was actually built with yocto, the following error occurred.

| make[2]: *** No rule to make target 'overlays/at86rf233.dtbo'.  Stop.
Same results were obtained for other dts under overlays.

I know there are dtbo rules in scripts/Makefile.lib,
But it seems to works not fine.

If you have another approach, please let us know what you think.

すると更にこのような返信が。

If you follow the standard Raspberry Pi building instructions (https://www.raspberrypi.org/documentation/linux/kernel/building.md) with the current rpi-5.0.y tree and it doesn't build then report back here, but it works for me.

ラズパイカーネル側はこの手順が正しく実行できれば基本的にはOKとしているのだろう。

なのでパッチを外した状態で、devshellで次を実行してみて、エラーが発生しなければラズパイカーネル側には責任が無いことになると考えた。

$ KERNEL=kernel7 make -j 16 ARCH=arm CROSS_COMPILE=arm-poky-linux-gnueabi- zImage modules dtbs

この手順に従うと、overlays以下のdtboは正しく生成されるが、常にすべてビルドされる。

そこで、yocto(というかmeta-raspberrypi)でのビルド方法は、もともとラズパイカーネルのメンテナが推奨した方法から外れていて、dtboを個別にビルドしたいのはyocto(meta-raspberrypi)側の都合でしかないのかもしれないと気づいた。

ということで、プルリクエストを撤回した。

今回作成したパッチはいわばバックポート的なワークアラウンドということになる。 meta-raspberrypi側は現時点では、まだLK5には手を付けていないはずなので、きっとうまい方法これから考えてくれるのだろう。

あと、私の英語が貧弱なのはお察しください。