はじめに
ただしこっちのカーネルでも
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_compile
のoe_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には手を付けていないはずなので、きっとうまい方法これから考えてくれるのだろう。
あと、私の英語が貧弱なのはお察しください。