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

我有一个程序的源代码(取自 cvs/svn/git/...) ,我想为它构建一个 Debian/Ubuntu 包。软件包存在于存储库中,但是:

  • 这是一个旧版本(缺少我需要的特性)
  • 我需要与默认选项稍有不同的编译选项。

做这件事最简单的方法是什么? 我关心一些事情

  • 如何检查是否正确列出了所有的依赖项?(我可以通过查看旧版本所依赖的内容来获得一些提示,但是可能已经添加了新的依赖项。)
  • 我如何防止更新系统安装旧版本的回购更新?
  • 如何防止系统安装更新的版本(当它出来时) ,覆盖我的自定义软件包?
108641 次浏览

我相信 这个是 Debian 软件包的“圣经”。

这是 Debian 的新维护人员指南,所以大部分内容都不适用,但它们确实涵盖了什么东西该放在哪里。

这里 是一个构建 Debian 软件包的教程。

基本上,你需要:

  1. 设置文件夹结构
  2. 创建 控制文件
  3. 可选地创建 postinstPrem脚本
  4. 运行 dpkg-deb

我通常在 Makefile 中完成所有这些操作,所以我只需键入 制造来输出二进制文件并一次性将其打包。

首先,题目问题: Assuming the debian directory is already there, be in the source directory (the directory containing the debian directory) and invoke dpkg-buildpackage. I like to run it with these options:

dpkg-buildpackage -us -uc -nc

也就是说不签结果,不清理。

如何检查是否正确列出了所有的依赖项?

获取依赖关系是一门黑魔法。检查构建依赖关系的“正式”方法是,检查包是否只使用基本系统、“构建基本”包和指定的构建依赖关系进行构建。不知道常规依赖关系的一般答案,只是涉足:)

我如何防止更新系统安装旧版本的回购更新? 如何防止系统安装更新的版本(当它出来时) ,覆盖我的自定义软件包?

在这一点上,我的知识可能已经过时了,但要同时解决这两个问题: 假设 nullidentd 是您希望保留的包,那么以 root 用户身份运行

echo 'nullidentd hold' | dpkg --set-selections

或者,由于您是从源代码构建的,因此可以使用 新纪元人为地将版本号设置得很高,从而不会再受到干扰。要使用一个时代,在 debian/changelog 文件中添加一个新条目,并在版本号前面加上一个99: 。根据我的 nullidentd 示例,更新后的变更日志的第一行应该是:

nullidentd (99:1.0-4) unstable; urgency=low

Bernard 的 link 很好,特别是如果您必须自己创建 debian 目录的话—— developers referencegeneral resource page也很有帮助。亚当的链接看起来也不错,但我不太熟悉。

对于您想要做的事情,您可能希望使用 debian 源代码 diff,所以您的软件包除了使用的上游版本之外,与官方版本相似。可以从 Packages.debian.org下载源 diff,也可以使用。通过使用“ apt-get source”来实现 dsc 和原始源文件。

然后,解压新版本的上游源代码,切换到该目录,并应用您通过以下操作下载的 diff

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

然后进行您想要编译选项的更改,并通过以下方法构建包

dpkg-buildpackage -rfakeroot -us -uc

你可以使用特殊的软件包“ checkinstall”来安装所有还没有进入 debian/ubuntu 的软件包。

你可以使用“ uupdate”(apt-get install devscripts)从源代码构建一个包,包含现有的 debian 源代码:

例如 libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc
  • 把“ debian”目录从原来的包到你的源目录
  • 使用「 Dch」更新软件包的版本
  • use "debuild" to build the package

如果你正在使用 Ubuntu,查看 pkgcreate 项目: Http://code.google.com/p/pkgcreator

How can I check if I have listed all the dependencies correctly?

通过在 chroot 环境中设置一个干净的基础系统,pbuilder是一个检查构建依赖项和依赖项的优秀工具。通过在 pBuilder 中编译包,您可以轻松地检查构建依赖项,并且通过在 pBuilder 环境中测试它,您可以检查依赖项。

如果您想要一种快速而简单的方法来安装构建依赖项,请使用:

apt-get build-dep

这将安装依赖项。您需要在 sources.list 中的 source 行来完成以下操作:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

如果您正在将软件包从测试向后移植到稳定,请注意依赖关系可能已经更改。Apt-get build-deb 命令为当前存储库中的源包安装依赖项。

但是当然,dpkg-buildpackage-us-uc 将显示任何卸载的依赖项。

如果希望更频繁地编译,请使用 CowBuilder。

apt-get install cowbuilder

然后创建一个构建区域:

Sudo DIST = 捏 ARCH = amd64 CowBuilder —— create

然后编译一个源代码包:

apt-get source cowsay


# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

注意 CowBuilder 将生成的包放在何处。

祝你好运!

Ccache 的 基于 Ubuntu 的构建示例:

sudo apt-get update
sudo apt-get build-dep ccache
apt-get -b source ccache
sudo dpkg -i ccache*.deb

More details: http://blog.aplikacja.info/2011/11/building-packages-from-sources-in-debianubuntu/