快速入门ebuild指南

此页面提供了关于ebuild编写的非常简要的介绍。它不会尝试涵盖开发人员将遇到的许多细节或问题——相反,它提供了一些简单的示例,这些示例在尝试掌握ebuild工作原理的基本概念时可能有用。

有关所有来龙去脉的完整介绍,请参阅Ebuild编写通用概念章节也将有用。

请注意,此处使用的示例虽然基于真实的树ebuild,但已经删除、更改和简化了几个部分。

第一个ebuild

我们将从Exuberant Ctags实用程序(一种源代码索引工具)的ebuild开始。这是一个简化的dev-util/ctags/ctags-5.5.4.ebuild(您可以在主树中看到真实的ebuild)。

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

EAPI=8

DESCRIPTION="Exuberant ctags generates tags files for quick source navigation"
HOMEPAGE="https://ctags.io/ https://github.com/universal-ctags/ctags"
SRC_URI="mirror://sourceforge/ctags/${P}.tar.gz"

LICENSE="GPL-2+"
SLOT="0"
KEYWORDS="~mips ~sparc ~x86"

src_configure() {
	econf --with-posix-regex
}

src_install() {
	emake DESTDIR="${D}" install

	dodoc FAQ NEWS README
}

基本格式

如您所见,ebuild只是在特殊环境中执行的bash脚本。

ebuild顶部有一个标题块。这在所有ebuild中都存在。

Ebuild使用制表符缩进,每个制表符代表四个空格。参见Ebuild文件格式

信息变量

接下来,有一系列变量。这些变量告诉Portage有关ebuild和相关软件包的各种信息。

ebuild的EAPI,请参阅EAPI用法和描述

DESCRIPTION变量设置为软件包及其用途的简短描述。

HOMEPAGE设置为指向软件包主页的链接(请记住包含URI方案,例如https://)。

SRC_URI告诉Portage用于下载源代码tarball的地址。此处,mirror://sourceforge/是一种特殊表示法,表示“任何Sourceforge镜像”。${P}是由Portage设置的只读变量,它是软件包的名称和版本——在本例中,它将是ctags-5.5.4

LICENSE设置为GPL-2+(GNU通用公共许可证版本2或(根据您的选择)任何更高版本)。

SLOT变量告诉Portage此软件包安装到的插槽。如果您以前从未见过插槽,则只需使用"0"或阅读插槽

KEYWORDS变量设置为已在此ebuild上测试过的架构。对于新编写的ebuild,我们使用~关键字——即使软件包似乎可以工作,也不会直接提交到稳定版。有关详细信息,请参阅关键字和稳定化

构建函数

接下来,是一个名为src_configure的函数。当Portage想要配置软件包时,它将调用此函数。econf函数是用于调用./configure的包装器。如果由于某种原因econf中发生错误,Portage将停止而不是尝试继续安装。

当Portage想要安装软件包时,将调用src_install函数。这里有一个细微差别——我们不必直接安装到活动文件系统,而必须安装到一个特殊位置,该位置由${D}变量给出(Portage设置此变量——请参阅安装目标沙箱)。

dodoc设置为用于将文件安装到/usr/share/doc相关部分的帮助器函数。

Ebuild可以定义其他函数(请参阅Ebuild阶段函数)。在所有情况下,Portage都提供了一个合理的默认实现,该实现通常可以完成“正确的事情”。例如,这里不需要定义src_unpacksrc_compile函数——src_unpack函数用于执行任何tarball解包或源文件修补,但默认实现在此情况下完成了我们需要的所有操作。类似地,默认的src_compile函数将调用emake,它是make的包装器。

带有依赖项的ebuild

在ctags示例中,我们没有告诉Portage任何依赖项。碰巧的是,这没关系,因为ctags只需要一个基本工具链来编译和运行(请参阅隐式系统依赖项,了解为什么我们不需要显式依赖于这些项)。但是,生活很少如此简单。

这是app-misc/detox/detox-1.1.1.ebuild

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

EAPI=8

DESCRIPTION="detox safely removes spaces and strange characters from filenames"
HOMEPAGE="http://detox.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~hppa ~mips sparc x86"

RDEPEND="dev-libs/popt"
DEPEND="${RDEPEND}
	sys-devel/flex"
BDEPEND="sys-devel/bison"

src_configure() {
	econf --with-popt
}

同样,您可以看到ebuild标题和各种信息变量。在SRC_URI中,${PN}用于获取软件包的名称(带版本后缀)(还有更多此类变量——请参阅预定义的只读变量)。

我们仅定义src_configuresrc_install不需要定义,因为调用emake install并安装常用文档文件的默认实现对软件包有效。

BDEPENDDEPENDRDEPEND变量用于Portage确定构建和运行软件包需要哪些软件包。BDEPEND变量列出构建时(可执行)依赖项,DEPEND变量列出编译时依赖项,RDEPEND变量列出运行时依赖项。请参阅依赖项以获取一些更复杂的示例。

带有补丁的ebuild

通常我们需要应用补丁。这可以通过在全局范围内定义PATCHES数组或在src_prepare函数中使用eapply帮助器函数来完成。要使用eapply,必须使用EAPI 7。这是app-misc/detox/detox-1.1.0.ebuild

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

EAPI=8

DESCRIPTION="detox safely removes spaces and strange characters from filenames"
HOMEPAGE="http://detox.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~hppa ~mips ~sparc ~x86"

RDEPEND="dev-libs/popt"
DEPEND="${RDEPEND}
	sys-devel/flex"
BDEPEND="sys-devel/bison"

src_prepare() {
	eapply "${FILESDIR}"/${P}-destdir.patch \
		"${FILESDIR}"/${P}-parallel_build.patch
	eapply_user
}

src_configure() {
	econf --with-popt
}

请注意${FILESDIR}/${P}-destdir.patch——这指的是detox-1.1.0-destdir.patch,它位于Gentoo存储库中的files/子目录中。较大的补丁文件必须放在您开发人员的空间中,位于dev.gentoo.org,而不是在files/或镜像中——请参阅合适的下载主机使用eapply打补丁

当覆盖src_prepare阶段时,必须确保调用eapply_user

带有USE标志的ebuild

现在来了解一些USE标志。这是dev-libs/libiconv/libiconv-1.9.2.ebuild,它是libc实现(这些实现没有自己的iconv)的替代iconv。

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

EAPI=8

DESCRIPTION="GNU charset conversion library for libc which doesn't implement it"
HOMEPAGE="https://www.gnu.org/software/libiconv/"
SRC_URI="ftp://ftp.gnu.org/pub/gnu/libiconv/${P}.tar.gz"

LICENSE="LGPL-2+ GPL-3+"
SLOT="0"
KEYWORDS="~amd64 ~ppc ~sparc ~x86"
IUSE="nls"

RDEPEND="!sys-libs/glibc"
DEPEND="${RDEPEND}"

src_configure() {
	econf $(use_enable nls)
}

请注意 IUSE 变量。它列出了 ebuild 使用的所有(非特殊)use 标志。这用于 emerge -pv 输出,以及其他用途。

软件包的 ./configure 脚本接受常用的 --enable-nls--disable-nls 参数。我们使用 use_enable 实用程序函数根据用户的 USE 标志自动生成这些参数(请参阅 查询函数参考)。

另一个更复杂的示例,这次基于 mail-client/sylpheed/sylpheed-1.0.4.ebuild

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

EAPI=8

inherit desktop

DESCRIPTION="A lightweight email client and newsreader"
HOMEPAGE="https://sylpheed.good-day.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="GPL-2+ LGPL-2.1+"
SLOT="0"
KEYWORDS="~alpha amd64 hppa ~ia64 ppc ppc64 sparc x86"
IUSE="crypt imlib ipv6 ldap nls pda ssl xface"

RDEPEND="=x11-libs/gtk+-2*
	crypt? ( >=app-crypt/gpgme-0.4.5 )
	imlib? ( media-libs/imlib2 )
	ldap? ( >=net-nds/openldap-2.0.11 )
	pda? ( app-pda/jpilot )
	ssl? ( dev-libs/openssl )
	xface? ( >=media-libs/compface-1.4 )
	app-misc/mime-types
	x11-misc/shared-mime-info"
DEPEND="${RDEPEND}"
BDEPEND="dev-util/pkgconfig
	nls? ( >=sys-devel/gettext-0.12.1 )"

PATCHES=(
	"${FILESDIR}"/${PN}-namespace.patch
	"${FILESDIR}"/${PN}-procmime.patch
)

src_configure() {
	econf \
		$(use_enable nls) \
		$(use_enable ssl) \
		$(use_enable crypt gpgme) \
		$(use_enable pda jpilot) \
		$(use_enable ldap) \
		$(use_enable ipv6) \
		$(use_enable imlib) \
		$(use_enable xface compface)
}

src_install() {
	emake DESTDIR="${D}" install

	doicon sylpheed.png
	domenu sylpheed.desktop

	dodoc [A-Z][A-Z]* ChangeLog*
}

请注意可选依赖项。一些 use_enable 行使用了双参数版本——当 USE 标志名称与 ./configure 参数不完全匹配时,这很有帮助。