【译】如何书写 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 文件,并且完成它,这有几个原因:

  1. 这儿(/usr/portage)是你的一个远程Portage树的本地拷贝的存放位置:如果在这儿放一个 ebuild 文件,或者更新一个 ebuild,当你运行emerge-sync的时候,你的更新将会丢失,因此你可以在/usr/local/portage,home 目录下的一个子目录,或者使用一个本地overlay来代替
  2. ebuild 文件不在正确的文件夹:ebuild 文件必须位于分类(category)文件下的以包命名的子文件夹下,因此如果你想使这个 ebuild 生效,你必须放置它在类似/usr/local/portage/app-misc/hello-world/这样的位置
  3. ebuild 文件没有版本说明:软件包有版本,他们必须在文件名称中指明,因此我们可能会创建这样的文件/usr/local/portage/app-misc/hello-world/hello-worl-1.0.ebuild
    因此,让我们建一个最小的 ebuild,为了让这个过程更简单,我允许你在 root 用户下运行,如果你喜欢,你也可以使用 sudo
1
2
3
root# mkdir -p /usr/local/portage/app-misc/hello-world
root# cd $!
root# cp /usr/portage/header.txt ./hello/world-1.0.ebuild

我们递归创建文件夹,然后进入($! 将会调用上一条命令的最后一个参数),然后我们添加了一个 ebuild 头声明,如果你想将软件添加到 portage 树中的话,这是必须的

这也不会运行,这是我们定义最小数量的变量的要求,因此我们将以下代码添加到 ebuild 中

CODE: 你至少得在ebuild中添加如下代码

1
2
DESCRIPTION="A classical example to use when starting on something new"
SLOT="0"

仅仅只是两个变量? 没错,这要求我们要有自己的包的描述信息,以及我们能够确定自己不使用 SLOT,这就是”0”的意思

到这里,我们就可以运行以下命令将我们的包安装到系统里了

1
root# 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
2
3
4
5
6
7
8
9
10
11
12
13
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI="5"

DESCRIPTION="A classical example to use when starting on something new"
HOMEPAGE="http://wiki.gentoo.org/index.php?title=Basic_guide_to_write_Gentoo_Ebuilds"
SRC_URI="http://dev.gentoo.org/~tomwij/files/wiki/hello-world-1.0.tar.gz"

LICENSE="MIT"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
1
root# 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
2
3
funtion src_install() {
dobin hello-world
}

dobin这个函数可以拷贝 hello-world 文件到临时的build文件夹(${D}/usr/bin/),并且是它可运行,后边portage将会检查,并且拷贝到运行的系统中

让我们再试试…

1
root# ebuild hello-world-1.0.ebuild manifest clean merge

现在我们可以看 “>>> /usr/bin/hello-world” 输出,看起来很不错!

让我们试试这个函数运行怎么样

1
user$ hello-world

现在我们完成了安装一个输出”Hello world!” 的包

【译】如何书写 Gentoo Ebuilds 的基本规则

http://www.0xforee.top/2015/11/24/gentoo-basic-guide-ebuilds/

作者

0xforee

发布于

2015-11-24

更新于

2015-11-28

许可协议


欢迎关注我的公众号 0xforee,第一时间获取更多有价值的思考

评论