快速入门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_unpack
和src_compile
函数——src_unpack
函数用于执行任何tarball解包或源文件修补,但默认实现在此情况下完成了我们需要的所有操作。类似地,默认的src_compile
函数将调用emake
,它是make
的包装器。
|| die
结构来检查错误。在EAPI 4中,这不再必要——如果某些操作失败,Portage提供的函数将自行终止。带有依赖项的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_configure
。src_install
不需要定义,因为调用emake install
并安装常用文档文件的默认实现对软件包有效。
将BDEPEND
、DEPEND
和RDEPEND
变量用于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
参数不完全匹配时,这很有帮助。