这篇文档试图为普通 Debian 用户,和希望对 Debian 软件包有所了解的开发人员讲述如何制作 Debian 软件包。在这里,我们尽可能使用通俗的语言,并辅以大量实例来直观地展示每一个细节。正如一句古罗马谚语说得好:一例胜千言!
本文档已经针对 Debian jessie
进行了更新。[1]
Debian 的软件包系统是使它跻身顶级发行版行列的重要原因之一。尽管已经有相当数量的软件被打包成 Debian 的格式,但有时还是需要安装一些不是这一格式的软件。可能你正为如何制作自己的软件包而感到迷惑,也可能正认为这么做很难。如果你是一个刚刚接触 Debian 的初学者,那么是的,它的确很难;不过假如你真的只是一个初入此门的新手,现在大概也不会来读这篇文档了。:-) 你的确需要对 Unix 编程有所了解,但显然没必要是这方面的天才。[2]
对于 Debian 软件包维护人员来说,有一件事是非常明确的:创建并维护一个 Debian 软件包需要花费很多精力,所需的时间很可能远不只是几个小时。维护人员需要有良好的技术基础,同时也需要十分勤奋,这样才能保证我们的系统正常运行而不出现问题。
如果你在打包方面需要别人帮助,请阅读 第 1.4 节 “到何处寻求帮助”。
本文的最新版随时都可以在 http://www.debian.org/doc/maint-guide/ 上和 maint-guide
软件包里找到。文档的简体中文翻译可以在 maint-guide-zh-cn
软件包里找到。还有一点需要注意的是,这篇文档的内容相对于当前的开发情况可能会有略微的延迟。
由于这篇文档是一份手把手的教程,所以在一些重要的话题上会对每个步骤都做详细的解释。因而你可能觉得它们之中有一些与你的想法毫不相干。请准备好足够的耐心来学习。同时我也有意地省略了某些不必要的细节,以使这篇文档尽可能保持简洁。
以下是一些有关 Debian 的社会动力学报告,希望它们有助于你掌握与 Debian 项目进行互动的方法。
我们都是志愿者。
任何人都不能把事情强加给他人。
你应该主动地做自己的事情。
友好合作是我们前行的动力。
你的贡献不应致使他人过劳。
只有当别人欣赏你的贡献时,它才真正有价值。
Debian 不是一所学校,没有老师会自动地注意你。
你需要有自学大量知识的能力。
其他志愿者的注意是非常稀缺的资源。
Debian 在不断进步。
Debian 期望你制作出高质量的软件包。
你应该适时改变自己来适应变化。
在 Debian 社区中有这几类常见的角色:
Upstream author (上游作者):程序的原始作者。
Upstream maintainer (上游维护者):目前在上游维护程序代码的人。
Maintainer (软件包维护者):制作并维护该程序的 Debian 软件包的人。
Sponsor (保证人):检查内容后帮助维护者上传软件包到 Debian 官方仓库的人。
Mentor (指导者):帮助维护者熟悉和深入打包的人。
Debian Developer (DD):Debian 社区的官方成员。DD 拥有向 Debian 官方仓库上传的全部权限。
Debian Maintainer (DM):拥有对 Debian 官方仓库部分上传权限的人。
注意,你不可能在一夜之间成为 Debian Developer,因为成为 DD 所需要的远不只是技术技巧。别因此气馁,如果你的软件包对其他人有用,你可以作为软件包的 Maintainer,通过一位 Sponsor 来上传它,或者申请成为 Debian Maintainer。
还有,要成为 Debian Developer 不一定要创建新软件包。对已有软件做出贡献也是成为 Debian Developer 的理想途径。眼下正有很多软件包等着好的维护者来接手(参看 第 2.2 节 “选择你的程序”)。
在这篇文档里,我们的重点在于打包的技术细节,所以请参考以下的文档来了解 Debian 是如何运转的,以及如何才能参与到其中:
在开始之前,你需要确认你是否已经正确安装了开发所需要的附加软件包。注意这些软件包不包含任何已经被标记为
essential
或 required
—— 我们假设你已经安装了它们。
以下这些软件包已经随标准的 Debian 安装而在系统中,所以你可能不需要再动手安装它们(以及任何附加的依赖软件包)。然而,你还是应该用
aptitude show
或者
package
dpkg -s
来检查一下。
package
在你的开发环境中,需要安装的最重要的软件包是 build-essential
。一旦你 尝试安装该包,它将
拉来 其他基本构建环境所需的基本软件。
对于某些类型的软件,以上的就是所需要的全部。然而还有一组软件包虽不是对于所有软件包都必须,却可能对你有用或被你的软件包所需要:
autoconf
、automake
和 autotools-dev
- 很多新程序使用 configure 脚本和
Makefile
文件来帮助预处理程序。(参看 info
autoconf
、info automake
)。 autotools-dev
则用于保持指定的自动配置文件为最新,并带有关于使用那些文件的最佳方法的文档。
dh-make
和 debhelper
- dh-make
是用于创建我们示例软件包骨架所必须的,它会使用 debhelper
中的一些工具来创建软件包。他们不是创建软件包所必须的,但对新维护人员而言,我们 强烈推荐
使用。它使得整个过程极为简化,并易于在将来维护。(参看 dh_make(8)、debhelper(1)、/usr/share/doc/debhelper/README
)
[3]
新的 debmake
可以作为标准 dh-make
的代替品。 然而它能做的事情更多,并且拥有包含足量实例的HTML文档。
devscripts
-
此软件包提供了一些非常好非常有用的脚本帮助维护者,但他们并非构建软件包所必须。此软件包所推荐或建议的软件包都值得一看。(参看
/usr/share/doc/devscripts/README.gz
)
fakeroot
-
这个工具集使你可以在编译过程中必要的时候用普通用户模拟 root 用户环境。(参看 fakeroot(1))
file
- 这个小程序可以检测文件的类型。(参看
file(1))
gfortran
- GNU Fortran 95
编译器,如果你的程序是用 Fortran 编写的则必须此软件包完成编译。(参看 gfortran(1))
git
- 此软件包提供了用于快捷处理大型项目的著名版本控制系统 -
git。它被广泛用于各种开源项目,最著名的是 Linux 内核项目。(参见 git(1),
git Manual (/usr/share/doc/git-doc/index.html
).)
gnupg
- 使你可以使用
数字签名 签署你的软件包。这在当你想把它分发给其他人时特别重要。如果你要把你的工作加入到 Debian
发行版中,这是必须的步骤。(参看 gpg(1).)
gpc
- GNU Pascal 编译器。如果你的程序是用 Pascal
写的则需要此软件包。值得一提的是 fp-compiler
,Free
Pascal 编译器(FPC),也能够很好地胜任。(参见 gpc(1),
ppc386(1).)
lintian
- Debian
软件包检查工具,使你可以在编译软件包后知道它是否有常见的错误,并对找到的错误进行解释。 (参见 lintian(1), Lintian User's Manual.)
patch
- 这是一个非常有用的工具,它可以把
diff 程序生成的差异清单文件应用到原先的文件上,从而生成一个补丁版本。(参看 patch(1))
patchutils
- 此软件包提供了一些可以帮助处理补丁的工具,如
lsdiff、interdiff 和
filterdiff 命令。
pbuilder
- 这个软件包提供了创建和维护
chroot 环境。在此 chroot 环境中编译 Debian
软件包可以检查编译依赖是否合适并避免 FTBFS (Fails To Build From Source,从源代码编译失败)的 Bug。(参看
pbuilder(8) 和 pdebuild(1))
perl
- Perl
是现今类Unix系统中使用最普遍的解释型脚本语言,它常被称作Unix的瑞士军刀。(参看 perl(1))
python
- Python 是 Debian
系统中另一个最常用的解释型脚本语言,它拥有着可圈可点的强大功能和十分清晰的语法。(参看 python(1))
quilt
-
此软件包帮助你管理一系列的补丁。它们被以逻辑栈的方式组织在一起。你可以 apply (=push)、un-apply (=pop)
或简单地刷新它们然后再放入栈内。(参看 quilt(1), and
/usr/share/doc/quilt/quilt.pdf.gz
.)
xutils-dev
- 一些通常用于 X11
的程序,用于使用其宏功能生成 Makefile
文件。(参看 imake(1)、xmkmf(1))
以上给出的简短描述仅仅是为了使你对这些软件包有一个基本的印象。在继续前请详细阅读每个程序(包括通过依赖关系安装的程序,比如make)的文档,至少了解其一般的用途和用法。现在看来这是一项耗时巨大的任务,但在接下来的工作中你将为你阅读了它们而感觉到 非常 愉快。如果一会你遇到一些特定的问题,我会建议你重新阅读上面提到的文档。
以下是 非常重要 的文档,你应该在读本文档时同时参看它们:
debian-policy
- the Debian Policy Manual 包含了对 Debian
软件仓库、操作系统设计事宜、文件系统层级标准(FHS,Filesystem Hierarchy
Standard,讲述每个文件和目录应该放在哪里)等的描述。对于你而言,最重要的是它描述了软件包要进入官方仓库前必须满足的条件。(请参见
/usr/share/doc/debian-policy/policy.pdf.gz
和 /usr/share/doc/debian-policy/fhs/fhs-2.3.pdf.gz
的本地副本)
developers-reference
- the Debian Developer's Reference
描述了打包所需的包含技术细节在内的全部详细信息,如仓库结构、如何重命名/丢弃/接手软件包、如何进行 NMU(非维护者上传)、如何管理 Bug
以及打包最佳实践、何时向何处上传等。(参见 /usr/share/doc/developers-reference/developers-reference.pdf
的本地副本)
以下是 重要 的文档,你应该在读本文档时同时参看它们:
Autotools Tutorial 为 the GNU Build System known as the GNU Autotools 中最重要的工具 —— Autoconf、Automake、Libtool 和 gettext 提供了很好的文档。
gnu-standards
- 此软件包包含了 GNU
项目中的两篇文档: GNU Coding Standards 和 Information for Maintainers of GNU
Software。尽管 Debian 不要求遵守这些规范,它们作为纲领和共识仍然很有帮助。(参见
/usr/share/doc/gnu-standards/standards.pdf.gz
和
/usr/share/doc/gnu-standards/maintain.pdf.gz
的本地副本)
若本文档所叙述的内容与 Debian Policy Manual 或 Debian Developer's Reference
有不符,则按照后两者的要求进行,并向 maint-guide
软件包提交
Bug 报告。
以下是替代性的教程文档,你应该在读本文档时同时参看它们:
在你决定到公共场合提问之前,请先阅读这些(个)不错的文档:
所有相关软件包的
/usr/share/doc/
目录之中的文件
package
所有相关命令的 man
手册页
command
所有相关命令的 info
info页
command
你可以在搜索引擎中搜索时使用类似这样的字符串 :site:lists.debian.org
来限制域名以提高效率。
制作小的测试软件包是学习打包的好方法,仔细查看维护较好的软件包则是了解他人如何制作软件包的最佳办法。
如果你仍然对打包存有疑问,并且在文档和WEB资源中都不能找到答案,你可以交互式地向他们提问:
http://lists.debian.org/debian-mentors/邮件 debian-mentors@lists.debian.org . (该邮件列表是新手专区。)
debian-devel@lists.debian.org . (该邮件列表汇集各路神通。)
IRC 比如 #debian-mentors
。
专注于某个软件包集合的团队。 (完整列表参见 https://wiki.debian.org/Teams)
特定语言的邮件列表,比如 debian-devel-{french,italian,portuguese,spanish}@lists.debian.org 或 debian-devel@debian.or.jp. (完整列表参见 https://lists.debian.org/devel.html 和 https://lists.debian.org/users.html)
如果你付出了一定的努力并且提问得当,那么有经验的 Debian 开发者会很乐意帮助你。
当你收到一个 Bug 报告后(没错,真正的 Bug 报告!),你需要研究 Debian Bug Tracking System (Debian Bug 跟踪系统,BTS)并阅读相关的文档以便高效处理这些报告。我推荐阅读 Developer's Reference, 5.8. "Handling bugs"
即使以上的问题都解决了,也不能高兴得太早。为什么?因为几个小时或几天内就会有人开始使用你的软件包,如果你犯了某些严重的错误,将被无数生气的 Debian 用户的邮件所轰炸…… 只是开个玩笑。:-)
放松一点并准备好处理 Bug 报告,在你的软件包完全符合 Debian 的各项规范前还需要付出很多努力,处理 Bug 也是对你很好的锻炼(再一次提醒,阅读那些 必须的文档 来了解详情)。祝你好运!
[1] 在写这份文档时,我们默认你使用 squeeze
操作系统。如果你需要在
lenny
系统上使用本文所记述的方法,则必须安装 backports 仓库中的 dpkg
和 debhelper
软件包。
[2] 在 Debian Reference 中,你可以了解到使用 Debian 系统的一些基本信息和关于 Unix 编程的一些指引。
[3] 还有几个类似但更针对某一类软件的软件包,如 dh-make-perl
、dh-make-php
等。