EAPI 使用和描述

软件包管理器规范 (PMS) 是一个标准化工作,旨在确保 ebuild 文件格式、ebuild 仓库格式(Gentoo 仓库是 Gentoo 的主要形式)以及与这些 ebuild 交互的软件包管理器的行为得到妥善记录和一致。

EAPI 是在 ebuild 和其他软件包管理器相关文件中定义的版本,它告知软件包管理器有关文件语法和内容的信息。实际上,它就是文件所遵循的软件包管理器规范 (PMS) 的版本。

本节提供不同 EAPI 的使用和描述。

EAPI 的使用

必须通过在 ebuild 的顶部指定 EAPI 变量来设置它

# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

在编写新的 ebuild 时,开发人员可以选择他们认为最合适的 EAPI。鼓励使用最新 EAPI 的功能。

升级路径

Gentoo 的策略是支持对至少一年前安装的系统进行升级,而无需/只需少量干预,并支持对两年前安装的系统进行少量干预。为了实现这一点,开发人员必须避免在 @system 集中使用最新的 EAPI(请参阅 隐式系统依赖关系)或其依赖关系。

基础系统项目对使用较新的 EAPI 有 规则Python 项目 也是如此。

这也是一个约定,即在从树中删除与阻塞器匹配的最后一个 ebuild 至少 2 年后才保留 ebuild 中的阻塞器,以避免用户升级旧系统时出现文件冲突。 pkgcheck 对此有一个警告,名为 OutdatedBlocker(或者对于使用非嫁接仓库的旧版 git 时代,则是 NonexistentBlocker)。

EAPI 0 到 4

EAPI 0 到 4 已过时,不再使用。请参阅软件包管理器规范以了解有关它们的详细信息。

EAPI 5

EAPI 5 元数据

REQUIRED_USE 支持新的最多一个运算符
新的 最多一个 运算符由字符串 ?? 组成,如果其子元素中匹配的元素为零或一个(但不能超过一个),则满足此运算符。
SLOT 支持可选的“子槽”部分
SLOT 变量可以包含一个可选的 子槽 部分,该部分位于常规槽之后,并用 / 字符分隔。子槽必须是有效的槽名称。子槽用于表示将软件包升级到具有不同子槽的新版本时,可能需要重建依赖软件包的情况。当从 SLOT 定义中省略子槽部分时,该软件包被视为具有一个隐式子槽,该子槽等于常规槽。
依赖关系中的槽运算符和子槽

槽依赖关系可以包含一个可选的子槽部分,该部分位于常规槽之后,并用 / 字符分隔。这对于安装预编译二进制文件的软件包很有用,这些二进制文件需要具有特定 soname 版本的库,该版本对应于子槽。例如

RDEPEND="dev-libs/foo:0/3"

软件包依赖关系规范可以使用 槽运算符 来明确说明如果运行时依赖关系的槽和/或子槽发生更改会发生什么

  • :* 表示任何槽值都是可以接受的。此外,对于运行时依赖关系,表示指定依赖关系的软件包在匹配依赖关系的软件包被具有不同槽和/或子槽的不同匹配软件包替换时不会中断。
  • := 表示任何槽值都是可以接受的。此外,对于运行时依赖关系,表示指定依赖关系的软件包将中断,除非存在一个匹配依赖关系的软件包,并且其槽和子槽等于指定依赖关系的软件包安装时匹配该依赖关系的最佳已安装版本的槽和子槽。
  • :slot= 表示只接受特定的槽值,并且在其他方面与 := 运算符的行为相同。

:slot 依赖关系语法继续像 EAPI=4 或更早的版本那样工作,即它表示只接受特定的槽值,但是当匹配运行时依赖关系的版本被具有不同子槽的版本替换时,软件包不会中断。

例如

RDEPEND="dev-libs/foo:2=
    >=dev-libs/bar-0.9:=
    media-gfx/baz:*
    x11-misc/wombat:0"

表示当 foo:2>=bar-0.9 升级到具有不同子槽的版本时,软件包应重建,但是 bazwombat:0 的子槽更改应忽略。

EAPI 5 配置文件

配置文件稳定 USE 强制和屏蔽
在支持稳定屏蔽的 EAPI 的配置文件目录中,支持新的 USE 配置文件:use.stable.maskuse.stable.forcepackage.use.stable.maskpackage.use.stable.force。这些文件的功能与以前支持的 USE 配置文件类似,只是它们只影响因稳定关键字而合并的软件包。

EAPI 5 助手

econf 添加 --disable-silent-rules
如果 --disable-silent-rules 出现在 configure --help 的输出中,则此选项将自动传递。
new* 命令可以从标准输入读取
当第一个参数为 -(连字符)时,将读取标准输入。
用于 {has,best}_version 的新选项 --host-root
此选项 --host-root 将导致查询应用于主机根目录,而不是 ROOT。
新的 doheader 助手函数
将给定的头文件安装到 /usr/include/ 中。如果指定了选项 -r,则会递归下降到给定的任何目录中。
新的 usex 助手函数
USAGE: usex <USE flag> [true output] [false output] [true suffix] [false suffix]
DESCRIPTION:
If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
 otherwise echo [false output][false suffix] (defaults to "no").

EAPI 5 阶段

src_test 支持并行测试
与旧的 EAPI 不同,默认的 src_test 实现不会将 -j1 选项传递给 emake。

EAPI 5 变量

EBUILD_PHASE_FUNC
在执行 ebuild 阶段函数(例如 pkg_setupsrc_unpack)期间,EBUILD_PHASE_FUNC 变量将包含当前正在执行的阶段函数的名称。

EAPI 6

EAPI 6 Bash 版本

Bash 版本
Ebuilds 可以使用 Bash 4.2 版本的功能(之前是 3.2)。

EAPI 6 ebuild 环境

区域设置
关于 ASCII 范围内的字符,大小写修改和排序顺序的行为(LC_CTYPELC_COLLATE)保证与 C 区域设置相同。
failglob 已启用
对于 EAPI=6,bash 的 failglob 选项在 ebuilds 的全局范围内设置。如果设置,文件名扩展期间的模式匹配失败会导致在 ebuild 被加载时出错。

EAPI 6 阶段

更新 src_prepare 的默认实现

此阶段不再是无操作,它支持通过 PATCHES 变量应用补丁,并通过 eapply_user 应用用户补丁。默认的 src_prepare 看起来像这样

src_prepare() {
    if [[ $(declare -p PATCHES 2>/dev/null) == "declare -a"* ]]; then
        [[ -n ${PATCHES[@]} ]] && eapply "${PATCHES[@]}"
    else
        [[ -n ${PATCHES} ]] && eapply ${PATCHES}
    fi
    eapply_user
}
新的 src_install 阶段函数

此阶段使用新的 einstalldocs 函数来安装文档。默认的 src_install 看起来像这样

src_install() {
    if [[ -f Makefile ]] || [[ -f GNUmakefile ]] || [[ -f makefile ]]; then
        emake DESTDIR="${D}" install
    fi
    einstalldocs
}

EAPI 6 辅助工具

einstall 被禁止
使用 EAPI=6 时,einstall 辅助工具已被禁止。
dohtml 已弃用
使用 EAPI=6 时,dohtml 辅助工具已被弃用。
非致命 die
当在 nonfatal 命令下并使用 -n 选项调用 dieassert 时,它们不会中止构建过程,而是返回错误。
eapply 支持
eapply 命令是 epatch(来自 eutils.eclass)的简化替代品,在包管理器中实现。来自其文件或目录参数的补丁使用 patch -p1 应用,但它接受 GNU patch 的 patch(1) 选项来覆盖默认行为。
eapply_user 支持

eapply_user 命令允许包管理器应用用户提供的补丁。必须在每个 src_prepare 函数中调用它。

econf 添加 --docdir--htmldir
除了现有选项之外,选项 --docdir--htmldir 会传递给 configure
in_iuse 支持
如果给定的参数在 ebuilds 的 USE 中可用,则 in_iuse 函数返回 true
unpack 更改
  • unpack 支持没有前导 ./ 的相对路径(unpack foo/bar.tar.gz 作为相对路径有效)。
  • unpack 支持 .txz(xz 压缩的 tarball)。
  • unpack 不区分大小写地匹配文件名扩展名。
einstalldocs 支持
einstalldocs 函数将安装由 DOCS 变量(如果 DOCS 未设置,则为一组默认文件)和 HTML_DOCS 变量指定的的文件。
get_libdir 支持
get_libdir 命令输出适合当前 ABI 的 lib* 目录基名。

EAPI 7

EAPI 7 术语

文档可以使用以下术语更好地描述依赖项和安装目标。

CHOST
将运行已安装包的系统。
CBUILD
用于构建包的系统。在不交叉编译的情况下,CBUILD == CHOST。
CTARGET
在某些交叉编译中使用,通常为空值。

EAPI 7 变量

PORTDIRECLASSDIR 已删除
PORTDIRECLASSDIR 不再定义,也不能在 ebuilds 中使用来访问这些目录。
DESTTREEINSDESTTREE 已删除
意外导出的变量 PORTDIRECLASSDIR 不能在 ebuilds 中使用来操作安装路径。请分别使用 intoinsinto 代替。
DEDROOTEROOT 已修改
使用 EAPI=7 时,这些变量不再包含尾部斜杠。
BDEPEND 已添加
以前,所有构建时工具和库都放在 DEPEND 中。现在,构建时依赖项被分成 DEPENDBDEPEND。区别仅仅是 BDEPEND 是要在 CBUILD 上执行的依赖项。 DEPEND 仍然用于其他依赖项,例如库,用于 CHOST。这改进了交叉编译支持。
BROOT 已添加
BROOT 是包含构建依赖项的根目录的绝对路径,包括任何前缀,这些依赖项由 BDEPEND 满足,通常是可执行的构建工具。
SYSROOTESYSROOT 已添加
SYSROOTDEPEND 中依赖项安装的位置。 ESYSROOT 是带有 EPREFIX 附加的 SYSROOT
ENV_UNSET 已添加
要从构建环境中删除的变量的空格分隔列表。

EAPI 7 元数据

禁止空分组
空分组,例如 DEPEND="|| ( ${empty_var} )" 现在会生成错误。此外,分组内的条件执行更加严格。例如,REQUIRED_USE="|| ( foo? ( bar ) baz? ( zoinks )" 以前可以使用 USE="-foo -baz",现在需要 USE="foo bar"USE="baz zoinks"

EAPI 7 配置文件

package.provided 被禁止
使用 EAPI=7 时,配置文件不再包含 package.provided 文件。

EAPI 7 辅助工具

dohtml 被禁止
使用 EAPI=7 时,dohtml 辅助工具已被禁止。
doliblibopts 被禁止
使用 EAPI=7 时,dolib 辅助工具和相关的 libopts 已被禁止。
has_versionbest_version 更改

has_versionbest_version 现在支持一个可选的开关来确定要检查哪种类型的依赖项。

  • -r(默认值)将检查运行时依赖项(RDEPEND)
  • -d 将检查 CHOST 构建时依赖项(DEPEND)
  • -b 将检查 CBUILD 构建时依赖项(BDEPEND)
版本操作和比较命令

EAPI=7 引入了三个命令用于常见的版本号操作。

  • ver_cut 获取版本字符串的子字符串
  • ver_rs 替换版本字符串中的分隔符
  • ver_test 比较两个版本

有关常见用法的示例,请参阅 版本和名称格式问题,或参阅 深入了解

新函数 eqawarn
使用 EAPI=7 时,已添加 eqawarn 辅助工具。此函数用于提醒开发人员注意已弃用的功能。以前,它包含在 eutils eclass 中,现在不再需要。
新函数 dostrip
使用 EAPI=7 时,已添加 dostrip 辅助工具。此函数控制是否剥离二进制文件。 dostrip -x [file] 将排除二进制文件被剥离。相反,当与 RESTRICT=strip 结合使用时,dostrip [file] 会选择要剥离的二进制文件。
dieassert 更改
这些命令现在可以在子 shell 中安全使用,就像它们是在主进程中调用一样。
nonfatal 更改
nonfatal 命令现在适用于 shell 函数和子进程。
domo 行为更改
domo(用于本地化)现在忽略 into 指令。这遵循类似的命令,例如 doinfodoman
econf 更改
已添加用于指定 CBUILDCTARGET 的交叉编译选项 --build--target 选项,并且它们对所有 EAPIs 都有追溯力。此外,如果构建支持 --with-sysroot,则将传递正确的值,以使正常和交叉编译成功。

EAPI 8

EAPI 8 树布局

对更新目录的命名规则要求没那么严格

在 EAPI 7 中,profiles/updates 目录中的文件必须遵循严格的季度命名规则,例如 2Q-2021,表示它们被添加的季度和年份。这种命名方式的副作用是,文件名按字母顺序排序不合适。

在 EAPI 8 中,删除了命名要求。最终,这将允许切换到按年份排序的更方便的方案。不同的时间段长度也将成为可能。

请注意,此更改实际上需要更改存储库 EAPI(位于 profiles/eapi 中),因此它至少在未来两年内不会影响 Gentoo。

EAPI 8 ebuild 格式

Bash 版本现在是 5.0

用于 ebuild 的 Bash 版本已从 4.2 更改为 5.0。这意味着 ebuild 现在不仅可以利用新 Bash 版本提供的功能,而且用于 ebuild 环境的 BASH_COMPAT 值也会更新,从而切换 shell 行为。

唯一的真正相关行为差异是

  • 现在从 "${var/.../"..."}" 替换的 RHS 参数中删除了引号

    var=foo
    echo "${var/foo/"bar"}"
    

    上面的代码片段在 Bash 4.2 中产生 "bar",但在 4.3+ 中只产生 bar

可能有趣的新功能包括

  • 现在可以使用负下标来设置和取消设置数组元素(Bash 4.3+)

    $ foo=( 1 2 3 )
    $ foo[-1]=4
    $ unset 'foo[-2]'
    $ declare -p foo
    declare -a foo=([0]="1" [2]="4")
    
  • 引入了 Nameref 变量,它们充当其他变量的引用(4.3+)

    $ foo=( 1 2 3 )
    $ declare -n bar=foo
    $ echo "${bar[@]}"
    1 2 3
    $ bar[0]=4
    $ echo "${foo[@]}"
    4 2 3
    $ declare -n baz=foo[1]
    $ echo "${baz}"
    2
    $ baz=100
    $ echo "${bar[@]}"
    4 100 3
    
  • [[ -v ... ]] 测试运算符可用于数组索引,以测试数组元素是否已设置(4.3+)。以下两行现在等效

    [[ -n ${foo[3]+1} ]]
    [[ -v foo[3] ]]
    
  • mapfile(也称为 readarray)现在可以通过 -d 接受一个分隔符,通过 -t 选项从读取数据中删除它(Bash 4.4+)。现在,以下两种从 find(1) 获取输出的解决方案等效

    # old solution
    local x files=()
    while read -d '' -r x; do
    	files+=( "${x}" )
    done < <(find -print0)
    
    # new solution
    local files=()
    mapfile -d '' -t files < <(find -print0)
    
  • 通过 ${foo@...} 参数扩展(4.4+)可以使用一组新的转换,例如,打印具有必要引号的值

    $ var="foo 'bar' baz"
    $ echo "${var@Q}"
    'foo '\''bar'\'' baz'
    

    有关更多详细信息,请参见:info bash Bash 参考手册

  • local - 可用于将单个字母(通过 set 损坏)的 shell 选项更改限制为函数范围,并在从函数返回时恢复它们(4.4+)。以下两个函数现在等效

    # old solution
    func() {
    	local prev_shopt=$(shopt -p -o noglob)
    	set -o noglob
    	${prev_shopt}
    }
    
    # new solution
    func() {
    	local -
    	set -o noglob
    }
    

    有关所有更改和新功能的完整信息,请参见 Bash 5.0(及更早版本)发行说明

EAPI 8 变量

选择性获取/镜像限制

在 EAPI 8 之前,获取和镜像限制在全局范围内应用。也就是说,如果你需要将相应的限制应用于至少一个 distfile,则必须将其应用于所有 distfile。但是,有时软件包使用专有 distfile 和免费 distfile 的组合,后者包括例如第三方补丁、艺术品。到目前为止,它们必须完全受到镜像限制。

EAPI 8 允许撤消对各个文件的获取和镜像限制。要使用此功能,请像以前一样设置 RESTRICT,然后使用特殊的 fetch+ 前缀指定可以从哪些 URL 获取,或者使用 mirror+ 前缀重新启用对各个文件的镜像。

类似于 fetch 限制意味着 mirror 限制,mirror 覆盖意味着 fetch 覆盖。

EAPI=8

SRC_URI="
	${P}.tgz
	fetch+https://example.com/${P}-patch-1.tgz
	mirror+https://example.com/${P}-fanstuff.tgz"

RESTRICT="fetch"

下表总结了新行为

RESTRICT URI 前缀 获取 镜像
(无) (任何) 允许 允许
镜像 (无) / fetch+ 允许 禁止
mirror+ 允许 允许
获取 (无) 禁止 禁止
fetch+ 允许 禁止
mirror+ 允许 允许
安装时依赖项 (IDEPEND)

安装时依赖项的主要用途是指定 pkg_postinst 阶段需要的依赖项,这些依赖项可以在之后取消合并。这与 RDEPEND 几乎相同,除了取消合并部分——卸载一些工具似乎没有理由去证明另一种依赖项类型的合理性。

随着 EAPI 7 中的交叉编译支持,添加了一种新的依赖项类型,它专注于构建主机 (CBUILD) 工具——BDEPEND。不幸的是,这错过了交叉编译时运行安装到目标系统的可执行文件的用例。RDEPEND 不再是拉取 pkg_postinst 工具的合适方法;并且由于 BDEPEND 在从二进制包安装时未使用,因此需要一些新东西。

这就是 IDEPEND 的用武之地。它与 RDEPEND 的关系类似于 BDEPENDDEPEND 的关系。类似于 BDEPEND,它指定必须为 CBUILD 三元组构建并安装到 BROOT 中的包(因此可以使用 has_version -b 查询)。但是,类似于 RDEPEND,它在合并软件包而不是从源代码构建软件包时使用。它保证在整个 pkg_preinstpkg_postinst 中得到满足,并且可以在之后卸载。

EAPI=8

inherit xdg-utils

IDEPEND="dev-util/desktop-file-utils"

pkg_postinst() {
	xdg_desktop_database_update
}

pkg_postrm() {
	xdg_desktop_database_update
}

在上例中,ebuild 需要在安装或卸载后更新图标缓存。通过将相应的工具放在 IDEPEND 中,ebuild 请求它在 pkg_postinst 时可用。交叉编译时,该工具将为 CBUILD 构建,因此可以直接由 ebuild 执行。

下表显示了 EAPI 8 的依赖项类型。

依赖项类型 BDEPEND IDEPEND DEPEND RDEPEND PDEPEND
出现在 构建 安装 构建 安装 n/a
二进制兼容于 CBUILD CHOST
基本未加前缀的路径 / SYSROOT ROOT
相关偏移前缀 BROOT EPREFIX(除非 SYSROOT != ROOT) EPREFIX
与前缀组合的路径 BROOT ESYSROOT EROOT
PM 查询命令选项 -b -d -r
PROPERTIESRESTRICT 现在在 eclass 中累积

在 EAPI 7 中,在源代码 eclass 时,PROPERTIESRESTRICT 被视为常规 Bash 变量。这意味着,如果 eclass 或 ebuild 想修改它们,它们必须显式地追加到它们,例如通过 +=。这与其他一些变量(但并非全部)的处理方式不一致,并且对开发者来说令人困惑。例如,请考虑以下代码片段

EAPI=7

inherit git-r3

PROPERTIES+=" live"

请注意,你需要追加到 git-r3 eclass 设置的 PROPERTIES,否则 ebuild 将覆盖它。在 EAPI 8 中,你终于可以这样做

EAPI=8

inherit git-r3

PROPERTIES="live"

现在,在 eclass 和 ebuild 中累积的元数据变量完整列表包括:IUSEREQUIRED_USE*DEPENDPROPERTIESRESTRICT。不被视为这种方式的变量是:EAPIHOMEPAGESRC_URILICENSEKEYWORDSEAPIKEYWORDS 不应该在 eclass 中设置;至于其他变量,似乎有一个有效的用例,即 eclass 提供默认值,而 ebuild 能够覆盖它们。

EAPI 8 阶段函数

pkg_* 阶段现在在一个专用的空目录中运行

在 EAPI 8 之前,初始工作目录仅为 src_* 阶段指定。对于其他阶段(例如 pkg_* 阶段),ebuild 不应该假设任何特定目录。在 EAPI 8 中,这些阶段保证会在专门的空目录中启动。

使用空目录的想法很简单——如果目录中没有文件,则工具与其当前工作目录之间的意外和难以预测的交互风险将降至最低。

PATCHES 不再允许选项

默认 src_prepare 实现中的 eapply 调用已更改为

eapply -- "${PATCHES[@]}"

这确保了 PATCHES 变量中的所有项目都被视为路径名。作为副作用,现在无法通过 PATCHES 变量指定 patch 选项。这种技巧从未在 Gentoo 仓库中使用过,但它们曾在用户贡献的 ebuild 中出现过。以下将不再起作用

PATCHES=( -p0 "${FILESDIR}"/${P}-foo.patch )

相反,您需要显式调用 eapply,请参阅以下示例。或者,重新整理补丁级别。

src_prepare() {
	eapply -p0 "${FILESDIR}"/${P}-foo.patch
	eapply_user
}

EAPI 8 命令

新的 econf 传递选项

如果 --help 文本表明支持它们,则 econf 助手已被修改为将两个更多选项传递给配置脚本。它们是

  • --datarootdir="${EPREFIX}"/usr/share
  • --disable-static

前一个选项定义了用于确定系统/桌面特定数据文件位置(例如 .desktop 文件和各种文档)的基本目录。对于覆盖 --prefix 的 ebuild 来说,这是必需的,因为默认路径相对于它。

后一个选项默认情况下禁用构建静态库。这是正在进行的禁用无条件安装静态库工作的一部分(Gentoo 策略指南,静态库的安装)。

dosym -r 用于创建相对符号链接

相对符号链接目标往往更可靠。考虑以下两个示例

dosym "${EPREFIX}"/usr/lib/frobnicate/frobnicate /usr/bin/frobnicate
dosym ../lib/frobnicate/frobnicate /usr/bin/frobnicate

第一行使用绝对路径创建符号链接。问题在于,如果您将 Gentoo 系统挂载到根文件系统的子目录(例如,用于恢复),则符号链接将指向错误的位置。使用相对符号链接(如第二行所示)可确保符号链接独立于文件系统挂载位置而工作。

另一个事实是,您需要显式地在作为 dosym 的第一个参数传递的绝对路径之前添加 ${EPREFIX}。使用相对目标可以完全避免这个问题,并降低忘记前缀的可能性。

然而,在某些情况下,确定相对路径可能很困难或不方便。如果一个(或两个)路径来自外部工具,尤其如此。为了简化操作,EAPI 8 添加了一个新的 -r 选项,它使 dosym 创建一个指向指定路径的相对符号链接(类似于 ln -r

dosym -r /usr/lib/frobnicate/frobnicate /usr/bin/frobnicate

请注意,在这种情况下,您不会传递 ${EPREFIX}。助手确定到第一个参数的逻辑相对路径,并创建相应的相对符号链接。在这里理解这一点非常重要:此功能不处理物理路径,即它只有在路径上没有会导致 .. 解析为不同路径的目录符号链接时才起作用。例如,以下将不起作用

dosym bar/foo /usr/lib/foo
dosym -r /usr/lib/zomg /usr/lib/foo/zomg

/usr/lib/foo/zomg/usr/lib/zomg 的逻辑路径是 ../zomg。但是,由于 /usr/lib/foo 实际上是一个指向 /usr/lib/bar/foo 的符号链接,因此 /usr/lib/foo/.. 解析为 /usr/lib/bar。如果您需要考虑这样的目录符号链接,则需要显式指定正确的路径

dosym bar/foo /usr/lib/foo
dosym ../../zomg /usr/lib/foo/zomg
insoptsexeopts 现在仅适用于 doinsdoexe

在以前的 EAPI 中,insoptsexeopts 如何应用于各种助手存在不一致。特别是,大多数助手(例如 dobindodoc 等等)忽略了通过这些助手指定的选项,但少数助手没有。

EAPI 8 改变了以下助手的行为,这些助手过去会尊重 insoptsexeopts

  • doconfd
  • doenvd
  • doheader
  • doinitd

在 EAPI 8 中,它们始终使用默认选项。因此,insopts 现在仅影响 doins/newins,而 exeopts 仅影响 doexe/newexe。此外,diropts 不会影响这些助手隐式创建的目录。

usev 现在接受第二个参数

usev 助手是为了提供 Portage 历史上的行为,即在匹配时输出 USE 标志名称。在 EAPI 8 中,它得到了扩展,以提供对具有空第三个参数的三参数 usex 的替代方法(二参数 usex 变体对错误分支使用默认值 no)。

换句话说,以下两个调用现在是等效的

$(usex foo --enable-foo '')
$(usev foo --enable-foo)

这对于接受单个 --enable--disable 选项但不能接受其对应选项的自定义构建系统特别有用。

因此,usevusex 现在可以用于实现以下表格中概述的所有常见(和不常见)输出需求。

变体
usev flag flag
usev flag true true
usex flag yes no
usex flag true true no
usex flag true false true false
hasqhasvuseq 函数已被禁止

在其早期,use 助手会在匹配时除了其布尔退出状态之外还会打印 USE 标志名称。后来,添加了静默的 useq 和详细的 usev 助手,而 use 默认情况下变为静默。相同的更改应用于 has

快进到 EAPI 7,仍然有三种 use 变体和三种 has 变体。静默的基本变体,等效于基本变体的 useq/hasq 变体,以及详细的 usev/hasv 变体。

显然,不可能为 hasv 添加第二个参数,因此在 EAPI 8 中,它的行为将与 usev 不一致。由于 hasv 未在 Gentoo 仓库中使用,因此它已被删除,连同 hasquseq 也被删除,因为它们自 2011 年以来就被认为已弃用。

unpack 删除了对 7-Zip、LHA 和 RAR 格式的支持

unpack 中最不常用的存档格式的支持已被删除

  • 7-Zip (.7z)
  • LHA (.lha, .lzh)
  • RAR (.rar)

使用这些格式作为 distfile 的包现在必须手动解包它们。建议为此使用 unpacker.eclass