变量

ebuild 中必须设置一些特殊的变量,并且还可以选择指定更多变量。还有一些预定义的变量,在整个 ebuild 中都有用。

预定义只读变量

以下变量已为您定义。您不得尝试设置它们。开发人员在编写 ebuild 时不应依赖这些变量的包管理器特定值。

变量 用途
P 包名称和版本(不包括修订版,如果有),例如 vim-6.3
PN 包名称,例如 vim
PV 包版本(不包括修订版,如果有),例如 6.3。它应该反映上游的版本控制方案。
PR 包修订版,或 r0 如果不存在修订版。
PVR 包版本和修订版(如果有),例如 6.36.3-r1
PF 完整包名称,${PN}-${PVR},例如 vim-6.3-r1
A 包的所有源文件(不包括由于 USE 标志而不可用的文件)。
CATEGORY 包的类别,例如 app-editors
FILESDIR 包的 files/ 目录的路径,通常用于存放小的补丁和其他文件。
WORKDIR ebuild 的根构建目录的路径。例如:"${PORTAGE_BUILDDIR}/work"
T ebuild 可以使用的临时目录的路径。例如:"${PORTAGE_BUILDDIR}/temp"
D 临时安装目录的路径。例如:"${PORTAGE_BUILDDIR}/image"
HOME ebuild 调用的任何可能读取或修改主目录的程序使用的临时目录的路径。例如:"${PORTAGE_BUILDDIR}/homedir"
ROOT 要将包合并到的根目录的绝对路径。仅在 pkg_* 阶段允许。请参阅 ROOT
DISTDIR 包含为包获取的所有文件存储到的目录的路径。
EPREFIX 偏移安装的标准化偏移前缀路径。有关更多信息,请参阅 Gentoo 前缀技术文档
ED ${D%/}${EPREFIX}/ 的简写。
EROOT ${ROOT%/}${EPREFIX}/ 的简写。
SYSROOT (EAPI=7) 包含由 DEPEND 满足的构建依赖项的根目录的绝对路径
ESYSROOT (EAPI=7) ${SYSROOT%/}${EPREFIX}/ 的简写。
BROOT (EAPI=7) 包含由 BDEPEND 满足的构建依赖项的根目录的绝对路径,通常是可执行的构建工具。
MERGE_TYPE 正在合并的包的类型。可能的值有:source 如果是从源代码构建和安装包,binary 如果是安装先前从 ebuild 构建的二进制包,buildonly 如果是构建二进制包但不安装它。
REPLACING_VERSIONS 所有正在被替换(卸载或覆盖)的此包的版本 (PVR) 的空格分隔列表,作为本次安装的结果。它是一个列表,而不是单个可选值,用于处理诸如安装 foo-2:2 以替换 foo-2:1foo-3:2 等病态情况。在 pkg_preinstpkg_postinst 中可用。
REPLACED_BY_VERSION 正在替换此 ebuild 提供的版本的此包的单个版本 (PVR),如果它正在作为安装的一部分被卸载。否则为空字符串,即,如果它正在被卸载而没有替换。在 pkg_prermpkg_postrm 中可用。

ROOT

ROOT 的理念是,可以使用 ROOT=/somewhere 构建系统,然后 chroot 到其中或将 /somewhere 打包为系统映像。它并非旨在允许用户运行 /somewhere/usr/bin/foo

ebuild 只能在 pkg_* 阶段引用 ROOT。它不能在 src_* 阶段正确使用,因为合并二进制包时 ROOT 可能不同。例如,二进制包可以使用 ROOT=/ 构建,然后使用 ROOT=/somewhere 安装到系统上。

构建包时,不应使用 ROOT 来满足对库、头文件等的必要依赖项。相反,应使用 / 指定构建系统上的文件。

在交叉编译环境中,ebuild 不得调用 ROOT 内的任何二进制文件,因为它们可能无法在构建系统上执行。

以下是一个 ebuild 示例,它在 pkg_postinst() 中使用 ROOT,如果旧的和过时的配置文件仍然存在,则有条件地打印错误消息

pkg_postinst() {
	if [[ -e ${ROOT}/etc/oldconfig ]]; then
		ewarn "You still have the obsolete config file"
		ewarn "    ${ROOT}/etc/oldconfig."
		ewarn "Please migrate your settings to ${ROOT}/etc/newconfig"
		ewarn "and remove ${ROOT}/etc/oldconfig."
	fi
}

Ebuild 定义的变量

以下变量可能或必须由每个 ebuild 定义。

变量 用途
EAPI EAPI。请参阅 EAPI 用法和描述
DESCRIPTION 对包用途的简短描述(不超过 80 个字符)。必填。
HOMEPAGE 包的主页(网址)。必填(虚拟包除外),接受多个值。在某些情况下,习惯上除了主要主页外,还提供包跟踪器和/或代码托管链接(例如,Python 包的 PyPI 链接,当代码无法轻松地在主页上找到时提供 GitHub 链接),以方便起见。如果包没有主页,请将其设置为 https://wiki.gentoo.org/wiki/No_homepage。切勿在字符串中引用变量名;仅包含原始文本。
SRC_URI 包的源 URI 列表。可以包含 USE 条件部分,请参阅 SRC_URI
LICENSE 包的许可证,与 licenses/ 中的文件完全一致(包括大小写)。必填(虚拟包除外)。请参阅 LICENSE
SLOT 包的 SLOT。必填。请参阅 SLOT
KEYWORDS 请参阅 KEYWORDS关键字和稳定化
IUSE ebuild 中使用的所有 USE 标志(不包括架构标志,但包括 USE_EXPAND 标志)的列表。请参阅 IUSE
REQUIRED_USE 必须由 USE 标志的配置满足的一组断言,才能对该 ebuild 有效。请参阅 REQUIRED_USE
PROPERTIES 属性的空格分隔列表,支持条件语法。 interactivelivetest_network 是有效值。
RESTRICT 要限制的 Portage 功能的空格分隔列表。有效值为 fetchmirrorstriptestuserpriv。有关详细信息,请参阅 man 5 ebuild
DEPEND 包的构建依赖项列表。请参阅 依赖项。从 EAPI-7 开始,仅适用于 CHOST。
BDEPEND (EAPI=7) 包的 CBUILD 构建依赖项列表。请参阅 依赖项
RDEPEND 包的运行时依赖项列表。请参阅 依赖项
PDEPEND 合并包后要安装(如果可能)的包列表。仅当 RDEPEND 会导致循环依赖时才使用此方法。请参阅 依赖项
S src_compilesrc_install 使用的临时构建目录的路径。默认值:"${WORKDIR}/${P}"。如果此变量与默认值相同,则 ebuild **不应**为此变量提供值。
DOCS 默认 src_install 函数要使用 dodoc 安装的文档文件的数组或空格分隔列表。如果未定义,则使用合理的默认列表。请参阅 默认 src_install 函数
HTML_DOCS

用于 einstalldocs 函数递归安装的文档文件或目录的数组或空格分隔列表。(需要 EAPI>=6。)

SRC_URI

条件源

基于 USE 标记的条件源文件可以使用通常的 flag? ( ) 语法。这通常对于特定于架构的代码或二进制包很有用——在 ppc 上下载 sparc 二进制文件将浪费带宽。

SRC_URI="https://example.com/files/${P}-core.tar.bz2
	x86?   ( https://example.com/files/${P}/${P}-sse-asm.tar.bz2 )
	ppc?   ( https://example.com/files/${P}/${P}-vmx-asm.tar.bz2 )
	sparc? ( https://example.com/files/${P}/${P}-vis-asm.tar.bz2 )
	doc?   ( https://example.com/files/${P}/${P}-docs.tar.bz2 )"

重命名源

有时上游 URI 使用通用的名称,在创建单个镜像时很容易与其他包冲突。使用 -> 语法允许您在从上游获取文件时重命名它,以便存储在镜像和本地 distdir 中。

这里我们从上游下载一个文件,该文件具有简单的名称,例如 1.0.tar.gz,并使用更好的名称(例如 thepackage-1.0.tar.gz)保存/镜像它。像往常一样,所有标记(包括运算符和输出文件名)都必须用空格分隔。

SRC_URI="https://example.com/files/${PV}.tar.gz -> ${P}.tar.gz"

第三方镜像

如果 SRC_URI 中的项目在多个第三方镜像上可用,并且同一组镜像在多个 ebuild 中共享,那么您不必在每个 ebuild 中重复列出它们。 ::gentoo 存储库中的 profiles/thirdpartymirrors 文件包含以包管理器规范 (PMS) 指定的格式命名的镜像组,可通过 mirror:// 伪协议访问。

可以定义一组“示例”镜像,

example https://download.example.com https://mirror1.example.org/example

之后可以通过 mirror:// URI 引用它们。

SRC_URI="mirror://example/${PN}/${P}.tar.gz"

使用 thirdpartymirrors 有两种有效情况:

  1. 为镜像或获取受限包提供多个下载位置,
  2. 处理通过镜像网络分发其 distfile 而没有主要下载位置或跳板服务的上游。

在任何其他情况下,都必须使用主要位置。distfile 将 镜像到 Gentoo 基础设施;在这种情况下,使用第三方镜像列表的好处不超过维护它的负担。

解除限制

在 EAPI 8 中,可以通过在地址前添加 mirror+fetch+ 来免除 SRC_URI 中各个项目的自动镜像和获取限制(由 RESTRICT="mirror"RESTRICT="fetch" 强制执行)。例如,在以下 ebuild 中,

EAPI="8"

SRC_URI="${P}.tar.gz
	mirror+https://dev.gentoo.org/~larry/distfiles/${P}-addons.tar.gz"

RESTRICT="fetch"

Portage 将被阻止尝试按预期获取 ${P}.tar.gz,但 ${P}-patches.tar.gz 文件将不受限制地由 Portage 镜像和获取。

下表显示了当设置 RESTRICT="mirror"RESTRICT="fetch" 时前缀的效果。

(无前缀) fetch+ mirror+
(无 RESTRICT) 获取和镜像 获取和镜像 获取和镜像
RESTRICT="mirror" 仅获取 仅获取 获取和镜像
RESTRICT="fetch" 无法获取 仅获取 获取和镜像

LICENSE

可以指定多个 LICENSE 条目,以及仅在设置特定 USE 标记时才适用的条目。格式与 DEPEND 相同。有关详细信息,请参阅 GLEP 23

SLOT

当不需要插槽时,使用 SLOT="0"。不要使用 SLOT="",因为变量不能为空。

有关此变量的更多信息,请参阅 插槽,并参阅 包和插槽移动

KEYWORDS

KEYWORDS 中涉及 * 的唯一有效构造是 -*。不要使用 KEYWORDS="*"KEYWORDS="~*"

有关如何处理此变量,请参阅 关键字和稳定化

IUSE

请注意,IUSE 变量是累积的,因此无需在 ebuild 的 IUSE 中指定仅在继承的 eclass 中使用的 USE 标记。

架构 USE 标记(sparcmipsx64-macos 等)不应列出。

REQUIRED_USE

REQUIRED_USE 变量包含一个断言列表,这些断言必须由 USE 标记的配置满足,才能对该 ebuild 有效。为了匹配,终端元素中的 USE 标记必须启用(如果它有感叹号前缀,则禁用)。

本质上,REQUIRED_USEDEPEND 风格语法的类似物。例如,要说明某些组合是被禁止的,即“如果设置了 foo,则必须取消设置 bar”

REQUIRED_USE="foo? ( !bar )"

要说明“如果设置了 foo,则必须激活 bar、baz 和 quux 中的至少一个”

REQUIRED_USE="foo? ( || ( bar baz quux ) )"

要说明“foo、bar 或 baz 中只有一个必须设置,但不能设置多个”

REQUIRED_USE="^^ ( foo bar baz )"

请注意,最后一个关系是异或 (XOR) 的关系。虽然可以使用通常的 DEPEND 语法形成 XOR,但为此情况添加了一个特定的 ^^ 运算符。

最后,要说明“foo、bar 或 baz 中的至少一个必须设置”

REQUIRED_USE="|| ( foo bar baz )"

EAPI 5

EAPI 5 添加了一个额外的案例来简化冲突的 USE 标记。

要说明“foo、bar 或 baz 中的零个或一个必须设置,但不能设置多个”

REQUIRED_USE="?? ( foo bar baz )"

在之前的 EAPI 中,这将与以下相同:

REQUIRED_USE="foo? ( !bar !baz ) bar? ( !foo !baz ) baz? ( !foo !bar )"

RESTRICT

虽然 Portage 可能会识别几个不同的 RESTRICT 标记,但重要的是不要依赖它们的存在。也就是说,您应该确保您的 ebuild 在这些标记不存在或由其他包管理器赋予不同的名称时不会失败。您可以使用 Portage 提供的 RESTRICT 标记,但如果没有它们,不要硬性失败。有关标准化 RESTRICT 标记的列表,请参阅 PMS 或上表。

为包管理器保留的变量

以以下任何字符串开头的变量和函数(不区分大小写)都为包管理器使用保留。Ebuild 不得使用它们或依赖它们。

  • __(两个下划线)
  • abort
  • dyn
  • prep

同样适用于包含以下任何字符串(不区分大小写)的函数和变量:

  • ebuild(除非紧接在另一个字母之前,并且除了 EBUILD_PHASEEBUILD_PHASE_FUNC 变量)
  • hook
  • paludis
  • portage

版本和名称格式问题

通常,上游的 tarball 版本控制或命名格式并不完全遵循 Gentoo 约定。在名称中使用大写字母或在版本中使用下划线和连字符的方式存在差异尤其常见。例如,Gentoo 称为 foo-1.2.3b 的内容可能期望一个名为 Foo-1.2-3b.tar.bz2 的 tarball。最好不要硬编码包字符串,而是创建 MY_PNMY_PVMY_P 变量并使用它们来定义上游命名。EAPI=7 推出了新的一组函数,ver_cut、ver_rs 和 ver_test。除非您确定自己知道自己在做什么,否则应使用这些函数重新定义版本,这是简单的方法。

MY_PN="Foo"
# Replace the second period separator in PV with -
MY_PV=$(ver_rs 2 '-')
MY_P="${MY_PN}-${MY_PV}"

此代码的优点是即使上游切换到 Foo-1.3-4.5.tar.bz2 这样的格式(是的,这种情况确实会发生),它也将继续工作。

也可以使用 bash 替换来实现相同的效果,但这很复杂、容易出错且难以阅读。

一些 ebuild 使用对 sedawk 和/或 cut 的调用来执行此操作。对于任何新代码都不能这样做,并且应该修复为使用内置的版本操作命令或 Bash 替换。强烈不建议使用全局范围的非 Bash 代码。

ver_ 函数用于从版本字符串中提取特定组件。有关进一步的文档和示例,请参阅 版本函数参考。以下是这些函数的简要总结。

函数 用途
ver_rs [范围] ' ' 获取重要的版本组件,不包括“.”、“-”和“_”。
ver_cut 1 获取主版本。
ver_cut [范围] 从版本字符串中提取一系列子部分。
ver_cut 2- 获取主版本之后的所有内容。
ver_rs [范围] [字符] 替换特定的版本分隔符。
ver_rs 1- [字符] 替换所有版本分隔符。
ver_rs [范围] '' 删除版本分隔符。
ver_rs 1- '' 删除所有版本分隔符。

变量中的尾部斜杠

在 EAPI 7 中,以下变量从不以尾部斜杠结尾:DEDROOTEROOT。相反,在 EAPI 7 之前的 EAPI 中,这些变量保证以尾部斜杠结尾。在使用 EAPI 7 之前的 EAPI 时,鼓励开发人员使用 bash 后缀删除尾部斜杠,并在连接路径时添加显式的 /。例如:${D%/}/${ED%/}/${ROOT%/}/${EROOT%/}/

在 ebuild 中使用常量值变量

变量在ebuild中具有重要的价值,可以避免不必要的重复,并简化维护。但是,对常量值变量的引用应该谨慎使用,因为过度使用会影响可读性并增加维护负担(例如,当重命名包时)。特别是,应避免使用其值与预期字符串没有直接关联的变量。

有益的常量值变量引用的示例包括:

  • SRC_URIS中使用${PV}及其派生变量(${P}${MY_P}等),以避免在每次版本更新时都需要更新这些变量(假设${PV}用于指示上游版本);
  • --docdir路径中使用${PF}——这是一个规范的Gentoo路径,始终需要与${PF}匹配。

错误的常量值变量引用的示例包括:

  • HOMEPAGEEGIT_REPO_URISRC_URI的域名中使用${PN}——这会破坏编辑器和终端中的URL解析,并且难以复制链接以供外部使用(例如,通过gitweb进行审查),
  • SRC_URI中使用${HOMEPAGE}——当主页更改或添加其他条目时,这会导致问题,
  • src_install()中过度使用${PN}(或其他不必要的辅助变量)——这会降低可读性,而收益甚微,并且当需要重命名包时会造成很多麻烦。

用户环境

以下变量可以在用户的环境中设置,并且所有ebuild都应尊重这些变量。每个变量在Gentoo中的用途与有效值的示例一起列出。上游用法可能会有所不同,但ebuild应确保在Gentoo中一致地解释这些变量。所选含义受到一些真实和事实上的标准的启发

许多这些变量只有在直接调用时才有效。例如,您的编译器驱动程序通常负责组装目标文件,而不是直接调用${AS}。在这种情况下,设置ASFLAGS对构建过程没有影响;相反,您将设置类似CFLAGS="-Wa,-alh,-L"的内容来告诉C编译器将这些标志传递给汇编器。LDFLAGS变量是此规则的例外,因为它旨在传递给编译器驱动程序,而不是${LD}

变量 用途 来源 示例
AR ar兼容库打包程序 POSIX make x86_64-pc-linux-gnu-ar
ARFLAGS 用于${AR}的标志 POSIX make -v
AS as兼容汇编器 GNU make x86_64-pc-linux-gnu-as
ASFLAGS 用于${AS}的标志 GNU make --reduce-memory-overheads
CC C编译器驱动程序(也通常用于链接) POSIX make clang-9
CFLAGS 用于${CC}的标志 POSIX make -march=native
CPPFLAGS 用于C预处理器的标志 GNU make -D_GNU_SOURCE
CXX C++编译器驱动程序(也通常用于链接) GNU make clang++
CXXFLAGS 用于${CXX}的标志 GNU make -fvisibility=hidden
LD 动态链接器 GNU libtool x86_64-pc-linux-gnu-ld
LDFLAGS 用于编译器驱动程序传递给其链接器的标志 POSIX make -Wl,-O1 -Wl,--as-needed
LEX lex兼容词法分析器 POSIX make /usr/bin/flex
LFLAGS 用于${LEX}的标志 POSIX make --8bit --posix-compat
NM nm兼容符号提取器 GNU libtool x86_64-pc-linux-gnu-nm
RANLIB 归档索引生成器 GNU libtool x86_64-pc-linux-gnu-ranlib
YACC yacc兼容编译器编译器 POSIX make /usr/bin/bison
YFLAGS 用于${YACC}的标志 POSIX make -d