OpenEmbedded构建系统会自动在包之间添加常见类型的运行时依赖项,这意味着您不需要使用RDEPENDS显式声明包。有三种自动机制(shlibdeps
,、pcdeps
和 depchains
)分别处理共享库、包配置(pkg-config)模块、-dev
包和 -dbg
包。对于其他类型的运行时依赖项,必须手动声明这些依赖项。
- shlibdeps:在每个配方的do_package 任务期间,将找到该配方安装的所有共享库。对于每个共享库,包含共享库的包注册为提供共享库。更具体地说,该包注册为提供库的soname 。生成的共享库到包的映射由do_packagedata 任务全局保存在PKGDATA_DIR 中。同时,将检查配方安装的所有可执行文件和共享库,以查看它们链接到哪些共享库。对于找到的每个共享库依赖项,将查询
PKGDATA_DIR
以查看某个包(可能来自不同的配方)是否包含共享库。如果找到这样的包,则会将依赖于共享库的包添加到包含该库的包中。自动添加的运行时依赖项还包括版本限制。此版本限制指定至少必须使用提供共享库的包的当前版本,就像已将“package
(>=version
)”添加到RDEPENDS
一样。如果需要,在安装依赖于该库的包时,这将强制升级包含共享库的包。如果您想避免一个包被注册为提供一个特定的共享库(例如,因为该库仅供内部使用),那么将该库添加到包的配方中的私有库中。 -
pcdeps
:在每个配方的do_package
任务期间,将找到配方安装的所有pkg配置模块(*.pc
文件)。对于每个模块,包含该模块的包注册为提供该模块。生成的模块到包的映射由do_packagedata
任务全局保存在PKGDATA_DIR
中。同时,检查配方安装的所有pkg-config模块,以查看它们所依赖的其他pkg-config模块。如果一个模块包含一个指定另一个模块的“Requires:”行,那么它将被视为依赖于另一个模块。如果每个模块都包含一些模块,请查看包的依赖关系。如果找到这样的包,则会将依赖于该模块的包中的运行时依赖项添加到包含该模块的包中。
注意:pcdeps
机制通常推断-dev
包之间的依赖关系。
-
depchains
:如果包foo依赖于包bar,那么foo dev和foo dbg也分别依赖于bar dev和bar dbg。以-dev包为例,bar dev包可能提供foo dev所需的头和共享库符号链接,这表明了包之间需要依赖关系。depchains
添加的依赖项以RRECOMMENDS的形式存在。
注意:默认情况下,foo-dev
对foo也有一个RDEPENDS-
样式依赖关系,因为RDEPENDS_${PN}-dev
(在bitbake.conf中设置
)包括“${PN}”。为了确保依赖链永远不会断开,默认情况下总是生成--dev
和-dbg
包,即使包是空的。
通过使用[deptask]声明,do_package
任务依赖于depends中每个配方的do_packagedata
任务,这保证只要正确设置了DEPENDS ,所需的共享库/模块到包的映射信息将在需要时可用。