如何解决bitbake 配方中的可选依赖项
假设我有一个包 foo
,它会自动检测另一个包 bar
并在存在 bar
时启用额外的功能。然而,foo
可以在没有 bar
的情况下构建并正常工作。我如何在 foo
的配方中表示这种依赖关系?我想到的事情:
- 我可以将
bar
添加到foo
的DEPENDS
,但这意味着现在只要映像包含bar
,就会始终安装foo
。 - 我无能为力,但是
foo
会随机包含额外功能,具体取决于bar
是在之前还是之后编译。 - 我可以添加一个
PACKAGECONFIG[bar] = ",bar"
,但是我必须记得在将bar
的foo
添加到图像时将它添加到PACKAGECONFIG
并在我想从图像中删除它。
有没有办法告诉 bitbake foo
在没有 bar
的情况下构建良好,但如果两者都存在,那么应该先构建 bar
?
为了使事情更清楚,假设我在 foo
的 configure.ac
中有以下内容:
PKG_CHECK_MODULES([BAR],[bar],[AC_DEFINE([HAVE_BAR]),[1],[Is bar available?])])
然后在 foo.c
中:
#ifdef HAVE_BAR
#include <bar.h>
#endif
/* And later: */
void foo_init (void)
{
#if HAVE_BAR
bar_init();
enable_bar_functionnality();
#endif
}
所以 foo
将检测 bar
是否存在并在编译时激活或不激活相应的功能。
解决方法
如果我正确理解了您的问题,您有 foo
在运行时检测到 bar
的存在。一种更加 yocto-ish 的方法是在编译时澄清功能和依赖项,以便在构建映像时包含所需的内容。
您可以通过使用 PACKAGECONFIG
定义 foo 的“功能”或使用 PACKAGES
定义多个包来实现此目的。前者让你设置编译器参数;后者只允许您定义用于部署的文件子集。无论哪种方式,您都可以定义仅适用于 foo+bar 情况的 RDEPENDS
(“运行时依赖”)。
使用 PACKAGES
DEPENDS
是编译时依赖项,即编译或组装配方中定义的所有包所需的东西。如果这些文件被定义为包含 FILES 的包的一部分,它们只会出现在映像中。
DEPENDS += "bar"
PACKAGES += "foo foo-with-bar"
FILES_foo = "${bindir}/foo"
FILES_foo-with-bar = "${bindir}/foo ${bindir}/bar"
# probably not necessary since bar is included in foo-with-bar
# and RDEPENDS should be set to this automatically
# RDEPENDS_foo-with-bar += "bar"
使用 PACKAGECONFIG
我发现 PACKAGECONFIG 很难使用,但是如果您需要在 bar 支持中进行编译,这是要走的路。它最多需要六个参数,包括 runtime-deps-for-f1
,这是启用 bar
的栏功能时安装 foo
所需的参数。
PACKAGECONFIG[f1] = "\
--with-f1,\
--without-f1,\
build-deps-for-f1,\
runtime-deps-for-f1,\
runtime-recommends-for-f1,\
packageconfig-conflicts-for-f1"
poky/meta
中设置运行时依赖的一个方法是 recipes-connectivity/connman/connman.inc
:
PACKAGECONFIG[nftables] = " \
--with-firewall=nftables,\,\
libmnl libnftnl,\
kernel-module-nf-tables kernel-module-nft-chain-nat-ipv4 (...) \
"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。