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

时间:2008-09-25 01:01:40

标签: ubuntu debian packaging

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

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

最简单的方法是什么?我担心一些事情

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

10 个答案:

答案 0 :(得分:77)

你可以使用特殊包“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

答案 1 :(得分:26)

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

dpkg-buildpackage -us -uc -nc

表示不对结果进行签名而不进行清理。

  

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

获取依赖关系是一门黑色艺术。 “官方”方法是检查构建取决于是否包仅使用基本系统,“构建必需”包以及您指定的构建依赖项构建。不知道常规依赖关系的一般答案,只需涉及:)

  

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

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

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

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

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

Bernard's link很好,特别是如果你必须自己创建debian目录 - developers referencegeneral resource page也很有帮助。 Adam's link看起来也不错,但我对此并不熟悉。

答案 2 :(得分:6)

对于你想要做的事情,你可能想要使用debian源差异,所以你的软件包类似于使用的上游版本之外的官方软件包。您可以从packages.debian.org下载源差异,也可以使用“apt-get source”将其与.dsc和原始源存档一起下载。

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

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

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

来构建包
dpkg-buildpackage -rfakeroot -us -uc

答案 3 :(得分:6)

为ccache示例基于Ubuntu的构建

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/

答案 4 :(得分:3)

  • 将“debian”目录从原始包放入源目录
  • 使用“dch”更新软件包的版本
  • 使用“debuild”构建包

答案 5 :(得分:2)

我相信this是Debian软件包'圣经'。

嗯,这是Debian新维护者的指南,因此很多内容都不适用,但它们确实涵盖了其中的内容。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

Here是构建Debian软件包的教程。

基本上,您需要:

  1. 设置文件夹结构
  2. 创建控件文件
  3. (可选)创建 postinst prerm 脚本
  4. 运行dpkg-deb
  5. 我通常在Makefile中完成所有这些工作,所以我只需输入 make 来吐出二进制文件并将其打包一次。

答案 8 :(得分:1)

  

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

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

答案 9 :(得分:1)

如果您想快速而又脏的方式安装构建依赖项,请使用:

apt-get build-dep

这将安装依赖项。您需要source.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 =挤压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放置生成包的位置。

祝你好运!