【发布时间】:2021-07-08 22:56:55
【问题描述】:
假设我有一个包foo,它会自动检测另一个包bar,并在bar 存在时启用额外的功能。但是,foo 可以在没有bar 的情况下构建并正常工作。如何在foo 的配方中表示这种依赖关系?我想到的事情:
- 我可以将
bar添加到foo的DEPENDS,但这意味着现在只要图像包含foo,就会始终安装bar。 - 我什么都做不了,但是
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 中的某些内容?
-
是的,
bar提供了一个库,如果它可用,则foo启用调用此库的功能 → 在编译时需要库和标头。 -
你能在你的食谱中告诉我
foo如何检测bar是否可用吗? -
检测不是在配方中完成的,它是由
configure脚本完成的(例如PKG_CHECK_MODULES或AC_CHECK_LIB)。 -
您使用的是最新版本的 yocto 吗?您的注释“foo 是否会随机包含额外功能,具体取决于 bar 是在之前还是之后编译的”,这在 yocto 构建到通用 sysroot 时一直发生,但现在每个包都有自己的 sysroot。这大大减少了构建薄片。 (也大大增加了磁盘的使用量……)