如何从源代码构建Debian软件包

时间:2020-03-21 11:48:57  来源:igfitidea点击:

像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