这是一个老问题,我知道
但没有令人满意的答案。
我在 yocto 自定义映像中得到 valgrind(用任何包名称替换 valgrind),但我不知道为什么。
Valgrin 的配方 RDEPENDS 变量显示将在映像中安装哪些软件包以供 valgrind 运行。
有什么办法可以知道逆函数吗?也就是说,他的 RDEPENDS valgrind 中有什么食谱?
bitbake -g valgrind 或在菜谱文件中查找 valgrind 没有帮助。
获取依赖于特定包的配方列表的另一种方法是屏蔽它的配方,为反向依赖生成位烘焙错误。
build/conf/local.conf
:
BBMASK = "valgrind"
会产生错误,有清晰的依赖链:
ERROR: Nothing PROVIDES 'valgrind' (but *** DEPENDS on or otherwise requires it)
ERROR: Required build target 'core-image' has no buildable providers.
Missing or unbuildable dependency chain was: ['core-image', '***', 'valgrind']
如果通过多个依赖链使用配方,则可能需要多次运行此方法。
这个答案与 Jose Luis Zabalza 的类似,但实施起来比查找并删除所有食谱的
.bb
和 .bbappend
更快一些。
有几种方法可以找到这个问题:
bitbake -g
可能是其中之一,您只是错误地设置了目标。
bitbake -g
获取 BUILD 依赖项,因此,它告诉您构建 valgrind 需要哪些包(或任务),但是执行 bitbake -g valgrind
会告诉您 valgrind 需要哪些 包,而不是 valgrind 需要哪些包(不是一样),你需要做:
bitbake <your-image> -g
例如
bitbake core-image-minimal -g
这将是您的映像的构建依赖项,它可能会告诉您映像中的哪个包需要 valgrind,(打开 task-depends.dot 文件并查找右侧的 valgrind 行)
如果 bitbake -g 不够的话,Bitbake -e 可能是另一种方式
bitbake -e | grep PACKAGE_INSTALL
bitbake -e
将打印出bitbake的字典,特别是你应该查看PACKAGE_INSTALL
变量,如果valgrind在那里,你可以看到什么配方将其添加到变量中,以及为什么要安装它
如果valgrind实际上是次要依赖项,也就是说
PACKAGE_A
有一个RDEPENDS+="valgrind"
,并且需要安装PACKAGE_A
,那么你需要查看包管理器的输出,这取决于你是否使用RPM、DEB 或 IPK 文件,有更具体的方法可以找到此问题,但查看映像的 log.do_rootfs 文件可能会为您提供有关哪个包对 valgrind 具有运行时依赖性的足够信息:
例如,如果您使用 RPM,您会看到类似这样的内容(经过修剪以便于阅读):
$ cat tmp/work/qemuarm64-poky-linux-musl/core-image-minimal/1.0-r0/temp/log.do_rootfs
Package Arch Version Repo Size
================================================================================
Installing:
base-passwd cortexa57 3.5.29-r0 oe-repo 7.2 k
busybox cortexa57 1.35.0-r0 oe-repo 364 k
busybox-mdev cortexa57 1.35.0-r0 oe-repo 8.7 k
dropbear cortexa57 2020.81-r0 oe-repo 132 k
initramfs-live-boot-tiny qemuarm64 1.0-r12 oe-repo 8.6 k
packagegroup-core-boot qemuarm64 1.0-r17 oe-repo 5.8 k
run-postinsts noarch 1.0-r10 oe-repo 7.4 k
Installing dependencies:
base-files qemuarm64 3.0.14-r89 oe-repo 13 k
busybox-inittab qemuarm64 1.35.0-r0 oe-repo 7.6 k
eudev cortexa57 3.2.10-r0 oe-repo 181 k
libblkid1 cortexa57 2.37.3-r0 oe-repo 85 k
libkmod2 cortexa57 29-r0 oe-repo 36 k
libz1 cortexa57 1.2.11-r0 oe-repo 46 k
musl cortexa57 1.2.2+git0+c4d4028dde-r0 oe-repo 364 k
netbase noarch 1:6.3-r0 oe-repo 14 k
update-alternatives-opkg cortexa57 0.5.0-r0 oe-repo 8.5 k
Installing weak dependencies:
busybox-syslog cortexa57 1.35.0-r0 oe-repo 8.7 k
在此示例中,您可以看到我从未请求将
libz1
安装在我的映像中(以及列为依赖项的其他包),但是上半部分中的一个包需要运行这些包。
log.do_rootfs
文件中有更多信息,可以直接告诉您需要什么 valgrind,如果您仍然找不到它,请返回 bitbake -g 并查找包含上述包的行(因为这些是对您的图像的直接依赖项) ),其中之一应该需要 valgrind。
RPM 命令
最后但并非最不重要的一点是,这是为 rpm 量身定制的,但该过程对于 debs 或 ipks 应该非常相似,尽管命令会有所不同,但是一旦您获得了要从
log.do_rootfs
安装的软件包列表,您就可以查询 rpm通过 rpm 命令打包:
我将使用上面的 dropbear 包作为示例:
$ rpm -qR tmp/deploy/rpm/cortexa57/dropbear-2020.81-r0.cortexa57.rpm
/bin/sh
libc.so()(64bit)
libz1 >= 1.2.11
libz.so.1()(64bit)
rtld(GNU_HASH)
update-alternatives-opkg
因此,就我而言,dropbear包是造成libz1依赖的罪魁祸首。
感谢您的回答@aehs29,非常有启发性,但是有很多软件包已构建但未安装。
我不明白
bitbake -g <image-recipe>
告诉我 build 依赖项,而不是 runtime 依赖项,是的,我的自定义映像具有来自 valgrind 的构建依赖项,但我无法获取有关 task- 中谁有罪的信息 -取决于.dot 文件。
valgrind 未在
bitbake -e | grep PACKAGE_INSTALL
中列出,所以运气不佳。
我正在使用 ipkg 软件包,因此 log.do_rootfs 文件不显示软件包依赖关系表。
查看软件包文件是不可行的,因为有许多未安装的软件包具有 valgrind 依赖项。
策略是首先构建镜像,然后删除valgrind配方,尝试再次构建镜像并分析错误。
user@build:~/home/user/yocto-local/build$ bitbake mycustom-image
Loading cache: 100% |######################| Time: 0:00:01
Loaded 4841 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies
ERROR: Nothing RPROVIDES 'valgrind' (but /home/user/yocto-local/sources/meta-imx/meta-bsp/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.3.p2.2-aarch64.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'valgrind' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['valgrind']
NOTE: Runtime target 'opencv' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['opencv', 'virtual/opencl-icd', 'valgrind']
ERROR: Required build target 'mycustom-image' has no buildable providers.
Missing or unbuildable dependency chain was: ['mycustom-image', 'opencv', 'virtual/opencl-icd', 'valgrind']
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
我相信这不是“正式”的做法,但我还没有找到另一种做法。
Yocto 现在有一个合适的工具来确定构建包的原因。
您必须首先为要构建的最终配方生成依赖关系图。然后,运行
oe-depends-dot --why
:
bitbake -g core-image-minimal
oe-depends-dot -k base-files -w ./task-depends.dot