117

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

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

最简单的方法是什么?我担心几件事

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

10 回答 10

79

您可以对所有尚未在 debian/ubuntu 中的软件包使用特殊软件包“checkinstall”。

您可以使用 "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
于 2008-11-21T14:40:08.907 回答
27

首先,标题问题:假设debian目录已经存在,在源目录(包含debian目录的目录)并调用dpkg-buildpackage。我喜欢使用以下选项运行它:

dpkg-buildpackage -us -uc -nc

这意味着不要签署结果并且不要清理。

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

获取依赖项是一门黑色艺术。“官方”的方式是检查构建依赖是否仅使用基本系统、“构建基本”包和您指定的构建依赖项构建。不知道常规依赖项的一般答案,只是涉足:)

如何防止更新系统在更新时在 repo 中安装旧版本?如何防止系统安装更新版本(当它出来时)覆盖我的自定义包?

我的知识可能已经过时了,但要解决这两个问题:使用 dpkg --set-selections。假设 nullidentd 是您想要保留的包,以 root 身份运行

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

或者,由于您是从源代码构建的,因此您可以使用epoch将版本号人为地设置为高,并且再也不会被打扰。要使用 epoch,请在 debian/changelog 文件中添加一个新条目,并在版本号前面放置一个 99:。鉴于我的 nullidentd 示例,您更新的变更日志的第一行将显示为:

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

Bernard 的链接很好,特别是如果您必须自己创建 debian 目录 -开发人员参考一般资源页面也很有帮助。 亚当的链接看起来也不错,但我不熟悉。

于 2008-09-25T02:00:51.597 回答
7

基于 Ubuntu 的ccache构建示例:

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

更多细节:http ://blog.aplikacja.info/2011/11/building-packages-from-sources-in-debianubuntu/

于 2012-09-18T21:16:43.690 回答
6

对于您想要做的事情,您可能想要使用 debian 源 diff,因此您的包与使用的上游版本之外的官方包相似。您可以从packages.debian.org下载源 diff ,或者可以使用“apt-get source”将其与 .dsc 和原始源存档一起获取。

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

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

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

dpkg-buildpackage -rfakeroot -us -uc
于 2008-09-25T15:00:57.510 回答
3
  • put "debian" directory from original package to your source directory
  • use "dch" to update version of package
  • use "debuild" to build the package
于 2009-07-29T03:55:38.410 回答
3

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

嗯,这是 Debian 新维护者指南,所以很多内容都不适用,但它们确实涵盖了哪些内容。

于 2008-09-25T01:06:32.913 回答
2

如果您使用的是 Ubuntu,请查看 pkgcreator 项目: http ://code.google.com/p/pkgcreator

于 2011-03-06T00:10:09.990 回答
1

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

apt-get build-dep

这将安装依赖项。为此,您需要 sources.list 中的源代码行:

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=squeeze 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 将生成的包放在哪里。

祝你好运!

于 2012-03-08T16:01:31.077 回答
1

是构建 Debian 软件包的教程。

基本上,您需要:

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

我通常在我的 Makefile 中完成所有这些操作,因此我只需键入make即可吐出二进制文件并将其打包。

于 2008-09-25T01:27:07.153 回答
1

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

通过pbuilder在 chroot 环境中设置干净的基础系统,它是检查构建依赖关系和依赖关系的优秀工具。通过在 pbuilder 中编译包,您可以轻松检查构建依赖关系,并通过在 pbuilder 环境中对其进行测试,您可以检查依赖关系。

于 2011-11-03T14:29:11.303 回答