本文档默认您使用 squeeze
为操作系统。如果你需要在 lenny
系统上使用本文档记述的方法,则至少必须安装 backports 的
dpkg
和 debhelper
软件包。
还有几个类似但更针对某一类软件的软件包,如
dh-make-perl
、dh-make-php
等。
当然,也一定总是有值得打包的新软件。
当文件扩展名不足以判断文件类型时,可以使用
file
命令来判断。
需要注意的是,这个程序已经被打包好了,并且从写这篇文档之初到现在它已经发生了很大的变化。
参看 Autotools
Tutorial
和
/usr/share/doc/autotools-dev/README.Debian.gz
。
Version 字符串可以用 dpkg --compare-versions ver1
op ver2 命令比较。参看 dpkg(1)
man 手册页。
以下默认以 Bash 作为登陆 shell。如果你使用其他的
shell,例如 Z shell,使用它们的配置文件代替这里提到的
~/.bashrc
。
如果上游源代码提供 debian
目录和内容,运行
dh_make
命令是要加上 --addmissing
参数。新的 3.0 (quilt)
源代码格式十分强健,在这种情况下不会出现问题。你可能需要为你的
Debian 软件包更新上游提供的 debian
目录内容。
这里有几个候选项:s 为单个二进制包(Signle
binary)、i
为平台独立软件包(Arch-Independent)、m
为多个二进制包(Multiple binary)、l
为库(Library)、k 为内核模块(Kernel
module)、n 为内核补丁(Kernel patch)、b
为使用 cdbs
。本文档重点介绍使用通过 dh
命令使用 debhelper
打包。本文档侧重于单个二进制包,也涉及平台独立和多二进制包类型的软件包。cdbs
软件包提供了类似 dh
的其他打包脚本框架,它并不在本文档的介绍范围内。
你可以通过 quilt --quiltrc /dev/null ... 来运行
quilt
来禁用此配置文件。
debian/patches
应当在你按照前面所述的步骤运行
dh_make
时生成的。这个例子中我们新创建它,因为假设的是在更新一个已存在的软件包。
对于多个二进制包,dh_auto_install
将临时目录设置为debian/tmp
,而 dh_install
命令则将文件按照 debian/package-1.install
和
debian/package-2.install
等文件的描述将
debian/tmp
中的文件分别装入
debian/package-1
和
debian/package-2
等临时目录以创建
*.deb
软件包。
这只是一个 Makefile
的例子。如果 Makefile
是通过 ./configure
命令生成的,修复该类的
Makefile
的方法是通过 dh_auto_configure
执行
./configure
,并带上如 --prefix=/usr
的默认选项。
作者已经意识到这不是一个最好的例子,因为我们的
libncurses
软件包现在提供了一个
libcurses.so
的符号链接,但作者还没有想出更好的例子。非常欢迎提出建议
:-)
这种奇怪的情况是 Debian Policy
Manual, Footnotes 48
中详细描述的一种特性。这不是由于在 debian/rules
中使用 dh
命令所致的,真正的原因是
dpkg-buildpackage
如何运行。相同的情形也适用于
Ubuntu
的自动编译系统
。
有些人使用无效的发行版名称,如 UNRELEASED 以防止某些软件包在共享的 VCS 中修改时被意外上传。
此 target 被 dpkg-buildpackage 用于 完整的(重)构建, 第 6.1 节 描述的过程中。
此 target 被 dpkg-buildpackage -B" 用于自动编译系统, 第 6.2 节 描述的过程中。
此 target 被 dpkg-buildpackage -A 使用。
这使用了新的 debhelper
V7 特性。它的设计理念在
Not Your
Grandpa's Debhelper
中有详细解释。这个幻灯片被
debhelper
上游作者于 DebConf9 时展示。在
lenny 中,dh_make
会创建一个复杂很多的
rules
文件,其中带有一系列 dh_*
脚本命令来完成所需要的各个 target。这个新的 dh
命令更加简单灵活。你仍然可以通过 override_dh_*
target 来对任意 target 进行定义。参看 定制 rules
文件, 第 4.4.3
节。它仅是基于 debhelper
软件包而不像
cdbs
那样使编译过程模糊不清。
你可以通过 dh --no-act target 或
debian/rules -- '--no-act target'
来模拟编译过程并查看实际要执行的 dh_*
程序。
此处默认 python-support
软件包已经安装在系统中。
对于所有的 dh_*
脚本实际做的工作以及它们可以使用的选项,请阅读它们的
man 手册页和 debhelper
文档。
这些命令支持其他例如 setup.py
的编译环境,可以通过在软件包源代码目录执行
dh_auto_build --list 列出。
实际上是依次考虑 distclean、realclean 或 clean 之一并执行。
实际上是依次考虑 test 或 check 并执行。
如果一个软件包安装了
/usr/share/perl5/Debian/Debhelper/Sequence/custom_name.pm
文件,你应当使用 dh --with custom-name $@
命令激活其功能。
在 dh_pysupport
和 dh_pycentral
命令之间更推荐使用前者,不要使用 dh_python
命令。
在 lenny 下,如果你希望更改某个 dh_*
脚本的行为,你需要在 rules
中找到相应的行然后进行调整。
gentoo
软件包使用 GNU 编译系统,又称
Autotools。参看 http://en.wikipedia.org/wiki/GNU_build_system
没有参数的 dh_auto_build
命令将执行 Makefile
中的第一个 target。
debian/changelog
和 debian/NEWS
总是会被自动安装。程序会不分大小写地搜索以下文件名来检测上游
changelog:changelog
、changes
、changelog.txt
和changes.txt
。
这取代了已经废弃的 dh_movefiles(1)
命令,它本是用
files
文件所配置的。
如果命令没有 info
信息页但在
/usr/share/package
目录中有其他文档,你应该手工编辑 help2man
命令所创建的 man 手册页。
squeeze 的列表和以前的有了较大的调整。
尽管我使用了 Bash 短表达式在此处指出这些文件是
{post|pre}{inst|rm}
,但仍然建议你在这些 maintainer
scripts 中尽可能地使用纯粹的 POSIX (非
Bash)脚本来提供最佳的兼容性。
参看 DebSrc3.0
了解转换到新的 3.0 (quilt) 和 3.0 (native)
源代码格式时的总结考虑。
实际上新格式还支持多个上游 tarball 和更多的压缩方法,但这已超出本文档讲述的范围。
有多种不同的补丁维护方式被用于 Debian 软件包中,而
quilt
系统则是其中的首选。其他系统还包括
dpatch
、dbs
、cdbs
等。这些中的很多也将补丁保存于 debian/patches/*
文件中。
如果你需要一个 sponsor 上传你的软件包,这种情况下,清晰的软件包分解和对你做出的更改的描述对于软件包的审查都非常重要。
你可以使用 --skip-patches
选项来在正常的是否操作后避免应用 3.0 (quilt)
源代码包格式中的 quilt
补丁。你也可以在正常解压后使用 quilt pop -a
恢复这些补丁对源码的修改。
实际的自动编译系统涉及到比这篇文档所叙述的复杂许多的预设,这些细节已经超出了本文档的范围。
和在 pbuilder
中不同,自动编译系统使用的
sbuild
所维护的 chroot
不强制要求最小化的编译系统,并可能保持很多软件包始终安装在其中。
pbuilder
软件包仍然在改进中,你可以查看最新的官方文档来检查实际的配置状况。
此处默认
HOOKDIR="/var/cache/pbuilder/hooks"。你可以在
/usr/share/doc/pbuilder/examples
目录中找到很多钩子脚本的例子。
升级你的 stable 软件包有规定限制。
对于资深打包人员,有以下几个可用的资源:
位于 /usr/share/doc/git-buildpackage/manual-html/gbp.html
的
Building Debian Packages with git-buildpackage
常规情形下被配置好的环境变量在此时不会被自动设置。永远不要将使用这个 快速 方法构建的软件包上传到任何地方。
如果你按照 debuild
命令, 第 6.4 节 中的叙述定义了 /etc/devscripts.conf
或 ~/.devscripts
文件,就不需要再添加
lintian
选项 -i -I --show-overrides。
dput
软件包提供了更多的特性,相比于
dupload
也越来越受欢迎。它使用 /etc/dput
文件作为全局配置文件、~/.dput.cf
作为用户配置文件。它也直接支持 Ubuntu 相关的服务。
参看 ftp://ftp.upload.debian.org/pub/UploadQueue/README
。另外你也可以使用来自
dput
的 dcut
命令。
要获得需要的日期格式,使用 LANG=C date -R。
如果软件包 foo
是使用旧的 1.0
格式的,可以在新解压的源代码目录里运行 zcat
/path/to/foo_oldversion.diff.gz|patch
-p1 来完成。
如果 uscan
命令下载并更新了源代码,但没有运行
uupdate
命令,你应该修正 debian/watch
文件,使 URL 末尾后带有 debian uupdate。
如果你的 sponsor 或其他维护者一定反对更新已有的打包风格,则不值得去为此烦恼或争论,总是有更重要的事要做。
在 cdbs
(0.4.74)软件包中有一些对于 dh_make
创建的非 cdbs
的 rules
文件的消极描述。不要担心它们,它们仅是针对于
lenny 中需要列出大串的 dh_*
命令而言的。
你可能使用 splitdiff
命令将 big.diff
分割为多个有各自作用的补丁。
Debian 新维护人员手册
版本 1.2.25, 2010-12-21 14:06:56 UTCjoy-mg@debian.org
happyaron.xu@gmail.com
lilingv@gmail.com
ycheng@slat.org