如何从源代码构建Debian / Ubuntu软件包?
我有一个程序源(取自cvs / svn / git / ...),我想为其构建Debian / Ubuntu软件包。该软件包位于存储库中,但是:
- 它是一个较旧的版本(缺少我需要的功能)
- 我需要的编译选项与默认选项略有不同。
最简单的方法是什么?我担心两件事
- 如何检查是否正确列出了所有依赖项? (通过查看旧版本所依赖的内容可以得到一些提示,但是可能已经添加了新的依赖项。)
- 如何防止更新系统在更新的回购中安装旧版本?
- 如何防止系统安装新版本(发布时),覆盖我的自定义软件包?
解决方案
我相信这是Debian软件包的"圣经"。
好吧,这是Debian新的维护者指南,因此其中许多内容将不适用,但它们确实涵盖了发展的方向。
这是构建Debian软件包的教程。
基本上,我们需要:
- 设置文件夹结构
- 创建一个控制文件
- (可选)创建postinst或者prerm脚本
- 运行dpkg-deb
我通常在Makefile中完成所有这些操作,因此我只需键入make即可吐出二进制文件并将其打包。
首先,标题问题:
假设debian目录已经存在,请位于源目录(包含debian目录的目录)中,并调用dpkg-buildpackage。我喜欢使用以下选项来运行它:
dpkg-buildpackage -us -uc -nc
这意味着不要在结果上签名也不要清理。
How can I check if I have listed all the dependencies correctly?
获得依赖关系是一门妖术。 "正式"方式是检查构建依赖关系的方式,即软件包是否仅使用基本系统," build-essential"软件包以及我们指定的构建依赖项进行构建。不知道常规依赖关系的一般答案,只需要涉足:)
How I can I prevent the update system installing the older version in the repo on an update? How I can prevent the system installing a newer version (when its out), overwriting my custom package?
我的知识可能不合时宜,但要解决这两个问题:
使用dpkg --set-selections。假设nullidentd是我们要保留的软件包,请以root身份运行
echo 'nullidentd hold' | dpkg --set-selections
或者,由于我们是从源代码构建的,因此可以使用一个时期来人为地将版本号设置为高,而不会再次受到困扰。要使用纪元,请在debian / changelog文件中添加一个新条目,并在版本号之前添加一个99:。给出我的nullidentd示例,更新的变更日志的第一行将显示为:
nullidentd (99:1.0-4) unstable; urgency=low
Bernard的链接很好,特别是如果我们必须自己创建debian目录时,对开发人员参考和常规资源页面也很有帮助。亚当的链接看起来也不错,但我并不熟悉。
对于我们想做的事情,我们可能要使用debian的diff,因此除了使用的上游版本外,软件包与官方软件包相似。我们可以从packages.debian.org下载源差异文件,也可以使用" apt-get source"将其与.dsc和原始源文件存档一起获得。
然后解压缩上游源的新版本,切换到该目录,并通过执行以下操作应用我们下载的差异
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"更新软件包的版本
- 使用" debuild"来构建包

