【译】如何书写 Gentoo Ebuilds 的基本规则
原文:https://wiki.gentoo.org/wiki/Basic_guide_to_write_Gentoo_Ebuilds
这篇文章包含了 Ebuilds 开发的一些介绍。
Portage, Gentoo的核心,使用 ebuild 脚本搭建
为了能够进行包管理,你必须定义包(packages)是什么,他们怎么下载,解压,打补丁(patch),编译,安装以及合并(从一个临时的文件夹拷贝到你在用的文件系统)源文件和(或)二进制文件,为了使他更好用,我们还需要添加一些有用的元数据(metadata),例如 USE Flags, 补丁(patches)以及其他,这些工作可以让我们更好的维护这个这个过程,这些中的大部分都在一个 ebuild 文件中定义(一个 bash 脚本文件)
Ebuilds,他们存在哪里,我怎么样创建一个
如果你已经安装安装过 Gentoo,你或许记得下载并解压过一个 Portage 树的镜像,这个镜像(当你运行emere --sync
升级到的最近的更新)内容中包含了大部分的 ebuilds,这就是 portage 树,它解包之后通常在 /usr/portage
位置
首先,你不能直接创建一个 /usr/portage/hello-wolrd.ebuild
文件,并且完成它,这有几个原因:
- 这儿(/usr/portage)是你的一个远程Portage树的本地拷贝的存放位置:如果在这儿放一个 ebuild 文件,或者更新一个 ebuild,当你运行
emerge-sync
的时候,你的更新将会丢失,因此你可以在/usr/local/portage
,home 目录下的一个子目录,或者使用一个本地overlay来代替 - ebuild 文件不在正确的文件夹:ebuild 文件必须位于分类(category)文件下的以包命名的子文件夹下,因此如果你想使这个 ebuild 生效,你必须放置它在类似
/usr/local/portage/app-misc/hello-world/
这样的位置 - ebuild 文件没有版本说明:软件包有版本,他们必须在文件名称中指明,因此我们可能会创建这样的文件
/usr/local/portage/app-misc/hello-world/hello-worl-1.0.ebuild
因此,让我们建一个最小的 ebuild,为了让这个过程更简单,我允许你在 root 用户下运行,如果你喜欢,你也可以使用 sudo
1 | mkdir -p /usr/local/portage/app-misc/hello-world |
我们递归创建文件夹,然后进入($! 将会调用上一条命令的最后一个参数),然后我们添加了一个 ebuild 头声明,如果你想将软件添加到 portage 树中的话,这是必须的
这也不会运行,这是我们定义最小数量的变量的要求,因此我们将以下代码添加到 ebuild 中
CODE: 你至少得在ebuild中添加如下代码
1 | DESCRIPTION="A classical example to use when starting on something new" |
仅仅只是两个变量? 没错,这要求我们要有自己的包的描述信息,以及我们能够确定自己不使用 SLOT,这就是”0”的意思
到这里,我们就可以运行以下命令将我们的包安装到系统里了
1 | ebuild hello-world-1.0.ebuild manifest clean merge |
这条命令将会显示(manifest)(创建 hash,取消显示),清除工作目录的任何的临时文件,并且安装(emerge)ebuild
非常好,你已经创建并测试了你的第一个 ebuild,虽然没有做多少,这确实是一个好的开始
让我们创建一个运行时显示”hello world”的文件
添加更多有用的变量
如果你看过 /usr/portage/skel.ebuild
文件,你将会发现一个 skeleton 有大量的文档,我们将会添加这些中的一些变量,将 ebuild 变成我们想要的样子,因此如果能够在我们继续之前能够读完这个文件就再好不过了,将下边的代码添加到我们的 hello-world.1.0.ebuild
文件中
CODE 官方(council)建议使用最新的ebuild的API
1 | EAPI="5" |
重要提示!! 以上的变量必须在头说明之后首先被列出,因此我们一般都是将它添加到变量的上边
更多关于 EAPI 的信息,看 这里
CODE 以下代码添加对于开发者来说软件可以被找到的主页(homepage)HOMEPAGE="http://wiki.gentoo.org/index.php?title=Basic_guide_to_write_Gentoo_Ebuilds"
CODE 以下代码添加我们将从哪里下载软件,由这个文档的作者添加SRC_URI="http://dev.gentoo.org/~tomwij/files/wiki/hello-world-1.0.tar.gz"
这是一个简单的包含可以输出”Hello world!”的hello-world脚本的压缩包(tarball)
接下来,我们需要指定一个证书(license),我特别声明我正在使用MIT证书,因此让我们加入它
CODE 以下代码表示我们在MIT证书下
1 | LICENSE="MIT" |
我们已经完成了 SLOT,现在我们可以来看看 KEYWORDS,KEYWORDS 变量将会告诉你的安装包工作在哪个平台上(arches),也会指明是否被屏蔽(masked)(没有被列出或者被确切的使用-列出),还会指明是否是未测试untested(),或者是稳定版(列出的,但是没有符号在前边),我们现在能做的就是列出所有平台,并且指明是未测试的,对,是所有的平台,因为他们都可以运行 shell 脚本
CODE 我们可能很确信我们的包可以运行在所有的平台上,但是可能还没有稳定
1 | KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86" |
其他的变量定义一些更多的东西(在 skel.ebuild
中检查他们),但是我们现在不需要这些,你也可以看到还有一些函数,但不要着急,让我们先来看看直到现在 ebuild 已经做了哪些工作
CODE ebuild文件看起来就像这样
1 | # Copyright 1999-2015 Gentoo Foundation |
1 | ebuild hello-world-1.0.ebuild manifest clean merge |
我们可以看到,这是它第一次尝试从一个镜像下载我们的文件,但是不是 gentoo 的镜像,而是我们所指定的 SRC_URI 变量的值
当它有了一个文件之后,他就能够创建一个 manifest,这包含了我们的 ebuild 和已下载文件的 hash 值,来确保数据完整,传输没有发生错误
然后,emerge 系统开始介入,数据完整性是第一次需要检查的,然后我们可以看到我们下载的压缩包已经自动解压了,这一点很有用,我们没有必要再去实现,我们可以改变这个行为通过覆盖它的函数(src_unpack),设置一些变量,或者使用定义了这些行为的 eclasses,当然这个例子中我们不需要这么干
当我们看到更多的内容之后,我们能看到它试着准备,配置,编译和安装,在准备阶段,通常会执行打补丁操作,在配置和编译阶段,通常会执行build操作,默认我们运行econf
(./configure 的一个封装),以及emake
(make 的一个封装),但是如果我们使用一个 shell 脚本,我们不需要调整这些阶段
现在,最后一步看起来不是很正确,还没有安装我们的文件呢
告诉我们的ebuild哪里安装我们的shell脚本
在我们的开发者文档中,我们可以发现阶段功能的一些说明,src_install
看起来对我们现在想要做的很有帮助,如果你点击 src_install 链接,你可以看到对于每个 EAPI 中,这个函数所作的一些操作以及一些例子,默认的看起来并不是很合适,我们需要定义自己的 src_intall,在这个函数中,我们将会调用另外的函数执行安装的工作,这些函数的概览,我们可以在安装函数中找到
因此我们可以将以下代码添加到我们的ebuild中
CODE 让我们将我们的shell脚本放到/usr/bin中,并且使他可以运行
1 | funtion src_install() { |
dobin
这个函数可以拷贝 hello-world 文件到临时的build文件夹(${D}/usr/bin/),并且是它可运行,后边portage将会检查,并且拷贝到运行的系统中
让我们再试试…
1 | ebuild hello-world-1.0.ebuild manifest clean merge |
现在我们可以看 “>>> /usr/bin/hello-world” 输出,看起来很不错!
让我们试试这个函数运行怎么样
1 | hello-world |
现在我们完成了安装一个输出”Hello world!” 的包
【译】如何书写 Gentoo Ebuilds 的基本规则
http://www.0xforee.top/2015/11/24/gentoo-basic-guide-ebuilds/