虚拟包

虚拟包仅仅是位于 virtual 类别的软件包。它们使用它们的依赖关系字符串来指定虚拟包的提供者,并且不安装任何文件。由于它们是普通的 ebuild,所以可以存在多个版本的虚拟包(当某个软件包可能在某些版本中由另一个软件包提供,而在其他版本中则不提供时,这非常有用 - 例如,请参见 perl 虚拟包)。除了不安装任何文件之外,另一个区别(除了不安装任何文件之外)是虚拟包没有定义 HOMEPAGELICENSE 变量。由于它不安装任何文件,所以它实际上没有许可证。

在添加新的虚拟包之前,应该在 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。

虚拟包中的 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"