如何从源代码构建Debian软件包
像Ubuntu这样的基于Debian和Debian的系统使用Advanced Package Tool(简称APT)从命令行安装,更新,升级和删除软件。
通常,APT软件包管理器将存储库列表存储在名为/etc/apt/sources.list的文件中,以及任何在目录/etc/apt/sources.list.d/下带有后缀.list的文件中。
当我们安装软件包时,apt命令从这些存储库中检索给定软件包的二进制或者预编译版本。
除了安装二进制软件包,APT还可以让我们下载软件包的源代码。
因此,我们可以在源代码中添加一些功能,从源代码构建程序包,最后安装程序包的修改版本。
在本教程中,让我们看看如何在Debian,Ubuntu和其他基于APT的系统(如Linux Mint)上从源代码构建debian软件包。
为什么我们要从源代码构建软件包?
从源代码构建软件包可能有很多原因。
这是我现在可能想到的一些原因:
- 检查源代码以查找错误。
- 在不再积极开发的软件包中添加新功能。
- 从源安装软件包的最新版本。通常,官方存储库中的软件包可能有些陈旧。
- 更重要的是-学习从源代码构建Debian软件包。
安装必要的构建工具
为了从源代码构建二进制包,首先我们需要安装必要的构建工具。
根据构建二进制软件包的命令行工具,我们可能需要安装以下软件包之一:
- dpkg-dev
- devscripts
这些软件包提供了许多工具来从源代码构建二进制软件包。
要安装“ dpkg-dev”,请运行:
$sudo apt install dpkg-dev
要安装“ devscripts”软件包,命令为:
$sudo apt install devscripts
启用源存储库
确保已启用源存储库。
为此,请打开/etc/apt/sources.list文件:
$sudo vim /etc/apt/sources.list
我们将其中看到一些行,如下所示:
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://in.archive.ubuntu.com/ubuntu focal main restricted # deb-src http://in.archive.ubuntu.com/ubuntu focal main restricted [...]
在上面的文件中,所有以一个或者两个哈希(#)开头的行仅是注释,仅供参考。
并且没有哈希的行是合适的存储库。
在apt信息库中,以“ deb”开头的行是相对于二进制软件包的,用户可以使用apt软件包管理器进行安装。
并且以“ deb-src”开头的行是相对于源程序包的。
这对开发人员很有用。
默认情况下,“ deb-src”在源列表中被注释掉。
要下载源软件包,我们需要取消注释“ deb-src”行。
删除符号以取消注释行。
取消注释后,存储库行应如下所示:
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://in.archive.ubuntu.com/ubuntu focal main restricted deb-src http://in.archive.ubuntu.com/ubuntu focal main restricted [...]
保存并关闭文件。
使用以下命令更新存储库列表:
$sudo apt update
下载源码包
使用“ apt source <软件包名称>”命令下载软件包的源。
例如,以下命令将下载“ Hello World!”的源代码。
程序:
$apt source hello
输出示例:
Reading package lists... Done Need to get 734 kB of source archives. Get:1 http://in.archive.ubuntu.com/ubuntu focal/main hello 2.10-2ubuntu2 (dsc) [1847 B] Get:2 http://in.archive.ubuntu.com/ubuntu focal/main hello 2.10-2ubuntu2 (tar) [726 kB] Get:3 http://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放入包含包源的目录中。
在我们的情况下,它是hello-2.10.
$cd hello-2.10
根据需要修改代码。
代码位于“ src”目录下的文件“ hello.c”中。
$vi src/hello.c
调整代码和/或者进行任何更改。
完成代码编辑后,保存并关闭文件。
现在是构建实际的.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