如何找到哪个Yocto Project配方填充了镜像根文件系统上的特定文件

30

我经常在使用Yocto Project时遇到一个常见问题,就是确定为什么(或从哪个recipe)将文件包含在rootfs中。希望可以从构建系统的环境、日志和元数据中推导出来。理想情况下,一组命令将允许将文件链接回源(即recipe)。

我的常规策略是在元数据上执行搜索(例如grep -R filename ../layers/*),并搜索这些文件名在互联网上以查找可能负责的recipe的线索。但是,这并不总是非常有效。在许多情况下,文件名并未明确说明在recipe中。此外,有许多情况下,一个文件名由多个recipes提供,这导致需要额外的工作来确定最终提供该文件的recipe。当构建系统应该拥有足够的信息使解决答案变得简单时,这种调查通常会很费力。

3个回答

48

这是 oe-pkgdata-util 脚本及其子命令 find-path 的确切用例,该脚本是 openembedded-core 的一部分。

请参考以下示例(在 OE 构建环境中执行,即bitbake 可以正常工作):

tom@pc:~/oe/build> oe-pkgdata-util find-path /lib/ld-2.24.so
glibc: /lib/ld-2.24.so
你可以清晰地看到这个库属于glibc配方。 oe-pkgdata-util有更多有用的子命令来查看软件包和配方信息,值得检查--help

3
如果您更喜欢图形化展示,Toaster Web UI也会显示此信息以及依赖关系。

1
每个配方部署的候选文件都放置在每个$WORKDIR/image中,因此您可以切换到
$ cd ${TMPDIR}/work/${MULTIMACH_TARGET_SYS}

并执行一个

$ find . -path '*/image/*/fileYouAreLookingFor'

从结果中,您应该能够推断出部署此文件的配方的 ${PN}。

例如:

$ find . -path '*/image/*/mc'
./bash-completion/2.4-r0/image/usr/share/bash-completion/completions/mc
./mc/4.8.18-r0/image/usr/share/mc
./mc/4.8.18-r0/image/usr/bin/mc
./mc/4.8.18-r0/image/usr/libexec/mc
./mc/4.8.18-r0/image/etc/mc

1
假设菜谱是刚刚构建的,而不是从sstate中提取的,并且未启用rm_work。最好的方法是使用oe-pkgdata-util。 - Ross Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接