はじめに
Nervesのポーティングを行っていて、BuildrootのHOSTパッケージの事で、気づいた事があったので、メモしておきます。
ビルド時にエラー発生
U-Bootのビルド時に、以下のエラーが発生しました。
HOSTCC tools/mkeficapsule
tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory
21 | #include <gnutls/gnutls.h>
| ^~~~~~~~~~~~~~~~~
compilation terminated.
HOSTCCとなっているので、U-Boot本体ではなく、ビルドを行う環境を作るためのコンパイルが失敗しています。
ChatGPTで調べてみると、
BR2_PACKAGE_HOST_GNUTLS=y
を追加する事で解決する。と言っています。
確かに、これを追加すると、この部分は解決したのですが、今度は、他の類似したエラーが発生します。
根本解決になってません。
それに、そもしも、BR2_PACKAGE_HOST_*
のパッケージを記述しなくても、ビルドは通るはずです。
なぜか?
このエラーは、BR2_TARGET_UBOOT_CUSTOM_REPO_URL=
で指定していたレポジトリーを他のレポジトリーに変更して、
make
を実行した時に発生しました。
buildrootには、BR2_TARGET_UBOOT
をビルドするときに、HOSTに必要なパッケージが何かを調べて、必要なHOSTパッケージをインストールしてから、ビルドを行います。
BR2_TARGET_UBOOT_CUSTOM_REPO_URLを変更すると、当然、ビルドに必要なパッケージも変わります。
単にmake
を実行するだけでは、HOSTパッケージがインストールされていないので、エラーが発生します。
解決策
ChatGPTで調べてみたんですが、言われたとおりにやっても解決できませんでした。
結局は、artifactを削除して、再度ビルドする事で解決しました。
おまけ
試行錯誤している時に、buildrootのtipsを見つけたので、メモしておきます。
特定のパッケージをリビルドしたい時には、以下のコマンドを実行します。
以下は、u-bootをリビルドする例です。
make uboot-dirclean
make uboot-rebuild
savedefconfigを実行すると、.configファイルが最小限の形式に圧縮されて保存されます。
これを実行すると、nerves_defconfigが整理された順で、不要な記述を削除した記述になりました。
make savedefconfig
おまけ2
tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory
21 | #include <gnutls/gnutls.h>
| ^~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.host:95: tools/mkeficapsule] Error 1
make[2]: *** [Makefile:1858: tools] Error 2
make[1]: *** [package/pkg-generic.mk:283: /home/masa/nerves/nerves_system_ebaz4205/.nerves/artifacts/nerves_system_ebaz4205-portable-0.0.1/build/uboot-xilinx-v2024.1/.stamp_built] エラー 2
make: *** [Makefile:23: _all] エラー 2
このエラーは、
BR2_PACKAGE_HOST_GNUTLS=y
の追加では、解決せず、Build環境に次のパッケージをインストールすることで解決しました。
sudo apt install libgnutls28-dev
おまけ3
このビルドエラーの本当の原因は、パッケージのバグでした。
詳しくは、こちらを参照してください。
この記事の方法で解決するのが正当だと思います。
まとめ
- 必要なHOSTのパッケージを自動的にbuildする機能がある。
- 今回は、libgnutls28-devをBuild環境にインストールすることで解決した。
- dircleanと、savedefconfigを見つけました。