4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#NervesJPAdvent Calendar 2024

Day 16

【Buildrootの思想を理解しよう】Buildrootのビルドエラーの解消の為にパッケージを追加するのは、小手先の解決方

Posted at

はじめに

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]という記述があり、この項目に書かれた条件に一致すると自動的に選択されるようになっています。

image.png

この情報により、パッケージを追加すると、依存して必要になるパッケージも自動的に追加されるはずです。

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の思想が理解できるエラーでした。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?