Yocto:如何知道为什么包含一个包?

Yocto: How to know why a package is included?

这是个老问题,我知道

Yocto: why is a package included?

Why is package included in Yocto rootfs?

没有满意的答案

我在我的 yocto 自定义映像中得到了 valgrind(用任何包名称代替 valgrind),但我不知道为什么。

Valgrin 的配方RDEPENDS 变量显示将在映像中安装哪些包以供 valgrind 运行。

有什么方法可以知道反向函数吗?也就是说,他的 RDEPENDS valgrind?

中有什么食谱

bitbake -g valgrind 或在食谱文件中找到 valgrind 没有帮助。

有几种方法可以查明这一点: bitbake -g 可能是其中之一,你只是错误地设置了目标。 bitbake -g 获取 BUILD 依赖项,因此,它会告诉您需要构建 valgrind 的包(或任务),但是执行 bitbake -g valgrind 会告诉您什么 packages are required for valgrind, not what packages require valgrind (not the same),你需要做的: 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 安装在我的映像中(以及其他列为依赖项的软件包),但是上一节中的其中一个软件包需要 [=62] =]. log.do_rootfs 文件中有更多信息可以直接告诉您需要什么 valgrind,如果您仍然找不到它,请返回 bitbake -g 并查找包含上述包的行(因为它们直接依赖于您的图像),其中之一应该需要 valgrind。

RPM 命令

最后但同样重要的是,这是为 rpms 量身定制的,但是对于 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-depends.dot 文件中获得有关谁有罪的信息。

valgrind 未在 bitbake -e | grep PACKAGE_INSTALL 中列出,所以运气不好。

我正在使用 ipkg 包,所以 log.do_rootfs 文件不显示包依赖关系 table .

查看包文件是不可行的,因为有许多 non-installed 包具有 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.

我相信这不是一个“正式”的做法,但我还没有找到另一个。