Quickstart Ebuild Guide
快速ebuild向导
这页是个非常简洁的ebuild写作指南。它不包含许多开发者面临的细节和问题,而是给出足够用来理解ebuild如何工作的微小的例子。
为了正确的涵盖所有来龙去脉,参见Ebuild Writing。General Concepts章节也很有用。
注意这里的例子,虽然基于真实的ebuilds树,但有些部分大刀阔斧的修剪、更改和简化了。
第一个Ebuild
我们从Exuberant Ctags工具开始,一个代码索引工具。这时一个简化的=dev-util/ctags/ctags-5.5.4.ebuild=(你能在主目录下找到真实的ebuild)
# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 DESCRIPTION="Exuberant ctags generates tags files for quick source navigation" HOMEPAGE="http://ctags.sourceforge.net" 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 dohtml EXTENDING.html ctags.html }
基本格式
如你所见,ebuilds仅仅是在特殊环境中执行的=bash=脚本。
在ebuild的顶部是头块(header block),出现在所有ebuild中。
Ebuild使用tabs缩进,每个tab代表四格空格。参见Ebuild File Format.
信息变量
接着,有一系列变量将告诉Portage有关包和ebuild的各种东西。
ebuild的=EAPI=,参见EAPI Usage and Description
=DESCRIPTION=变量是包及包的作用的简短描述。
=HOMEPAGE=是链接到包的主页的链接。(切记包含=http://=部分)。
=SRCURI=告诉Portage用来下载源码包的地址。这里,=mirror://sourceforge/=是意为“任何Sourceforge镜像”的特殊标记。=${P}=是由Portage设置的只读变量,即包名和版本-–—示例中是=ctags-5.5.4=。
=LICENSE=是协议=GPL-2=(GNU General Public License version 2)。
=SLOT=告诉Portage这个包安装到哪个slot。
=KEYWORDS=变量设置ebuild测试的架构。我们使用=~=keyword给我们新写的ebuild,包不允许被直接推送到稳定版,即使他们似乎工作。参见Keywording查看细节。
构建函数
接着一个叫=srcconfigure=的函数,Portage将在配置(configure)包时调用它。=econf=是执行=./configure=的一个封装。如果由于某些原因在=econf=时出错,Portage将停止而非继续安装。
当Portage准备安装包时会调用=D
=变量给出的特殊位置(Portage设置这个-–—参见Install Destinations和Sandbox)
注意:常规安装方法是=emake DESTDIR="${D}" install=,这适合所有符合标准的=Makefile=。如果给出sandbox错误,尝试用=einstall=代替。如果仍然失败,参看src\install如何手工安装。
=dodoc=和=dohtml=部分是安装文件到相应的=/usr/share/doc=部分的辅助函数。
ebuild可以定义其它函数(参见Ebuild Functions)。在大多情况下,Portage提供合理的默认实现,通常做正确的事情,不需要定义=srcunpack=和=srccompile=函数。例如,=srcunpack=函数被用来解包或给源码打补丁,但是这个例子中默认实现做了我们所需要的所有事情。同样默认的=srccompile=函数将调用=emake=-–—一个=make=的封装。
注意:先前=|| die=结构不得不添加到每个命令后去检查错误。这在EAPI 4中不在必要-–—如果什么出错的话Portage提供的函数将自己die。
含依赖的ebuild
在ctags的例子中,我们没告诉Portage有关任何依赖。当情况是这样时,没关系,因为ctags仅仅需要一个基本的工具链来编译和运行(参见Implicit System Dependency理解为何我们不需要显式依赖)。然而事情很少这么简单。
这是=app-misc/detox/detox-1.1.1.ebuild=:
# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 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 sys-devel/bison" src_configure() { econf --with-popt } src_install() { emake DESTDIR="${D}" install dodoc README CHANGES }
你再次看到ebuild头和不通的信息变量。在=SRCURI=中,=${PN}=用来获取不含尾部版本的包名(还有更多的这种变量-–—参见Predefined Read-Only Variables)。
我们再次定义了=srcconfigure=和=srcinstall=函数。
Portage依靠=DEPEND=和=RDEPEND=变量决定构建和运行包需要哪些变量。=DEPEND=变量列出编译时依赖,=RDEPEND=变量列出运行时依赖。参见Dependencies获取更复杂的例子。
带补丁的ebuild
我们经常要打补丁。这通过=epatch=辅助函数在=srcprepare=函数中完成。为了使用=epatch=,必须告诉Portage需要的=eutils=eclass(eclass就像库一样)-–—这通过在ebuild顶部的=inherit eutils=完成。这是=app-misc/detoxdetox-1.1.0.ebuild=:
# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 inherit eutils 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 sys-devel/bison" src_prepare() { epatch "${FILESDIR}"/${P}-destdir.patch \ "${FILESDIR}"/${P}-parallel_build.patch } src_configure() { econf --with-popt } src_install() { emake DESTDIR="${D}" install dodoc README CHANGES }
注意=\({FILESDIR}/\){P}-destdir.patch=指向=detox-1.1.0-destdir.patch=,这个文件在Portage树的=files/=子文件夹中。更大的补丁文件必须在你的开发者空间=dev.gentoo.org=而不是=files/=或镜像中-–—参见Gentoo Mirrors和Patching with epatch。
带USE标记的ebuild
对=USE=标记,这里有个例子=dev-libs/libiconv/libiconv-1.9.2.ebuild=,一个=libc=实现的iconv替代。
# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 DESCRIPTION="GNU charset conversion library for libc which doesn't implement it" HOMEPAGE="http://www.gnu.org/software/libiconv/" SRC_URI="ftp://ftp.gnu.org/pub/gnu/libiconv/${P}.tar.gz" LICENSE="LGPL-2.1" SLOT="0" KEYWORDS="~amd64 ~ppc ~sparc ~x86" IUSE="nls" DEPEND="!sys-libs/glibc" src_configure() { econf $(use_enable nls) } src_install() { emake DESTDIR="${D}" install }
注意=IUSE=变量。这列出了所有(非特殊)ebuild使用的use标记。除其它事项外,它还将被用作=emerge -pv=时输出。
这个包的=./configure=脚本使用了常规的=–enable-nls=或=–disable-nls=参数。我们用=useenable=工具函数依赖用户=USE=标记自动生成这个(参见Query Function Reference)。
另一个复杂的例子是=mail-client/sylpheed/sylpheed-1.0.4.ebuild=:
# Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ EAPI=4 inherit eutils DESCRIPTION="A lightweight email client and newsreader" HOMEPAGE="http://sylpheed.good-day.net/" SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2" LICENSE="GPL-2" 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} dev-util/pkgconfig nls? ( >=sys-devel/gettext-0.12.1 )" src_prepare() { epatch "${FILESDIR}"/${PN}-namespace.diff \ "${FILESDIR}"/${PN}-procmime.diff } 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* }
注意可选依赖。有些=useenable=行使用两个参数的版本-–—这在USE标记名不完全匹配=./configure=参数时非常有用。