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.
我相信这不是一个“正式”的做法,但我还没有找到另一个。
这是个老问题,我知道
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.
我相信这不是一个“正式”的做法,但我还没有找到另一个。