本文简要介绍如何创建自己的 ebuild 和 overlay。

自定义 overlay

ebuild 是规定软件包安装的文件,overlay 可以看成是盛放 ebuild 的容器。为了方便包管理系统和维护者管理及使用 ebuild,overlay 是必不可少的。因此在编写 ebuild 之前,首先需要创建一个自己的 overlay。

overlay 的存在形式有两种,一种在本地,一种在远程。本文使用第二种方式。

首先在本地创建一个 overlay。

sudo eselect repository create overlay_name
# overlay的默认存储位置在/usr/portage,笔者将该位置修改为/var/db/repos,下文中不再提醒。
cd /var/db/repos/overlay_name

然后在 github 上建立一个仓库,把仓库 clone 下来,将/var/db/repos/overlay_name中所有文件复制到仓库中。

注意仓库的名称可以与之前设置的 overlay_name 不同。

然后将修改后的仓库推送到远程。并执行以下命令删除本地 overlay。

sudo eselect repository remove -f overlay_name

然后再通过以下命令添加远程 overlay。

# git_url 为仓库地址
sudo eselect repository add overlay_name git git_url

现在远程 overlay 已经建立完成,只需修改本地仓库,然后推送到远程,然后使用eix-sync或者其他方式同步 overlay 即可。

ebuild 的处理

首先来看写好的 ebuild 如何处理。先在gentoo portage overlay处随意搜索并下载一个 ebuild。比如app-editors/neovim。然后在本地仓库中新建目录app-editors/neovim,并把neovim-9999.ebuild复制到该目录下。

下一步是对该 ebuild 进行签名。这一步需要用到app-portage/repoman(也可以使用老的ebuild命令,但建议用新的)。

# 首先将当前目录加入到repoman的执行对象中。
pushd path_to_repository/app-editors/neovim
# 然后进行签名。
repoman manifest
# 然后可以将当前目录退出。
popd

签名成功后,在该目录下会生成一个 Manifest 文件。

现在,将修改后的仓库推送上去并且同步 overlay 就可以安装刚才配置好的neovim-9999了。

ebuild 的写法

接下来写一个简单的dev-util/ctags/ctags-5.5.4.ebuild。内容如下。

# Copyright 2022 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 是被 shell 解析的,也就是说这个文件中的内容其实是 shell 脚本的一堆变量声明以及函数调用。

ebuild 文件的一二两行只是一些声明,内容可以是固定的,具体可以参考/var/db/repos/gentoo/header.txt

EAPI 是 ebuild 使用的 shell 函数库的版本,这里选择的是 8,是较新的版本。

要查看这种变量的详情,可以使用 man 1 ebuild,man 5 ebuild。

为节省篇幅,其他内容不作说明,需要了解的可以查看文档或者在网上查询。

写好之后使用之前提到的处理方式进行处理,但暂时不要推送到远程,还需在本地进行测试。

首先测试从上游拉取和解压源码。

sudo ebuild ./ctags-5.5.4.ebuild clean unpack

然后测试是否可以成功编译并安装。(注意这不是正式安装)

sudo ebuild ./ctags-5.5.4.ebuild clean test install

最后还需要通过repoman full -dx进行质量检测。注意该命令需要在同步 overlay 后在 ebuild 的最终位置,即/var/db/repos/overlay_name/…下执行。

本文只是介绍了自建 overlay 和编写使用 ebuild 的基本流程,对于最关键的一步,即如何编写 ebuild 并未做详细介绍。这是因为这部分内容非常专业且内容繁杂,此外 gentoo 社区中关于这方面的资源非常丰富,完全可以自行学习。gentoo wiki ebuild guide 中的External resources一节列出了比较丰富的资源,可以参考使用。

如果你不想自己写 ebuild,也可以下载现成的。这种下载来的 ebuild 主要有两种用途。第一,修改版本。这种情况下基本上只需要修改极少部分内容。第二,解决验证方面的问题。比如下载的文件在校验时发现大小对不上,这种基本上就是 Manifest 有问题。特别常见于从仓库拉取源码的版本,即一串 9 的99999版本。原因是 Manifest 没有及时更新,当前从仓库拉取的源码大小已经与之前的不同了。这种情况下只需要拿到这个 ebuild 然后自己生成一个 Manifest 即可。其他的用途比较少见,比如解决软件依赖冲突问题,这种除非是运气好可以直接改某个依赖的版本,否则对于非专业人士而言,自己折腾不如等别人改好。