本文简述了获取一个 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 | export QUILT_PATCHES=debian/patches |
然后添加一个新的 Patch
1 | quilt new 00xx-My-Edit.patch |
必须在修改文件前,让 Quilt 跟踪被修改的文件:
1 | quilt add <被修改的文件> |
在修改完成后,提交修改:
1 | quilt refresh |
然后修改版本变动记录 changelog
:
1 | dch |
进行编译
1 | dpkg-buildpackage -b -uc -us |
如果需要指定编译的进程数,加上 -j
参数即可。例如 -j4
代表 4 个进程。
搭建私有软件源
搭建私有软件源,需要一对 GPG 密钥以供客户端验证发布者身份。在开始之前需要确保已经生成好 GPG 密钥。
安装 reprepro
:
1 | sudo apt install reprepro |
创建镜像的根目录,例如 mirror
,然后创建镜像元信息 distributions
:
1 | mkdir mirror/conf |
元信息模板如下:
1 | Origin: 仓库名称 |
向仓库添加自己的公钥信息,以便客户端使用:
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
即可。