EAPI 使用和描述
该 软件包管理器规范 (PMS) 是一个标准化工作,旨在确保 ebuild 文件格式、ebuild 仓库格式(Gentoo 仓库是 Gentoo 的主要形式)以及与这些 ebuild 交互的软件包管理器的行为得到妥善记录和一致。
EAPI 是在 ebuild 和其他软件包管理器相关文件中定义的版本,它告知软件包管理器有关文件语法和内容的信息。实际上,它就是文件所遵循的软件包管理器规范 (PMS) 的版本。
本节提供不同 EAPI 的使用和描述。
EAPI 的使用
app-doc/pms 的形式提供。必须通过在 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 5
EAPI 5 元数据
- REQUIRED_USE 支持新的最多一个运算符
- 新的 最多一个 运算符由字符串 ??组成,如果其子元素中匹配的元素为零或一个(但不能超过一个),则满足此运算符。
- SLOT 支持可选的“子槽”部分
- SLOT变量可以包含一个可选的 子槽 部分,该部分位于常规槽之后,并用- /字符分隔。子槽必须是有效的槽名称。子槽用于表示将软件包升级到具有不同子槽的新版本时,可能需要重建依赖软件包的情况。当从 SLOT 定义中省略子槽部分时,该软件包被视为具有一个隐式子槽,该子槽等于常规槽。
- 依赖关系中的槽运算符和子槽
- 
    槽依赖关系可以包含一个可选的子槽部分,该部分位于常规槽之后,并用 /字符分隔。这对于安装预编译二进制文件的软件包很有用,这些二进制文件需要具有特定 soname 版本的库,该版本对应于子槽。例如RDEPEND="dev-libs/foo:0/3"软件包依赖关系规范可以使用 槽运算符 来明确说明如果运行时依赖关系的槽和/或子槽发生更改会发生什么 - 
        :*表示任何槽值都是可以接受的。此外,对于运行时依赖关系,表示指定依赖关系的软件包在匹配依赖关系的软件包被具有不同槽和/或子槽的不同匹配软件包替换时不会中断。
- 
        :=表示任何槽值都是可以接受的。此外,对于运行时依赖关系,表示指定依赖关系的软件包将中断,除非存在一个匹配依赖关系的软件包,并且其槽和子槽等于指定依赖关系的软件包安装时匹配该依赖关系的最佳已安装版本的槽和子槽。
- 
        :slot=表示只接受特定的槽值,并且在其他方面与:=运算符的行为相同。注意:使用:slot/subslot而不使用=来依赖特定的槽和子槽对;在 ebuild 中使用:slot/subslot=是语法错误。
 :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升级到具有不同子槽的版本时,软件包应重建,但是baz或wombat:0的子槽更改应忽略。
- 
        
EAPI 5 配置文件
- 配置文件稳定 USE 强制和屏蔽
- 在支持稳定屏蔽的 EAPI 的配置文件目录中,支持新的 USE 配置文件:use.stable.mask、use.stable.force、package.use.stable.mask和package.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 6
EAPI 6 ebuild 环境
- 区域设置
- 关于 ASCII 范围内的字符,大小写修改和排序顺序的行为(LC_CTYPE和LC_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选项调用die或assert时,它们不会中止构建过程,而是返回错误。
- 
eapply支持
- eapply命令是- epatch(来自- eutils.eclass)的简化替代品,在包管理器中实现。来自其文件或目录参数的补丁使用 patch- -p1应用,但它接受 GNU patch 的- patch(1)选项来覆盖默认行为。
- 
eapply_user支持
- 
    eapply_user命令允许包管理器应用用户提供的补丁。必须在每个src_prepare函数中调用它。注意:当调用默认的src_prepare时,不需要显式调用eapply_user。
- 
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 变量
- 
PORTDIR和ECLASSDIR已删除
- 
    PORTDIR和ECLASSDIR不再定义,也不能在 ebuilds 中使用来访问这些目录。
- 
DESTTREE和INSDESTTREE已删除
- 意外导出的变量 PORTDIR和ECLASSDIR不能在 ebuilds 中使用来操作安装路径。请分别使用into或insinto代替。
- 
D、ED、ROOT和EROOT已修改
- 使用 EAPI=7时,这些变量不再包含尾部斜杠。
- 
BDEPEND已添加
- 以前,所有构建时工具和库都放在 DEPEND中。现在,构建时依赖项被分成DEPEND和BDEPEND。区别仅仅是BDEPEND是要在 CBUILD 上执行的依赖项。DEPEND仍然用于其他依赖项,例如库,用于 CHOST。这改进了交叉编译支持。
- 
BROOT已添加
- 
    BROOT是包含构建依赖项的根目录的绝对路径,包括任何前缀,这些依赖项由 BDEPEND 满足,通常是可执行的构建工具。
- 
SYSROOT和ESYSROOT已添加
- 
    SYSROOT是DEPEND中依赖项安装的位置。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 辅助工具
- 
dohtml被禁止
- 使用 EAPI=7时,dohtml辅助工具已被禁止。
- 
dolib和libopts被禁止
- 使用 EAPI=7时,dolib辅助工具和相关的libopts已被禁止。
- 
has_version和best_version更改
- 
    has_version和best_version现在支持一个可选的开关来确定要检查哪种类型的依赖项。- 
-r(默认值)将检查运行时依赖项(RDEPEND)
- 
-d将检查 CHOST 构建时依赖项(DEPEND)
- 
-b将检查 CBUILD 构建时依赖项(BDEPEND)
 
- 
- 版本操作和比较命令
- 
    EAPI=7 引入了三个命令用于常见的版本号操作。 - 
ver_cut获取版本字符串的子字符串
- 
ver_rs替换版本字符串中的分隔符
- 
ver_test比较两个版本
 
- 
- 新函数 eqawarn
- 使用 EAPI=7时,已添加eqawarn辅助工具。此函数用于提醒开发人员注意已弃用的功能。以前,它包含在eutilseclass 中,现在不再需要。
- 新函数 dostrip
- 使用 EAPI=7时,已添加dostrip辅助工具。此函数控制是否剥离二进制文件。dostrip -x [file]将排除二进制文件被剥离。相反,当与 RESTRICT=strip 结合使用时,dostrip [file]会选择要剥离的二进制文件。
- 
die和assert更改
- 这些命令现在可以在子 shell 中安全使用,就像它们是在主进程中调用一样。
- 
nonfatal更改
- nonfatal命令现在适用于 shell 函数和子进程。
- 
domo行为更改
- 
    domo(用于本地化)现在忽略into指令。这遵循类似的命令,例如doinfo和doman。
- 
econf更改
- 已添加用于指定 CBUILD和CTARGET的交叉编译选项--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"下表总结了新行为 RESTRICTURI 前缀 获取 镜像 (无) (任何) 允许 允许 镜像 (无) / fetch+ 允许 禁止 mirror+ 允许 允许 获取 (无) 禁止 禁止 fetch+ 允许 禁止 mirror+ 允许 允许 
- 安装时依赖项 (IDEPEND)
- 
    安装时依赖项的主要用途是指定 pkg_postinst阶段需要的依赖项,这些依赖项可以在之后取消合并。这与RDEPEND几乎相同,除了取消合并部分——卸载一些工具似乎没有理由去证明另一种依赖项类型的合理性。随着 EAPI 7 中的交叉编译支持,添加了一种新的依赖项类型,它专注于构建主机 ( CBUILD) 工具——BDEPEND。不幸的是,这错过了交叉编译时运行安装到目标系统的可执行文件的用例。RDEPEND不再是拉取pkg_postinst工具的合适方法;并且由于BDEPEND在从二进制包安装时未使用,因此需要一些新东西。这就是 IDEPEND的用武之地。它与RDEPEND的关系类似于BDEPEND与DEPEND的关系。类似于BDEPEND,它指定必须为CBUILD三元组构建并安装到BROOT中的包(因此可以使用has_version -b查询)。但是,类似于RDEPEND,它在合并软件包而不是从源代码构建软件包时使用。它保证在整个pkg_preinst和pkg_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
- 
    PROPERTIES和RESTRICT现在在 eclass 中累积
- 
    在 EAPI 7 中,在源代码 eclass 时, PROPERTIES和RESTRICT被视为常规 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 中累积的元数据变量完整列表包括: IUSE、REQUIRED_USE、*DEPEND、PROPERTIES、RESTRICT。不被视为这种方式的变量是:EAPI、HOMEPAGE、SRC_URI、LICENSE、KEYWORDS。EAPI和KEYWORDS不应该在 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
- 
    insopts和exeopts现在仅适用于doins和doexe
- 
    在以前的 EAPI 中, insopts和exeopts如何应用于各种助手存在不一致。特别是,大多数助手(例如dobin、dodoc等等)忽略了通过这些助手指定的选项,但少数助手没有。EAPI 8 改变了以下助手的行为,这些助手过去会尊重 insopts或exeopts- 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选项但不能接受其对应选项的自定义构建系统特别有用。因此, usev和usex现在可以用于实现以下表格中概述的所有常见(和不常见)输出需求。变体 真 假 usev flag flag usev flag true true usex flag yesnousex flag true true nousex flag true false true false 
- 
hasq、hasv和useq函数已被禁止
- 
    在其早期, use助手会在匹配时除了其布尔退出状态之外还会打印 USE 标志名称。后来,添加了静默的useq和详细的usev助手,而use默认情况下变为静默。相同的更改应用于has。快进到 EAPI 7,仍然有三种 use变体和三种has变体。静默的基本变体,等效于基本变体的useq/hasq变体,以及详细的usev/hasv变体。显然,不可能为 hasv添加第二个参数,因此在 EAPI 8 中,它的行为将与usev不一致。由于hasv未在 Gentoo 仓库中使用,因此它已被删除,连同hasq和useq也被删除,因为它们自 2011 年以来就被认为已弃用。
- unpack 删除了对 7-Zip、LHA 和 RAR 格式的支持
- 
    对 unpack中最不常用的存档格式的支持已被删除- 7-Zip (.7z)
- LHA (.lha, .lzh)
- RAR (.rar)
 使用这些格式作为 distfile 的包现在必须手动解包它们。建议为此使用 unpacker.eclass。