在这个分步指南中,让我们看看如何在 Debian、Ubuntu 和其他基于 APT 的系统(如 Linux Mint)上从源代码构建 debian 软件包。
Debian 和基于 Debian 的系统(如 Ubuntu)使用 高级打包工具, 或者 易于 简而言之,用于从命令行安装、更新、升级和删除软件。
通常,APT 包管理器将存储库列表存储在名为 /etc/apt/sources.list
并在任何带有后缀的文件中 .list
目录下 /etc/apt/sources.list.d/
.
当我们安装一个包时, apt
命令从这些存储库中检索给定包的二进制或预编译版本。
除了安装二进制包,APT 还可以让你下载包的源代码。 因此,您可以在源代码中添加一些功能,从源代码构建包,最后安装修改后的包。
为什么我们应该从源代码构建一个包?
从源代码构建包可能有很多原因。 以下是我现在能想到的几个原因:
- 检查源代码以发现错误。
- 在不再积极开发的包中添加新功能。
- 从源代码安装最新版本的软件包。 通常,官方存储库中的软件包可能有点旧。
- 更重要的是 – 学习从源代码构建 Debian 软件包。
安装必要的构建工具
为了从源代码构建二进制包,首先我们需要安装必要的构建工具。 根据构建二进制包的命令行工具,您可能需要安装以下任一包:
- dpkg-开发
- 开发脚本
这些包提供了许多工具来从源代码构建二进制包。
安装 "dpkg-dev"
, 跑:
$ sudo apt install dpkg-dev
安装命令 "devscripts"
包是:
$ sudo apt install devscripts
启用源存储库
确保您已启用源存储库。
为此,打开 /etc/apt/sources.list
文件:
$ sudo vim /etc/apt/sources.list
您将在其中看到一些行,如下所示:
# See https://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb https://in.archive.ubuntu.com/ubuntu focal main restricted # deb-src https://in.archive.ubuntu.com/ubuntu focal main restricted [...]
在上述文件中,所有以一个或两个哈希 (#) 开头的行都只是注释,仅供参考。 没有散列的行是 合适的存储库.
在 apt 存储库中,以“deb”开头的行是相对于二进制包的,用户可以使用 apt 包管理器安装。 并且以“deb-src”开头的行是相对于源包的。 这对开发人员很有用。 默认情况下,“deb-src”在源列表中被注释掉。
要下载源包,您需要取消注释“deb-src”行。 去除那个 # 取消注释行的符号。 取消注释后,存储库行应如下所示:
# See https://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb https://in.archive.ubuntu.com/ubuntu focal main restricted
deb-src https://in.archive.ubuntu.com/ubuntu focal main restricted
[...]
Save 和 close 文件。 使用命令更新存储库列表:
$ sudo apt update
下载源码包
使用下载包的源代码 "apt source <package-name>"
命令。 为了 example,下面的命令将下载源代码 "Hello World!"
程序:
$ apt source hello
样本输出:
Reading package lists... Done Need to get 734 kB of source archives. Get:1 https://in.archive.ubuntu.com/ubuntu focal/main hello 2.10-2ubuntu2 (dsc) [1847 B] Get:2 https://in.archive.ubuntu.com/ubuntu focal/main hello 2.10-2ubuntu2 (tar) [726 kB] Get:3 https://in.archive.ubuntu.com/ubuntu focal/main hello 2.10-2ubuntu2 (diff) [6560 B] Fetched 734 kB in 2s (336 kB/s) dpkg-source: info: extracting hello in hello-2.10 dpkg-source: info: unpacking hello_2.10.orig.tar.gz dpkg-source: info: unpacking hello_2.10-2ubuntu2.debian.tar.xz
如您所见,我已经下载了 Hello World 程序的源代码。
$ ls hello-2.10 hello_2.10-2ubuntu2.debian.tar.xz hello_2.10-2ubuntu2.dsc hello_2.10.orig.tar.gz
查看源码的实际内容:
$ ls hello-2.10/ ABOUT-NLS ChangeLog INSTALL NEWS README-release aclocal.m4 configure debian lib man tests AUTHORS ChangeLog.O Makefile.am README THANKS build-aux configure.ac doc m4 po COPYING GNUmakefile Makefile.in README-dev TODO config.in contrib hello.1 maint.mk src
安装包的构建依赖项
接下来,我们还需要安装该包的依赖项。 为此,请运行:
$ sudo apt build-dep hello
我们现在已经下载了包的源代码并安装了构建这个包所需的依赖项。 接下来在源代码中进行更改。
修改一个debian包的源代码
cd 到包含包源的目录。 在我们的例子中,它是 你好-2.10.
$ cd hello-2.10
根据需要修改代码。 代码在文件中 "hello.c"
在下面 "src"
目录。
$ vi src/hello.c
调整代码和/或进行任何更改。 完成代码编辑后,保存并 close 文件。
现在是构建实际 .deb 包的时候了。
从源代码构建 Debian 软件包
我们下载了源代码并修改了代码。 让我们从源代码构建包。 我们可以通过三种方式做到这一点:
- 使用
"dpkg-buildpackage"
命令 - 使用
"debuild"
命令 - 下载源码,直接编译
方法 1 – 使用 dpkg-buildpackage:
确保您已安装 "dpkg-dev"
包裹。
然后运行以下命令从源代码构建包:
$ dpkg-buildpackage -rfakeroot -b -uc -us
这里,
dpkg-buildpackage
– 从源代码构建二进制或源代码包的命令。-rfakeroot
– 创建 fakeroot 环境以模拟 root 权限(以避免所有权和权限问题)。-b
– 仅构建二进制包。-uc
– 不要对变更日志进行加密签名。 即不要签署.buildinfo
和.changes
文件-us
– 不要签署源包。
请确保在源代码树的主目录中运行上述命令。 否则,它将无法正常工作。
如果构建成功,您将看到如下消息:
[...]
dpkg-deb: building package 'hello' in '../hello_2.10-2ubuntu2_amd64.deb'.
dpkg-deb: building package 'hello-dbgsym' in 'debian/.debhelper/scratch-space/build-hello/hello-dbgsym_2.10-2ubuntu2_amd64.deb'.
Renaming hello-dbgsym_2.10-2ubuntu2_amd64.deb to hello-dbgsym_2.10-2ubuntu2_amd64.ddeb
dpkg-genbuildinfo --build=binary
dpkg-genchanges --build=binary >../hello_2.10-2ubuntu2_amd64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
dpkg-source --after-build .
dpkg-buildpackage: info: binary-only upload (no source included)

恭喜! 我们已经成功地从源代码构建了一个 .deb 包。 现在,回到父目录,你会看到新建的 .deb 文件:
$ cd ..
$ ls
样本输出:
hello-2.10 hello_2.10-2ubuntu2.dsc hello_2.10-2ubuntu2_amd64.deb
hello-dbgsym_2.10-2ubuntu2_amd64.ddeb hello_2.10-2ubuntu2_amd64.buildinfo hello_2.10.orig.tar.gz
hello_2.10-2ubuntu2.debian.tar.xz hello_2.10-2ubuntu2_amd64.changes
方法 2 – 使用 debuild
确保您已安装 "devscripts"
包裹。
然后,通过从源代码树运行以下命令来构建二进制包:
$ debuild -b -uc -us
成功构建后,结果 .deb
包将保存在父目录中。
方法 3 – 直接下载并构建
这是比上述两种方法最简单直接的方法。 在这个方法中,我们下载包的源代码并通过 "--compile"
在下面的单个命令行中构建二进制文件的选项:
$ sudo apt-get source --compile hello
上述命令将下载源代码 "hello"
编程并构建 .deb
打包并保存在当前目录下。
安装 .deb 文件
前往所在位置 .deb
文件被保存并安装如下:
$ sudo dpkg -i hello_2.10-2ubuntu2_amd64.deb
如果您看到任何缺少依赖项的错误消息,请运行:
$ sudo apt install -f
如您所见,在 Linux 中从源代码构建 debian 软件包非常容易!
相关阅读:
- 如何使用 CheckInstall 从源代码构建包
- 如何轻松地为多个平台构建 Linux 包
- 重新创建已安装在系统上的 Debian 二进制软件包
- 如何使用 Alien 转换 Linux 软件包
- 如何将 DEB 包转换为 Arch Linux 包
希望这可以帮助。