虚拟包
虚拟包仅仅是位于 virtual
类别的软件包。它们使用它们的依赖关系字符串来指定虚拟包的提供者,并且不安装任何文件。由于它们是普通的 ebuild,所以可以存在多个版本的虚拟包(当某个软件包可能在某些版本中由另一个软件包提供,而在其他版本中则不提供时,这非常有用 - 例如,请参见 perl 虚拟包)。除了不安装任何文件之外,另一个区别(除了不安装任何文件之外)是虚拟包没有定义 HOMEPAGE
和 LICENSE
变量。由于它不安装任何文件,所以它实际上没有许可证。
在添加新的虚拟包之前,应该在 gentoo-dev
上进行讨论。
虚拟包的示例
EAPI=8
DESCRIPTION="Virtual for C++ tr1 <type_traits>"
SLOT="0"
KEYWORDS="~alpha amd64 arm hppa ~ia64 ~mips ppc ppc64 ~s390 sparc x86 ~x64-macos"
RDEPEND="|| ( >=sys-devel/gcc-4.1 dev-libs/boost )"
看起来很熟悉......对吧?应该很熟悉,因为它看起来就像普通的 ebuild。
PROVIDE
类型的虚拟包已被 Gentoo 仓库禁用。虚拟包中的 KEYWORDS
由于虚拟包不安装任何文件,因此它们不遵循常规的架构测试过程。相反,开发人员可以直接将虚拟包的 KEYWORDS
设置为其提供者的 KEYWORDS
的并集。特别是,如果为稳定版软件包创建新的虚拟包,那么虚拟包将直接提交到稳定版。
例如,如果您有两个软件包:dev-libs/liblinux
具有 KEYWORDS="amd64 ~x86"
和 dev-libs/libbsd
具有 KEYWORDS="~amd64-fbsd ~x86-fbsd"
,那么生成的虚拟包将具有
KEYWORDS="amd64 ~x86 ~amd64-fbsd ~x86-fbsd"
RDEPEND="|| ( dev-libs/liblinux dev-libs/libbsd )"
虚拟包和子槽
与常规软件包一样,虚拟包可以定义子槽,这些子槽可用于触发其反向依赖关系的重建。为此,为提供者的每个子槽创建一个新的虚拟包版本,其中每个版本包含对特定子槽的依赖关系。
例如,为提供 ABI 兼容 libfoo.so.1
库的不同软件包创建的虚拟包可能如下所示
EAPI=8
DESCRIPTION="Virtual for libfoo.so.1"
SLOT="0/1"
RDEPEND="
|| (
dev-libs/libfoo:0/1
dev-libs/libfoo-alternate:0/1
dev-libs/bigpack:0/libfoo-1+libbar-0
dev-libs/bigpack:0/libfoo-1+libbar-1
)
"
当一个提供者即将被弃用,而另一个提供者则在保持 API 兼容的同时打破了 ABI 兼容性时,也可以使用虚拟包。在这种情况下,将创建多个版本的虚拟包,每个版本都指定一个提供者和一个唯一的子槽。
例如,如果 dev-libs/libfoo
(libfoo.so.0
) 将被 dev-libs/newfoo
(libfoo.so.1
) 替换,那么 virtual/libfoo-0.ebuild
将包含
EAPI=8
DESCRIPTION="Virtual for libfoo.so.0"
SLOT="0/0"
RDEPEND="dev-libs/libfoo:0/0"
而 virtual/libfoo-1.ebuild
将包含
EAPI=8
DESCRIPTION="Virtual for libfoo.so.1"
SLOT="0/1"
RDEPEND="dev-libs/newfoo:0/1"
dev-libs/newfoo
。因此,如果需要在两个提供者之间进行明确的选择,那么这种解决方案是不可行的。