Debian 软件包修改、打包及编译流程

本文简述了获取一个 Debian 软件包的代码、对其修改并打包编译的一般流程。本文一开始是针对 PHP 这个特定软件包编写的,于 2022 年 2 月 2 日修改为通用代码。

本文参考了 Debian 维护者指南。该文档是一份详细完整的 Debian 打包指南,本文针对仅个人使用的情况,进行了大量的简化。

本文亦适用于 Ubuntu,包括 WSL。事实上本文的代码测试大部分都是在 Ubuntu Server 20.04 LTS on WSL 上完成的。

获取源代码

Debian 软件包 是 Debian 软件仓库 Web 界面。在此可以搜索想要修改的软件包。

在软件包详情的右侧,可以找到软件包的源码及签名。通常,他们是 .tar.gz.asc.dsc 文件。其中包含 .orig 的是原始的上游代码,而包含 .debian 的是 Debian 构建信息和 Debian 对上游的补丁(Patch)。这些文件需要被全部下载。

软件下载完成后,使用 dpkg-source -x *.dsc 命令检查 GPG 签名是否正确并自动解压源码、打上补丁。

安装打包环境

1
sudo apt install build-essential fakeroot devscripts quilt

然后进入源代码目录,安装依赖:

1
sudo mk-build-deps -i

修改源码

建议使用 Quilt 管理修改的源码,方便后期维护。具体是使用教程可以查看 使用 Quilt

首先在 ~/.bashrc 内添加环境变量:

1
2
3
export QUILT_PATCHES=debian/patches
export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
export EDITOR=vim

然后添加一个新的 Patch

1
quilt new 00xx-My-Edit.patch

必须在修改文件前,让 Quilt 跟踪被修改的文件:

1
quilt add <被修改的文件>

在修改完成后,提交修改:

1
2
3
quilt refresh
quilt header -e
quilt pop -a

然后修改版本变动记录 changelog

1
dch

进行编译

1
dpkg-buildpackage -b -uc -us

如果需要指定编译的进程数,加上 -j 参数即可。例如 -j4 代表 4 个进程。

搭建私有软件源

搭建私有软件源,需要一对 GPG 密钥以供客户端验证发布者身份。在开始之前需要确保已经生成好 GPG 密钥。

安装 reprepro:

1
sudo apt install reprepro

创建镜像的根目录,例如 mirror,然后创建镜像元信息 distributions

1
2
mkdir mirror/conf
vim mirror/conf/distributions

元信息模板如下:

1
2
3
4
5
6
7
Origin: 仓库名称
Label: 仓库名称或
Codename: 系统代号(如 fosal)
Architectures: 架构(如 amd64)
Components: 标签(main、universe、multiverse)
Description: 描述
SignWith: GPG公钥指纹

向仓库添加自己的公钥信息,以便客户端使用:

1
gpg -a --export <uid> > mirror/keyring.gpg.key

向仓库添加 deb 文件:

1
reprepro includedeb <系统代号> <deb文件目录>

此处略去搭建 Web 服务器的步骤。

在客户端系统上执行 get -O - http://www.example.com/path/to/mirror/keyring.gpg.key | apt-key add -,然后编辑 sources.list 添加自己的软件源,再执行 apt update 即可。