Ebuild_Manpage
目录
NAME
ebuild - 含有内部格式、变量和函数的 ebuild 脚本
DESCRIPTION
ebuld 程序接受一个 ebuild 脚本作为参数。该脚本包含变量和指明如何从一个特别的软件源代码进行 download、unpack、patch、complile、install 和 merge 的命令。除了所有这些,ebuild 脚本还包含按要求进行 pre/post install/remove 命令。所有的 ebuild 脚本均以 bash 编写。
Dependencies
一个依赖 Atom
是 portage 计算包之间关系的依赖基础。请注意,如果 atom 还没有被 merge,那么将匹配最新可用的版本。
Atom Base
Atom base 只是完整的 category/packagename
,又常叫做"catpkg"。
sys-apps/sed sys-libs/zlib net-misc/dhcp
Atom Versions
更具体一点,使用包含特定版本的 atom 也是可以接受的。版本必须和前缀一起使用,所以可以将版本号作为后缀添加到 base 上。
sys-apps/sed-4.0.5 sys-libs/zlib-1.1.4-r1 net-misc/dhcp-3.0_p2
版本号可能跟随诸如像 1.2a 或 4.5.2z 的字符,注意这些字母并不代表 alpha, beta 等状态。对于这种情况可以使用可选的后缀,如_alpha, _beta, _pre (pre-release), _rc (release candidate), 或 _p (patch)。这些后缀可以不受限制的任意链接。
Atom Prefix Operators [> >= = <= <]
有时你可能希望依赖于一个大致的版本,而不是一直指定特定的版本。所以,这里还提供了标准的布尔运算符:
>media-libs/libgd-1.6 >=media-libs/libgd-1.6 =media-libs/libgd-1.6 <=media-libs/libgd-1.6 <media-libs/libgd-1.6
Extended Atom Prefixes [!~] and Postfixes [*]
现在为了更加精巧,ebuild 还提供了定义屏蔽包和版本范围匹配的功能。另外,这些扩展的前缀和后缀可以和上面提到的 atom 类型以各种方式组合。
~
匹配指定基础版本的任何修订版。如以下例子中,匹配'1.0.2a', '1.0.2a-r1', '1.0.2a-r2'等。
~net-libs/libnet-1.0.2a
!
阻止该软件包同时安装
!app-text/dos2unix
!!
阻止该软件同时安装,并且明确禁止在升级的时候临时安装它们。该语法从 EAPI 2 开始支持。
!!<sys-apps/portage-2.1.4_rc1
*
匹配基于指定的基础版本的任意版本软件包。=*=之前必须是有效的版本号。例如,=2=是有效的版本号,=2.=则不是,所以=2*=是被允许的,=2.*=则不被允许。
=dev-libs/glib-2* !=net-fs/samba-2*
Atom Slots
从 EAPI 1 开始,可以限制 atom 匹配特定的 SLOT。这通过在冒号后面加上一个 SLOT 来实现
x11-libs/qt:3 ~x11-libs/qt-3.3.8:3 >=x11-libs/qt-3.3.8:3 =x11-libs/qt-3.3*:3
Sub Slots
从 EAPI 5 开始,一个 slot 依赖可能包含一个可选的 sub-slot,该部分位于常规 slot 之后,并且以=/=字符分隔。
dev-libs/icu:0/0 dev-libs/icu:0/49 dev-lang/perl:0/5.12 dev-libs/glib:2/2.30
Atom Slot Operators
从 EAPI 5 开始,slot 操作符包含一个冒号,后面跟着以下操作符之一:
*
表示任何 slot 值都是可以接受的。另外,对于运行时依赖,如果卸载了指定版本的软件包并且在其他的 slot 中将其替换为了另一个匹配的软件包,则该软件包不会损坏。
dev-libs/icu:* dev-lang/perl:* dev-libs/glib:*
=
表示任何 slot 值都是可以接受的。另外,对于运行时依赖,除非安装了 slot 和 sub-slot 等于该软件包在可安装时的最佳安装版本的 slot 和 sub-slot 的匹配软件包,否则该软件包会损坏。
dev-libs/icu:= dev-lang/perl:= dev-libs/glib:=
slot=
表示只能接受特定的 slot 值,否则其行为与普通 slot 操作符相同。
dev-libs/icu:0= dev-lang/perl:0= dev-libs/glib:2=
为了实现等号 slot 操作符,包管理软件需要存储匹配软件包的最佳已安装版本的 slot/sub-slot 对。该语法仅供包管理软件使用且一定不能在 ebuild 中使用。包管理软件可以通过在保存软件包依赖时在分号和等好之间插入适当的 slot/sub-slot 对来实现次目的。sub-slot 部分在这里必须不能省略(当 SLOT 变量省略 sub-slot 部分时,该软件包被认为是具有一个等于常规 slot 的隐式 sub-slot)。
dev-libs/icu:0/0= dev-libs/icu:0/49= dev-lang/perl:0/5.12= dev-libs/glib:2/2.30=
Atom USE
从 EAPI 2 开始,任何 atom 可以被匹配的特定 USE flag 设置限制。当和 SLOT 依赖一起使用时,USE 依赖出现在 SLOT 依赖的右手侧。
无条件的 USE 依赖
Example | Meanning |
---|---|
foo[bar,baz] | foo 必须同时启用 bar 和 baz |
foo[-bar,baz] | foo 必须禁用 bar 同时启用 baz |
有条件的 USE 依赖
Compat Form | Equivalent Expaned Form |
---|---|
foo[!bar?] | bar? ( foo ) !bar? ( foo[-bar] ) |
foo[bar=] | bar? ( foo[bar] ) !bar? ( foo[-bar] ) |
foo[!bar=] | bar? ( foo[-bar] ) !bar? ( foo[bar] ) |
Atom USE defualts
USE 依赖可以指定有关匹配包的 IUSE 中可能或可能不存在的 flag 值为默认假设。这种默认值被通过在 flag 后紧接()或(-)指定。使用()表现为好像一个缺少的 flag 存在并且被启用,或(-)表现为好像 flag 存在并且被禁用。
media-video/ffmpeg[threads(+)] media-video/ffmpeg[-threads(-)]
Dynamic Dependencies
有时程序或许会根据 USE 变量依赖不同的东西。Portage 提供了一些选项来处理这种情况。注意当使用下面的语法时,每个情况都被认为是在它出现的范围内的的一个 Atom。这意味着每一个 Atom 都有条件的包含多个 Atom 并且可以被嵌套到无限深度。
usevar? ( Atom )
当用户在 USE 中含有 jpeg flag 的时候要 include jpeg library,简单的使用如下语法:
jpeg? (media-libs/jpeg)
!uservar? ( Atom )
如果你仅想在用户在他们的 USE 变量中没有确定选项时 include 一个 package,使用如下语法:
!nophysfs?( dev-games/physfs )
当在你想添加可选功能并默认启用该功能时,这通常非常有用。
usevar? ( Atom if true ) !usevar? ( Atom if false )
对于 C 中的三目算符之类的功能,你必须使用两个语句,一个为普通语句,一个为反向语句。如果一个软件包使用 GTK2 和 GTK1,但不是同时,那么你可以像这样处理:
gtk2? ( =x11-libs/gtk+-2*) !gtk2? ( =x11-libs/gtk+-1*)
这种方法模式优先使用 GTK2 库。
|| ( Atom Atom … )
当一个软件包可以使用几个不同的软件包但不适合使用虚包时,这个语法可以被轻松使用。
|| ( app-games/unreal-tournament app-games/unreal-tournament-goty )
这里我们看到 unreal-tourament 有一个普通的版本,还有一个 goty 的版本。因为它们提供相同的基本文件集,所以一个软件包可以使用其中任意一个。因为使用范围很小,所以添加虚包时不合适的。
另一个好的例子是当软件包可以使用多个视频接口构建,但仅能使用其中一个接口。
|| ( sdl? ( media-libs/libsdl ) svga? ( media-libs/svgalib ) opengl? ( virtual/opengl ) ggi? ( media-libs/libggi ) virtual/x11 )
这里只有一个软件包将会被选中,并且偏好顺序由它们出现的顺序决定。所以 sdl 是最佳选择,接下来是 svga,然后是 opengl,再是 ggl,并且 X 作为默认如果用户没有指定上面提到的任何一种。
注意,如果列出的任何一个软件包已经 merge,包管理器将会使用它并认为依赖已满足。
Variable Usage Notes
- 定义在
make.conf
中的变量可以在 ebuild 中使用(除了 Portage 特定的变量,其他的包管理器可能不支持)。 - 当在 ebuild 中分配变量时,变量名和等好之间不能有空格(与 bash 语法类似)
- 变量值应该仅包含 ascii 字符集中的字符。GLEP 31 要强制要求如此。
Variables Used In Ebuilds
ARCH
该变量包含了运行系统的当前架构的官方 Gentoo 专用缩写。有关权威列表可以查看 /var/db/repos/gentoo/profiles/arch.list
P
该变量包含了不包括 ebuild 修订版本的包名。该变量必须不能修改。
x11-base/xorg-server-1.20.5-r2 --> 'x11-base/xorg-server-1.20.5'
PN
包含不包括版本号的脚本名
x11-base/xorg-server-1.20.5-r2 --> 'x11-base/xorg-server'
PV
包括不带修订的版本号
x11-base/xorg-server-1.20.5-r2 --> '1.20.5'
PR
包含修订号,或者
r0
如果不存在修订号x11-base/xorg-server-1.20.5-r2 --> 'r2'
PVR
包含版本号和修订号(如果不是 0)
x11-base/xorg-server-1.20.5 --> '1.20.5' x11-base/xorg-server-1.20.5-r2 --> '1.20.5-r2
PF
包含完整包名 PN-PVR
x11-base/xorg-server-1.20.5 --> 'xorg-server-1.20.5' x11-base/xorg-server-1.20.5-r2 --> 'xorg-server-1.20.5-r2'
CATEGORY
包含包目录名
x11-base/xorg-server-1.20.5-r2 --> 'x11-base'
A
包含软件包包含的所有源文件。该变量必须不能定义。它由 SRC\_URI 变量自动生成
WORKDIR = ${PORTAGE_TMPDIR}/portage/${CATEGORY}/${PF}/work
包含软件包构建目录的路径。不要修改此变量
FILESDIR = ${PORTAGE_TMPDIR}/${CATEGORY}/${PF}/files
包含软件包特定的辅助文件路径。不要修改此变量
EBUILD_PHASE
包含当前正在执行的阶段函数缩写名称,比如"setup", "unpack", "compile", or "preinst"
EBUILD_PHASE_FUNC
从 EPAI 5 开始,包括当前正在执行的阶段函数全名,比如"pkg_setup", "src_unpack", "src_compile", or "pkg_preinst"
EPREFIX
从 EAPI 3 开始,包含此 Portage 在安装过程中配置的偏移量。在 ebuild 或 eclass 中有时候需要偏移量,并且在这种情况下可作为${EPREFIX}使用。EPREFIX 不包含尾部斜杠,所以空字符串表示缺少偏移量。不要修改此变量。
S = ${WORKDIR}/${P}
包含临时构建目录的路径。该变量被 src_compile 和 src_install 函数使用。两者都以
S
为当前目录执行。可以修改此变量以与软件包的 tarball 提取目录匹配。T = ${PORTAGE_TMPDIR}/portage/${CATEGORY}/${PF}/temp
包含临时目录的路径。该变量可以根据自己的喜好随意使用。
D = ${PORTAGE_TMPDIR}/portage/${CATEGORY}/${PF}/image/
包含临时安装目录的路径。每个不涉及 helper tools 和函数(如下所见)的写操作都应以
{$D}
为前缀。从 EAPI 3 开始,这里偏移量前缀应该经常被考虑到,为此提供了${ED}
变量。注意在 EAPI 7 中,为了方便在 ebuild 中连接路经,此路径中的任何尾部斜杠都会被自动删除。不要修改该变量。ED = ${PORTAGE_TMPDIR}/portage/${CATEGORY}/${PF}/image/${EPREFIX}/
为了方便使用,包含
${D%/}${EPREFIX}/
的路径。注意,注意,为了方便在 ebuild 中连接路经,此路径中的任何尾部斜杠都会被自动删除。不要修改该变量。MERGE_TYPE
从 EAPI 4 开始,MERGE_TYPE 变量可以查询当前 merge 类型。该变量包含以下可能值之一:
Value Meaning buildonly 未计划合并 source-build source 计划合并 source-build PROVIDES_EXCLUDE = [space delimited list of fnmatch patterns]
在生成 PROVIDES 元数据时,被 fnmatch 模式匹配的 soname 和文件路径将会被排除在外。模式由空格分隔,并且可以创建包含引用的空格的模式。
PORTAGE_LOG_FILE
包含构建日志的路径。如果 PORTAGE_LOG_FILE 没有设置,则
PORTAGE_LOG_FILE = "${T}/build.log"
PORTAGE_SOCKS5_PROXY
包含提供主机网络访问的 UNIX socket 路径到 SOCKSv5 代理。仅当运行在 network-sandbox 内部并且代理可用时有效。
REPLACED_BY_VERSION
REPLACED_BY_VERSION 变量可以在 pkg_perm 和 pkg_postrm 中查询要被替换的软件包的当前版本。如果没有替换包,则变量为空,否则它将包含一个版本号。
REPLACING_VERSIONS
从 EAPI 4 开始,REPLACED_BY_VERSION 变量可以在 pkg_perm 和 pkg_postrm 中查询要替换的软件包的当前版本。如果没有替换包,则变量为空,否则它将包含一个与被替换的软件包版本相对应的版本号空格分隔列表。通常,该变量不会含有超过一个版本,但是根据 PMS 它可以包含多个版本。
REQUIRES_EXCLUDE = [space delimited list of fnmatch patterns]
从 EAPI 4 开始,在生成 REQUIRES 元数据时,被 fnmatch 模式匹配的 name 和文件路径将会被排除在外。模式由空格分隔,并且可以创建包含引用的空格的模式。
ROOT = /
请注意一个关于 ROOT 变量的重要改变 – 在 EAPI 7 中,在 ebuild 指向根文件系统时,中该变量将会默认为“”而不是传统的"",而且当设置为非根路径时该变量将永远不会包含尾部斜杠。这有一个附加的便利,无需在连接路径时指定 ="${ROOT%}"= ,使得 ROOT 变量使用起来更加便利。这也适用于变量 EROOT,D 和 ED。请注意这意味着 ebuild 必须使用不同的逻辑来确定它们是否要安装到根文件系统上 – 使用
[["$ROOT" =
"" ]]]= 来代替[[ "$ROOT" =
"/" ]]= 。包含 portage 应该用作为 live filesystem 的 root 的路径。当软件包希望对 live filesystem 作出改变的时候,他们应该在以
${ROOT}
为前缀的树中这样做。通常这里需要考虑偏移量前缀,为了提供了${EROOT}
变量。不要修改该变量。EROOT = ${ROOT%/}${EPREFIX}/
从 EAPI 3 开始,为了方便使用,包含="\({ROOT%/}\){EPREFIX}/"=。不要修改该变量。也请看关于 ROOT 在 EAPI 7 中的重要说明。与 ROOT 一样,在 ebuild 中当设置为根文件系统时 EROOT 默认定义为“”,并且在永远不会有尾部斜杠。
DESCRIPTION = A happy little package
应该包含软件包的简短说明
EAPI = 0
定义此软件包所遵循的的 ebuild API 版本。如果未定义则默认为"0"。如果 prtage 不认识一个 EAPI 变量,则它会屏蔽该软件包,并且执行任何操作,因为这意味着首先需要安装新版本的 portage。为了最大的向后兼容性,软件包应该符合最低的 EAPI。注意,任何人于软件包使用 ebuild 和 reopman 命令都需要获取可识别该软件包所遵循的 EAPI 版本的 portage。
SRC_URI = https://example.com/path/$%7BP%7D.tar.gz
包含所需源文件的 URI 列表。对单个源文件它可以包含多个 URI。如果文件未在任何 GENTOO_MIRRORS 找到,则按顺序处理该列表。从 EAPI 2 开始,可以在右侧使用
"->"
运算符来自定义给定 URI 的输出文件名,后跟希望的输出文件名。所有 token,包括操作符和输出文件名,都应该用空格分隔。HOMEPAGE = https://example.com/
应该包含源主要网站和其他与软件包有关的依赖信息的 URI 列表
KEYWORDS = [-~][x86,ppc,sparc,mips,alpha,arm,hppa,…]
KEYWORDS 和 ACCEPT_KEYWORLDS 结果使用,以实现创建彝族不同类型的软件包集,然后可以对它们进行整体屏蔽或非屏蔽。在 Gentoo Linux 项目,Gentoo 架构团队使用它们来定义一个特定的 CPU 架构的稳定或不稳定未屏蔽的软件包集中包含的 ebuild。
这里是它们如何工作的。为了解释目的,我们假设你有一个稳定的 x86-64bit 系统,通常称为"amd64"。ARCH 将定义为"amd64"。如果你使用的是稳定的 Gentoo Linux,那么 ACCEPT_KEYWORLDS 会通过 profile 被设为"amd64"。任何在 KEYWORDS 中含有"amd64"的 ebuild 都会默认被设为非屏蔽的。
在一个"unstable"的 amd64 系统上,ACCEPT_KEYWORDS 将会被设置为"amd64 ~amd64",波浪号表示"unstable"。那么如果一个 ebuld 在 KEYWORDS 中包换"amd64"或"~amd64",默认情况下该关键在会在系统上被取消屏蔽。类似的,如果一个 ebuild 已知与特定架构不兼容,
"-"
前缀(像"-amd64")设置可以指定仅在该架构上对其屏蔽。如果你正在为 Gentoo LInux 开发 ebuild,为了与 Gentoo 架构团队工作流程一致,你 需要遵循一些关于关键字的政策。下面列出了最重要的政策:- 如果你不知道一个 ebuild 是否可以在特定的架构下运行,那么不要在 KEYWORDS 中指定它。这样默认情况下它在该架构上会被屏蔽
- 如果一个 ebuild 已知不能在一个架构上运行,那么在 KEYWORDS 中禁用该架构。例如,这可以通过指定"-ppc"来完成。这将会确保对该架构进行显式的关键字屏蔽。
当提交一个 ebuild 到 Gentoo Linux 的时候,在 KEYWORDS 中仅对已成功测试的架构设置"~arch"是项目政策,没有测试的则不设置。随着 ebuild 接受更多的测试,Gentoo 架构团队将逐步扩展 KEYWORDS 的设置,以将软件包"bump"到不稳定,甚至可能是稳定状态。
依据使用 profile 中的 package.accept_keywords 和 package.keywords 文件对每个软件包自定义 ACCEPT_KEYWORFS 和 KEYWORDS 的行为是可能的。有关使用这些文件的更多信息,请参见 portage(5)。
注意虽然其他基于 Gentoo 的项目具有 KEYWORDS 和 ACCEPT_KEYWORDS,它们可能在关于使用方面没有完全相同的政策。所以,有必须要研究它们的特性策略以及它们与 Gentoo 的不同之处。
SLOT
这为可能需要同时存在多个版本的软件包设置了 SLOT。默认你应该设置 SLOT="0"。如果你不确定,那么在你寻求一些大时的指导之前,不要摆弄这个。应该永远不能让这个值未定义。
从 EAPI 5 开始,SLOT 变量可以包含一个可选的 sub-slot 部分跟随在常规 slot 之后,并用字符
/
分隔。sub-slot 必须是一个有效的 slot 名。sub-slot 用于表示以下情况:升级到一个具有不同的 sub-slot 软件包的新版本可能需要依赖软件重新构建。当 sub-slot 从 SLOT 定义中省略时,软件包被认为有一个等同与常规 slot 的隐式的 sub-slot。关于 sub-slot 的使用的更多信息,请参考 Atom Slot Operators 章节。LICENSE
这应该是软件包所属的 license 的空格分隔的列表。这必须设置为在/var/db/repos/gentoo/licenses/中的匹配的 license。如果在仓库中还不存在 license,你需要先添加它。
IUSE
它应该是在你的构建脚本中所有可使用的 USE flag 列表。仅有的不应该列在此处的 USE flag 是与架构相关的 flag。从 EAPI 1 开始,可以在 flag 前加上
+
或-
以创建分别开启或禁用相应 USE flag 的默认设置。有关 USE flag 堆叠顺歇的详细信息,请参考make.conf(5)
中的 USE_ORDER 变量。在给定默认 USE_ORDER 设置的情况下,负值的 IUSE 默认设置仅会否定 repo-level 的 USE 设置,因为 profile 和用户设置都会覆盖它们。DEPEND
它应该包含该程序编译所需的所有软件包的列表(aka 构建时依赖)。这些通常是库和头文件。
从 EAPI 7 开始,tools 应该改为使用 BDEPEND 变量,因为 DEPEND 仅会安装到正在构建的系统中,因此在交叉编译时无法执行。
你可以使用上面 Dependencies 部分中描述的语法。
RDEPEND
它应该包含该程序运行所需的所有软件包列表(aka 运行时依赖)。这些通常是库。
在 EAPI 3 或更早中,如果该变量没有设置,则它被默认设置为 DEPEND 的值。在 EAPI 4 或之后中,永远不能隐式设置 RDEPEND
你可以使用上面 Dependencies 部分中描述的语法。
BDEPEND
它应该包含在编译该程序期间所需的可执行的所有软件包列表(aka native build dependencies)。这些通常是工具,像解释器或(交叉)编译器。它们将会被安装到执行构建的系统中。
该变量在 EAPI 7 中正式引入,但以前在 EAPI 5-hdepend 中被成为 HDEPEND。
你可以使用上面 Dependencies 部分中描述的语法。
PDEPEND
它应该包含在这此之后应该被 merge 的所有软件包列表(aka post merge dependencies),但是如果不能在此之后安装,则可能被包管理软件在任何时候安装。
*警告*:仅将此作为打破循环依赖的最后手段。
你可以使用上面 Dependencies 部分中描述的语法。
REQUIRED_USE
从 EAPI4 开始,REQUIRED_USE 变量可用于指定允许或不允许的 USE flag 组合。必要的时候可以嵌套元素。
Behavior Expression If flag1 enabled then flags2 enabled flag1? ( flag2 ) If flag1 disabled then flag2 enabled !flag1? ( flag2 ) If flag1 disabled then flag2 disabled !flag1? ( !flag2 ) Must enable any one or more (inclusive or) || ( flag1 flag2 flag3 ) Must enable exactly one but not more (exclusive or) ^^ (flag1 flag2 flag3 ) Must enable at most one(EAPI 5 or later) ?? (flag1 flag2 flag3 ) RESTRICT = [strip,mirror,fetch,userpriv]
这应该是限制 portage 功能的以空格为分隔的列表。你可以使用条件语法来更改限制,如上面 DEPEND 中所示。
binchecks
禁用所有对二进制文件的 QA 检查。这应该*仅*在二进制检查没有意义的软件包中使用(例如,linux-headers 和 kernel-sources 可以安全跳过,因为它们没有二进制文件)。如果二进制检查需要因为其他原因跳过(像专有二进制文件),关于更具体的豁免请参见 QA CONTROL VARIABLES 部分
bindist
已构建软件包的分发受到限制。
fetch
类似与 mirror,但也不通过 SRC_URI 获取文件。
installsources
禁用特定软件包的安装源。这是用于与 debugedit 不兼容的二进制软件包。
mirror
SRC_URI 中的文件将不会从 GENTOO_MIRRORS 下载
network-sandbox
对特定软件包禁用 network namespace。不能在 main Gentoo tree 上使用。
preserve-libs
对特定软件包禁用 preserve-libs。注意,当软件包被 merge 时,如果新实例或旧实例设置了 RESTRICT=preserve-libs,则 RESTRICT=preserve-libs 使用。
primaryuri
在从 GENTOO_MIRRORS 获取之前,先从 SRC_URI 获取。
splitedebug
对特定软件包禁用 splitedebug。这适用于二进制文件会与 splitdebug 触发问题的软件包,例如在/usr/lib/debug/.build-id 的符号链接之间的 file-collisions(由捆绑的库触发)。
strip
最终的二进制文件/库不会删除调试符号。
test
即使用户设置的 FEATURES=test 也不要运行 src_test
userpriv
对特定软件包禁用 userpriv
PROPERTIES = [interactive,live]
空格分隔的属性列表,带有条件语法支持。
interactive
一个或多个 ebuild 阶段将产生提示,要求用户进行交互。
live
该软件包使用实时源代码,每次安装该软件包时,源代码可能会有所不同。
DOCS
从 EAPI 4 开始,用于在默认 src_install 函数中使用 dodoc 来安装的一个数组或空格分隔列表的文档文件。如果未定义,一个合理的默认列表将会被使用。具体请见下文关于 src_install 的文档。
QA Control Variables:
Usage Notes
提供多个 QA 变量允许 ebuild 操作一些由 portage 执行的 QA 检查。这些变量在 ebuild 中的使用应保持在绝对最低限度,否则它们会破坏质量检查的目的,并且它们的使用需要经过 QA 团队的同意。它们主要供安装无法改变的闭源二进制对象的 ebuild 使用。请注意,违反这些规则的对象在某些架构上可能会失败。
QA_PREBUILT
该变量应该包含相对 image 目录且预先构建的二进制文件的文件路径列表。在此列出的路径将会附加到下面列出的每个 QA_*变量中。路径可能包含 fnmatch-like 模式,这些模式将在内部转换为 QA_*变量支持的正则表达式,而不是 fnmatch 模式。转换机制只是简单的将
"*"
接换为".*"
。QA_TEXTRELS
该变量可以被设置为包含相对 image 目录且无法消除的文本重定位的文件的文件路径列表。路径可能包含 fnmatch 模式。
该变量旨在用于无法更改的闭源二进制对象。
QA_EXECSTACK
该变量应该包含相对 image 目录且需要可执行堆栈才能运行的对象的文件路径列表。路径可能包含 fnmatch 模式。
该变量旨在用于确实需要可执行堆栈的对象(即不是那些实际上不需要的)。
QA_WX_LOAD
该变量应包含相对 image 目录且为包含可写和可执行段的文件的文件路径列表。它们非常罕见。路径可能包含 fnmatch 模式。
QA_FLAGS_IGNORED
该变量应包含相对 image 目录且不包含.GCC.command.line 部分或包含.hash 部分的文件的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
该变量旨在用于忽略 CFLAGS、CXXFLAGS、FFLAGS、FCFLAGS 和 LDFLAGS 变量的二进制软件包文件。
QA_MULTILIB_PATHS
该变量包含相对 image 目录且应该忽略 multilib-strict 检查的文件的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_PRESTRIPPED
该变量包含相对 image 目录且包含 pre-stripped 的二进制文件的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_SONAME
该变量包含相对 image 目录且缺少 SONAME 的共享库的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_SONAME_NO_SYMLINK
该变量包含相对 image 目录的文件路径且具有 SONAME 但在同一目录不应具有对应 SONAME 符号连接的共享库的文件列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_AM_MAINTAINER_MODE
该变量包含 autmake 缺失–run 命令的行的列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_CONFIGURE_OPTIONS
该变量包含触发有关无法识别的选项的配置选项的列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_DT_NEEDED
该变量包含相对 image 目录且缺少 NEEDED 条目的共享库的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
QA_DESKTOP_FILE
该变量包含相对 image 目录且不应被验证的桌面文件的文件路径列表。路径可能包含带有转义引号的特殊字符的正则表达式。
PORTAGE DECLARATIONS
inherit
inherit 是 portage 对 ebuild 外部的额外 class 的维护的函数并且作为继承能力和数据提供。它们定义函数并设置数据类型作为插件替代、扩展和简化程序,用于极为常见的任务以简化构建过程。调用 inherit 不能依赖于给定 ebuild 中可能有所不同的条件。eclass 的规范仅包含其名称,而不包含.eclass 扩展名。还要注意,inherit 语句必须位于其他 全变量声明之前,除非这些变量在 eclass 的全局范围内使用。
PHASE FUNCTIONS
pkg_pretend
从 EAPI 4 开始,为了检查是否满足杂项要求,该函数必须被定义。该函数应该尽可能的早被调用,在任何尝试满足依赖之前。如果函数检测到问题,则它应该调用 eerror 并且 die。用来执行 pkg_pretend 的环境(变量、函数、临时目录等)不会被保存,所以在之后的执行阶段中不可用。
pkg_nofecth
该函数将会在无论任何原因都无法获取 SRC\_URI 中的文件时执行。如果你在 RESTRICT 中开启 fetch,这对于向用户显示如何获取所述文件的信息很有用。你所要做仅是输出信息,然后让函数返回。不要在函数结尾调用 die。
pkg_setup
如果软件包需要指定 setup 操作或要首先执行检查,则可以使用该函数。
初始工作目录:$PORTAGE_TEMPDIR
src_unpack
该函数用于 unpack 在 A 中的所有源文件到 WORKDIR。如果未在 ebuild 脚本是定义该函数,则它调用 unpack ${A}。任何 patch 或其他预配置/编译的修改都不应该在这里。
初始工作目录:$WORKDIR
src_prepare
所有源代码的准备工作,例如不定的应用,都应该在此处完成。这个函数从 EAPI 2 开始支持
初始工作目录:$S
src_configure
配置的所有必要步骤都应该此处完成。该函数从 EAPI 2 开始支持。
初始工作目录:$S
src_compile
小于 EPAI 2 时,配置和编译的所有必要步骤都应该在此处完成。从 EAPI 2 开始,仅编译步骤应该在此处完成。
初始工作目录:$S
src_test
运行所有软件包特定的测试用例。默认运行
emake check
后跟着运行emake test
。在 EAPI 5 之前,src_test 的默认实现自动传递-j1 选项作为 emake 的最后一个参数,并且从 EAPI 5 开始将允许并行运行测试。初始工作目录:$S
src_install
应该在临时安装目录中包含安装软件包所要求的所有内容。
初始工作目录:$S
从 EAPI 4 开始,如果 src_install 未定义,则下列默认实现将会被使用:
src_install() { if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then emake DESTDIR="${D}" install fi if ! declare -p DOCS &>/dev/null ; then local d for d in README* ChangeLog AUTHORS NEWS TODO CHANGES \ THANKS BUGS FAQ CREDITS CHANGELOG ; do [[ -s "${d}" ]] && dodoc "${d}" done elif [[ $(declare -p DOCS) == "declare -a "* ]] ; then dodoc "${DOCS[@]}" else dodoc ${DOCS} fi }
pkg_preinst pkg_postinst
上软件包被 merge 之前和之后,所有需要在实时文件系统上的修改都应该放在这里。而且对用户的注释也应该放在此处并在最后显示。
初始工作目录:$PWD
pkg_prerm pkg_postrm
类似与 pkg_*inst 函数,但是在 unmerge 时使用。
初始工作目录:$PWD
pkg_config
该函数应包含可选的基本配置步骤。
初始工作目录:$PWD
HELPER FUNCTIONS
Phase:
defualt
为当前正在执行的阶段调用默认阶段函数实现。该方程从 EAPI 2 开始支持。
defualt_*
从 EAPI 2 开始,默认 pkg_nofetch 和 src_*阶段函数可以通过方程以 defualt_开头并以相应的阶段函数名结尾的函数访问。例如,调用名为 defualt_src_compile 的函数等同于调用 src_compile 函数的默认实现。
Defualt Phase Functions defualt_src_unpack defualt_src_prepare defualt_src_comfigure defualt_src_compile defualt_src_test
General:
assert [reason]
检查 shell 的 PIPESTATUS 数组变量的值,如果有任何非 0 值(表示失败),调用 die 并且 reason 作为失败消息。
die [reason]
使当前 emerge 程序中止。最后显示的信息将包括 reason。
从 EAPI 4 开始,所有 helper 每当发生某种错误就自动调用 die。helper 调用可以以 nofatal 为前缀,以防止错误变成 fatal。
nofatal [helper]
执行 helper 并且如果失败也不调用 die。nofatal helper 从 EAPI 4 开始可用。
use <USE item>
如果 USE item 在 USE 变量中,函数会默默返回 0(aka shell true)。如果 USE item 不在 USE 变量中,函数会默默返回 1(aka shell false)。usev 时 use 的详细版本。
usev <USE item>
就像 use,但在 use 返回 true 的时候同时 echo USE item。
usex <USE flag> [true output] [false output] [true suffix] [false suffix]
如果 USE flags 设置了,echo
[true output][true suffix]
(默认为"yes"),否则 echo[false output][false suffix]
(默认为"no")。usex heper 从 EAPI 5 开始可用。use_with <USE item> [configure name] [configure opt]
对于创建自定义选项以传递到配置脚本很有用。如果 USE item 在 USE 变量中并且 configure opt 指定了,那么字符串–with-[configure-name]=[configure opt]将会被 echo。如果 configure opt 没有被指定,那么仅–with-[configure name]会被 echo。如果 USE item 不在 USE 变量中,那么字符串–without-[configure name]将会被 echo。如果 configure name 没有被指定,那么 USE item 将会在其位置上使用。从 EAPI 4 开始,空的 configure opt 参数可以被识别。在 EAPI 3 和更早中,空的 configure opt 参数被视为未被提供。
USE="opengl" myconf=$(use_with opengl) (myconf now has the value "--with-opengl") USE="jpeg" myconf=$(use_with jpeg libjpeg) (myconf now has the value "--with-libjpeg") USE="" myconf=$(use_with jpeg libjpeg) (myconf now has the value "--without-libjpeg") USE="sdl" myconf=$(use_with sdl SDL all-plugins) (myconf now has the value "--with-SDL=all-plugins")
use_enable <USE item> [configure name] [configure opt]
和上面的 use_with 一样,除了配置选项是
--enable-
替代--with-
、--disable-
替代--without-
。从 EAPI 4 开始,空的 configure opt 参数可以被识别。在 EAPI 3 和更早中,空的 configure opt 参数被视为未被提供。has <item> <item list>
如果 item 在 item list 中,则 has 返回 0,否则返回 1。还有另外一个版本,hasv,会有条件的 echo item。
item list 由 IFS 变量分隔。该变量的默认值为' '或空格。这是一个 bash 设置。
hasv <item> <item list>
就像 has,但在 has 返回 true 的时候同时 echo item。
has_version [-b] [-d] [-r] [--host-root] <category/package-version>
检查 category/package-version 是否已安装。该参数接受在 DEPEND 变量中可接受的所有值。如果 category/package-version i 已安装,该函数返回 0,否则返回 1。该软件包默认在 ROOT 中搜索。
在 EAPI 5 和 EAPI 6 中,如果提供了–host-root 选项,则软件包在 build host 中搜索。
在 EAPI 7 和之后,令人困惑的–host-root 选项被替换为-b,和 build host 中 BDEPEND 满足的依赖关系对应。类似的,-d 选项对应 SYSROOT 中的 DEPEND 并且-r 选项对应 ROOT 中的 RDEPEND。
best_version [-b] [-d] [-r] [--host-root] <package name>
该函数将会在当前已安装软件包的数据库中查找 package name 并且 echo 找到的软件包的“best version”,或者如果没有安装则为空。软件包默认在 ROOT 中搜索。它接受于 has_version 一样的选项。
VERINS="$(best_version net-ftp/glftpd)" (VERINS now has the value "net-ftp/glftpd-1.27" if glftpd-1.27 is installed)
Output:
einfo disposable message
和 elog 一样,当应该在消息对用户不重要时使用(像构建过程中的进度或状态信息)。
elog informative message
如果你需要显示信息并且你希望用户阅读并提起注意,那么使用 elog。它就像 echo 一样,但是添加一点输出,以引起用户的注意。信息还会被 portage 记录以供之后查看。
ewarn warning message
和 einfo 一样,但是应该对用户显示警告时使用。
eqawarn QA warning message
和 einfo 一样,但应该在对用户显示 QA 警告时使用
eerror error message
和 einfoi 一样,但应该在对用户显示错误时使用。
ebegin helpful message
就像 einfo,我们输出 helpful message,然后提示以下操作可能需要一些时间才能完成。一旦任务完成,你需要调用 eend。
eend <status> [error message]
跟随在 ebegin 消息之后,并使用适当"OK"或"!!"(错误)标记。如果 status 是非 0 的,那么附加的 error message 会被显示。
Unpack
unpack <source> [list of more sources]
该函数解压所源文件列表到当前目录中。该函数会将 source 附加到 DISTDIR 变量中。
Compile:
econf [configure options]
用于替代 configure。执行:
${ECONF_SOURCE:-.}/configure \ ${CBUILD:+--build=${CBUILD}} \ --datadir="${EPREFIX}"/usr/share \ --host=${CHOST} \ --infodir="${EPREFIX}"/usr/share/info \ --localstatedir="${EPREFIX}"/var/lib \ --prefix="${EPREFIX}"/usr \ --mandir="${EPREFIX}"/usr/share/man \ --sysconfdir="${EPREFIX}"/etc \ ${CTARGET:+--target=${CTARGET}} \ --disable-dependency-tracking \ ${EXTRA_ECONF} \ configure options || die "econf failed"
注意 EXTRA_ECONF 仅适用于用户,不适用于 ebuild writer。如果你希望传递更多的参数到 configure,只需将额外的参数传递给 econf。另外注意如果 configure 脚本失败,econf 自动调用 die。从 EAPI 3 开始,econf 使用被之前的 EAPI 值忽略的${EPREFIX}变量。从 EAPI 4 开始,如果字符串 disable-dependency-tarcking 出现在 configure –help 的输出中,econf 会在参数中添加–disable-dependency-tracking。从 EAPI 5 开始,如果字符串 disable-silent-rules 出现在 configure –help 中,econf 会在参数中添加 disable-silent-rules。
emake [make options]
在 ebuild 中必须使用它来代替 make。执行
${MAKE:-make} ${MAKEOPTS} make options ${EXTRA_EMAKE}
,并且从 EAPI 4 开始会自动调用die
。MAKEOPTS 变量由用户设置,所以能够开启一些像并行构建的特性。更多细节请见 make.conf(5)。
EXTRA_EMAKE knob 是 portage 的特性,所以开发者可以在调试 ebuild 时覆盖一些东西。这不是任何 EAPI 规范的一部分。
警告 :你必须确定你的构建在并行编译上没有任何问题(make -j2)。应该对它进行彻底的测试,因为众所周知并行编译有时会失败,但又不总是如此。如果你确定你的软件包在并行构建中失败,并且无法解决这个问题,那么你应该显式的运行
emake -j1
。这是不得已的办法,因为它会显著的降低具有很多处理器的在系统的构建速度。
Install:
einstall [make options] 这用来代替 make install。执行:
make \ prefix=${ED}/usr \ datadir=${ED}/usr/share \ infodir=${ED}/usr/share/info \ localstatedir=${ED}/var/lib \ mandir=${ED}/usr/share/man \ sysconfdir=${ED}/etc \ ${EXTRA_EINSTALL} \ make options \ install
请 不 要用它代替
emake install DESTDIR=${D}
。那是安装 make-based 软件包的首选方法。还有,不要使用 EXTRA_EINSTALL 变量,因为它仅适用于用户。docompress [-x] <path> [list of more paths]
从 EAPI 4 开始,docompress helper 用来管理用以从可选的压缩中包括或排除的文件的列表。如果首个参数是-x,其后每个后续参数都添加到排除列表中。否则,将每个参数添加到包含列表。包含列表最初包含
/usr/share/doc
、/usr/share/info
和/usr/share/man
。排除列表最初包含/usr/share/doc/${PF}/html
。可选压缩应在 src_install 完成后执行,并且在执行任何后续阶段函数之前。对于包含列表中的每一项,假设它有 D 变量前置的值,那么:
- 如果它是一个目录,则应将其时为该目录下的每个文件或目录都在包含列表中。
- 如果项目是文件,则可以将其压缩除非如下所述已将其排除在外。
- 如果项目不存在,则将其忽略。
一个项目是否被排除根据如下决定:对于每个在排除列表中的项目,假设它具有 D 变量前置的值,那么:
- 如果它是一个目录,则应将其时为该目录下的每个文件或目录都在排除列表中。
- 如果项目是一个文件,则它将不会被压缩。
- 如果项目不存在,则将其忽略。
dosed s:orig:change:g <filename>
从 EAPI 4 开始,dosed helper 不在存在。ebuild 应该直接调用 sed(并且假设为 GNU sed)
在\({ED}中的文件名上执行 sed。如果未给出表达式,则将`s:\){D}::g`作为默认表达式。注意该表达式没有使用便宜前缀。
dosed s:/usr/local:/usr:g /usr/bin/some-script
在${ED}/usr/bin/some-script
上运行 sed。dodir <path> [more paths]
在${ED}中创建目录。
dodir /usr/lib/apache
创建${ED}/usr/lib/apache
。请注意,do*函数将会为你运行 dodir。如果该目录在 merge 的时候为空,那么请改用 keepdir。
diropts [options for install(1)]
可用于为在 dodir 中使用的安装函数定义选项。默认为-m0755
into <path>
为其他函数像 dobin、dosbin、doman、doinfo、dolib 设置 root(DESTTREE)
默认 root 是/usr
keepdir <path> [more paths]
类似于 dodir,但是用户创建原本为空的目录。PMS 未定义对完全空目录的处理,使用 keepdir 可以保证它们被追踪。
dobin <binary> [list of more binaries]
安装二进制或一列表的二进制到 DESTTREE/bin 中。创建所有必要的目录。
dosbin <binary> [list of more binaries]
安装二进制或一列表的二进制到 DESTTREE/sbin 中。创建所有必要的目录。
doinitd <init.d script> [list of more init.d scripts]
安装 Gentoo init.d 脚本。它们将会被安装到 Gentoo init.d 脚本的正确位置(etc/init.d)。创建所有必要的目录。
doconfd <conf.d file> [list of more conf.d files]
安装 Gentoo conf.d 文件。它们将会被安装到 Gentoo conf.d 文件的正确位置(etc/conf.d)。创建所有必要的目录。
doenvd <env.d entry> [list of more conf.d entries]
安装 Gentoo env.d 条目。它们将会被安装到 Gentoo env.d 条目的正确位置(etc/env.d)。创建所有必要的目录。
dolib <libraray> [list of more libraries]
dolib.a <libraray> [list of more libraries]
dolib.so <libraray> [list of more libraries]
安装库或一个列表的库到 DESTTREE/lib。创建所有必要的目录。
libopts [options for install(1)]
可用于为在 dolib 函数中使用的安装函数的定义选项。默认值为-m0644
doman [-i18n=<locale>] <man-page> [list of more man-pages]
根据手册文件结尾将 manual-pages 安装到
/usr/share/man/man[0-9n]
中。如果文件尚未压缩,则将其压缩。你可以用-i18n 选项指定特定语言环境的 manpages。那么 man-page 将会被安装到/usr/share/man/<locale>/man[0-9n]
中。从 EAPI 2 开始,一个在文件名中包含语言环境的特定语言环境 manpage 将会被安装到/usr/share/man/<locale>/man[0-9n]
,如果删除了文件名的语言环境部分,-i18n 选项将会没有效果。例如,在 EAPI2 中,命名为foo.<locale>.1
的 manpage 将会安装为/usr/share/man/<locale>/man1/foo.1
。从 EAPI 4 开始,-i18n 选项将会优先于语言环境后缀。dohard <filename> <linkname>
从 EAPI 4 开始,dohard helper 不再继续存在。ebuild 应该直接调用 ln(1)。
dosym <filename> <linkname>
执行 ln 命令以创建符号链接。
doheader [-r] <file> [list of more files]
将给定的头文件安装到/usr/include 中,默认文件模式为 0644(可以通过 insopts 函数修改)。设置-r 设置递归。doheader helper 从 EAPI 5 开始可用。
dohtml [-a filetypes] [-r] [-x list-of-dirs-to-ignore] [list-of-files-and-dirs]
将文件列表(以空格分隔)中的文件安装到/usr/share/doc/${PF}/html 中,提供的文件以.htm、.html、.css、.js 结尾,设置-a 限制将会包含什么类型的文件,-A 追加到默认列表,设置-x 设置要排除的目录(默认不包括 CVS),-p 设置文档前缀,-r 设置为递归。
doinfo <info-file> [list of more info-files]
安装 info-page 到 DESTDIR/info 中。文件将会自动被 gzip 压缩。创建所有必要的目录。
domo <locale-file> [list of more locale-files]
根据 local-file 的结尾将 locale-file 安装到 DESTDIR/usr/share/locale/[LANG]中。创建所有必要的目录。
fowners [-h|-H|-L|-P|-R] [user][:group] <file> [files]
fperms [-R] <permissions> <file> [files]
执行 chown(foweners)或 chmod(fperms)更改文件权限。
insinto [path] 设置 doins 函数的目的路径。
默认路径为/。
insopts [options for install(1)]
可用于定义 doins 中使用的安装函数的选项。默认值为-m0644。
doins [-r] <file> [list of more files]
安装文件到被 insinto 控制的路径。该函数使用 install(1)。创建所有必须的目录。设置-r 设置递归。从 EAPI 4 开始,doins 和 newins 都保留符号链接。在 EAPI 3 或更早,符号链接被取消引用而不是保留。
exeinto [path]
设置 doexe 函数的目的路径。
默认路径为/。
exeopts [options for install(1)]
可用于为 doexe 中使用的安装函数定义选项。默认值为-m0755。
doexe <executable> [list of more executables]
安装可执行文件到被 exeinto 控制的路径中。该函数使用 install(1)。创建所有必要的目录。
docinto [path]
设置安装到文档树中时 dodoc 和 dohtml 所使用的子目录(基于/usr/share/doc/${PF}/)。默认没有子目录,或仅""。
dodoc [-r] <document> [list of more documents]
安装文档或一列表的文档到
/usr/share/doc/${PF}/<docinfo path>
。文档被标记为压缩。创建所有必要的目录。从 EAPI 4 开始,通过开启新的-r 选项启用对递归的支持。newbin <old file> <new filename>
newsbin <old file> <new filename>
newinitd <old file> <new filename>
newconfd <old file> <new filename>
newenvd <old file> <new filename>
newlib.so <old file> <new filename>
newlib.a <old file> <new filename>
newman <old file> <new filename>
newins <old file> <new filename>
newexe <old file> <new filename>
newdoc <old file> <new filename>
所有这些函数就像 do*函数一样,但是它们仅处理一个文件,并且文件被安装为[new filename]。从 EAPI 5 开始,当第一个参数为
-
(连字符)时,将读取标准输入。