はじめに
Buildrootで、u-bootをビルドしている時に、次のエラーが発生しました。
tools/mkeficapsule.c:18:10: fatal error: uuid/uuid.h: No such file or directory
18 | #include <uuid/uuid.h>
| ^~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.host:95: tools/mkeficapsule] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [Makefile:1858: tools] Error 2
make[1]: *** [package/pkg-generic.mk:289: /home/masa/nerves/nerves_system_zynq_ebaz4205/.nerves/artifacts/nerves_system_zynq_ebaz4205-portable-0.0.2/build/uboot-xilinx-v2024.1/.stamp_built] エラー 2
make: *** [Makefile:23: _all] エラー 2
これは、Hostで必要なパッケージのビルドでのエラーでした。uuidのライブラリーが足りてないようです。
$ ls host/lib/pkgconfig/
expat.pc libconfuse.pc liblz4.pc libzstd.pc python-3.12.pc
libacl.pc libcrypto.pc liblzma.pc lzo2.pc python3-embed.pc
libarchive.pc libffi.pc libpkgconf.pc openssl.pc python3.pc
libattr.pc libkmod.pc libssl.pc python-3.12-embed.pc zlib.pc
たしかにuuid.pc
がない。
疑問
BR2_PACKAGE_HOST_UTIL_LINUX=y
この設定をすれば、uuid.pc
がビルドされることがわかりました。
このエラーは、以前も出たことがあり、その時は、試行錯誤の末、BR2_PACKAGE_HOST_UTIL_LINUX=y
を追加していたことがわかりました。
でも、BR2_PACKAGE_HOST_UTIL_LINUX=y
を追加しなくても、ビルドが成功していた時もあった(これは、make cleanてなかったから残ってただけだったと後で判明)。
そもそも、Buildrootは、パッケージの依存関係を管理していて、必要な時に、PR2_PACKAGE_HOST_UTIL_LINUX
が自動的にYになるはずではないか?
Buildrootのパッケージ依存関係の管理
Buildrootは、パッケージの依存関係を管理してます。
make manuconfigの'/'で検索してパッケージを見てみると、
Selected by [y]
, selected by [n]
という記述があり、この項目に書かれた条件に一致すると自動的に選択されるようになっています。
この情報により、パッケージを追加すると、依存して必要になるパッケージも自動的に追加されるはずです。
BR2_PACKAGE_HOST_UTIL_LINUX=y
にならないのは、u-bootのパッケージのバグではないか?
調査
ubootのConfig.inを調べてみます。
ここに、BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX
に依存しているという記述が不足しているのではないか?
そしたら、こんな設定を発見!
config BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX
bool "U-Boot needs util-linux"
help
Select this option if your U-Boot board configuration
requires util-linux (-luuid) to be available on the host.
This is typically the case when the board configuration
has CONFIG_TOOLS_MKEFICAPSULE enabled.
自動的にutil-linuxが必要かどうか検知できないから、必要な場合は、BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX=y
としてね。
ということのようです。
b-bootはいろいろなボードがあって、設定によって依存関係が変わり、自動設定が難しいので、このような、アプローチになってると理解しました。
これで解決しました。
おわりに
- 依存関係によっては、自動的に設定されない場合がある。
- Buildrootの思想からすると、依存するパッケージを自分で見つけて導入する必要は本来ないはず。
- 依存関係に関するビルドエラーが発生した場合、該当するパッケージのConfig.inを調べてみると、解決策が見つかるかもしれない。
Buildrootの思想が理解できるエラーでした。