[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 下一页 ]


Debian 新维护人员手册
第 2 章 - 第一步


让我们尝试创建一个自己的软件包(“收养”一个已存在的软件包则更好)。


2.1 选择你的程序

可能你已经选好了要制作的软件包。第一件要做的事是使用 aptitude 检查它是否已经存在于发行版仓库中了。

你还可以通过 软件包搜索页面Debian Package Tracking System (Debian 软件包跟踪系统,PTS)查询软件包信息。

如果软件包已经存在,直接安装就好了!:-) 如果它是被 抛弃(orphaned) 的——也就是说它的维护者被设置为 Debian QA Group,那么你可以尝试接手维护它(在 Debian Bug report logs: Bugs in package wnpp in unstable 检查它的维护者信息)。你也可以“收养”维护者发出“Request for Adoption”(RFA)请求的软件包。

有几种查看 RFA 软件包的方法:

仅作为一笔旁注,Debian 已经拥有了绝大多数类型软件的软件包,仓库中软件包的数量也远远超过了有上传权限的贡献者的数量。因此,为已经在仓库中的软件包贡献力量是非常受其他开发者欢迎的(且更容易获得 sponsorship)[3]。你可以通过非常多的方式来实现这一目的。

如果你有能力“收养”那个软件包,下载(使用 apt-get source packagename 或其他类似的工具)并分析它的代码。这篇文档没有包含如何接手软件包的详细信息,但幸运的是因为接手软件包时起始的工作已经有人完成,接手的工作应比从头开始轻松得多。尽管如此,请继续阅读,下面给出的建议会对你很有帮助。

如果你要制作的软件包是全新的,并且希望它出现在 Debian 中,请按照以下的步骤进行:

当然,这些问题都只是为了安全,并试图让你不至于在比如 setuid 守护进程等问题上犯错误而激怒了用户... 当你在打包方面有了更多经验时,就可以处理这些软件包了。但即便是富有经验的开发人员在遇到疑惑时也会发邮件到 debian-mentors@lists.debian.org 邮件列表咨询,那里的人会很乐意提供帮助。

关于这些问题的更多帮助,查看 Debian Developer's Reference


2.2 获得程序,并且试用它

第一件要做的事就是找到并下载原始的源代码。我假定你已经从作者的主页上找到了它的源代码。Unix 下的自由软件源代码通常是以 tar+gzip 格式(扩展名为 .tar.gz)或 tar+bzip2 格式(扩展名为 .tar.bz2)的形式提供的。通常归档文件中包含了一个名为 programname-version 的子目录,里面包含了全部的源代码。

如果源代码的最新版需要通过诸如 Git、Subversion 或 CVS 这类 VCS (Version Control System,版本控制系统)仓库获得,那么你需要使用“git clone”“cvs co”或“svn co”等命令获得代码后,再使用 tar 程序的 --exclude-vcs 选项将其重新打包为 tar+gzip 格式。

如果你的程序源代码是以其他形式提供的(比如文件名以 .Z.zip 结尾[4]),则使用合适的工具将其解包,再重新打包。

作为示例,我将使用一个名为 gentoo 的程序,它是一个 X GTK+ 文件管理器。[5]

在你的用户主目录下创建一个子目录,命名为 debiandeb 或任意你觉得合适的其他名字(本例中使用 ~/gentoo)。把下载好的归档文件放在其中并解包(使用 tar xzf gentoo-0.9.12.tar.gz 命令)。要确定解包过程中没有发生错误,即便是有一点 不恰当 也不行,因为在别人的系统上解包这些文件时,如果他们的工具并不忽略这些反常的现象就会出现问题。在你的终端屏幕上,应该看到如下的情形。

     $ mkdir ~/gentoo ; cd ~/gentoo
     $ wget http://www.example.org/gentoo-0.9.12.tar.gz
     $ tar xvzf gentoo-0.9.12.tar.gz
     $ ls -F
     gentoo-0.9.12/
     gentoo-0.9.12.tar.gz

现在又有了一个新的子目录,名为 gentoo-0.9.12。进入该目录并 彻底 读完其中的文档。通常情况下这些文档被命名为 README*INSTALL**.lsm*.html。你必须找到关于如何正确编译和安装程序的指导(最可能的是他们会默认你希望把程序安装到 /usr/local/bin 目录,但事实上你不能那样做,详细的内容稍后将在 把文件安装到目的位置, 第 3.3 节 中说明)。

带有 Makefile 文件的简单程序可以很容易地使用 make 来编译。其中的一些还支持 make check,可以完成一系列自检。编译好后可以使用 make install 来将程序安装到目标目录。

现在尝试编译和运行你的程序,确保它工作正常,且在安装和运行时不会导致其他问题。

你还可以运行 make clean (或更好的 make distclean)来清理编译目录。有时还会带有 make uninstall 用以卸载已经安装了的文件。


2.3 自由的可移植程序

非常多的自由软件是使用 CC++ 语言编写的。其中的有很多使用 Autotools 或 CMake 来使其可以在不同平台上移植。这些工具被用于生成 Makefile 和其他必须的源文件,然后这些程序可以使用正常的 make; make install 来编译和安装。

Autotools 是 GNU 编译系统工具,包括 AutoconfAutomakeLibtoolgettext。你可以通过 configure.acMakefile.amMakefile.in 等文件来识别这种类型的源代码。[6]

使用 Autotools 的第一步是上游作者在代码中运行 autoreconf -i -f 并把生成的文件同源代码一起分发。

     configure.ac-----+-> autoreconf -+-> configure
     Makefile.am -----+        |      +-> Makefile.in
     src/Makefile.am -+        |      +-> src/Makefile.in
                               |      +-> config.h.in
                           automake
                           aclocal
                           aclocal.m4
                           autoheader

编辑 configure.acMakefile.am 等文件需要一些关于 autoconfautomake 的知识。参看 info autoconfinfo automake

使用 Autotools 的流程第二部是用户获得分发的源代码后在源代码中运行 ./configure && make 并将其编译成为 binary (二进制程序)。

     Makefile.in -----+                +-> Makefile -----+-> make -> binary
     src/Makefile.in -+-> ./configure -+-> src/Makefile -+
     config.h.in -----+                +-> config.h -----+
                               |
                config.status -+
                config.guess --+

你可以通过命令选项来改变 Makefile 文件中的很多设置,比如默认的文件安装位置(使用 ./configure --prefix=/usr)。

尽管不是必须的,还可以使用 autoreconf -i -f 更新 configure 和其他相关文件,这样做可能提高源代码的兼容性。

CMake 是另一个可选的编译系统,可以通过 CMakeLists.txt 文件来识别它。


2.4 软件包名称和版本

开始打包时源代码目录应当是绝对干净(原始)的,或者直接使用刚刚解包得到的源代码。

为了让软件包可以正确地编译和构建,如果程序原有的名字不是完全小写的则必须将其改成小写,并且应当把源代码以 packagename-version 的形式命名。

如果程序的名称超过一个单词,把它改成一个单词或缩写成合适的形式。例如,程序“John's little editor for X”可以命名为 johnledxjle4x,或者随便你认为合适的其他名字。它需要符合一定的限制,比如长度不要超过 20 和字符。

还要检查程序的版本号,它将被包含到软件包版本内。如果手中的软件版本号不是 X.Y.Z 的形式,而是使用日期等形式。那么可以继续使用日期来作为版本号,只要新版本程序的版本号能变得比老板本大即可。最好能与上游使用相同的版本号,如果上游使用了诸如 09Oct23 的格式,那么最好将其转换为 YYYYMMDD 的格式,此例中为 20091023,以便保证 dpkg 程序在更新软件时能正确处理新旧版本。[7]

还有一些程序根本就没有版本号,这是你应该联系上游维护者,看他们是否使用了其他的版本跟踪方法。


2.5 初始化 Debian 软件包

首先我们设置两个 环境变量,$DEBEMAIL$DEBFULLNAME,使多数 Debian 维护工具能够正确识别你用于维护软件包的姓名和电子邮件地址。[8]

     $ cat >>~/.bashrc <<EOF
     DEBEMAIL=your.email.address@example.org
     DEBFULLNAME="Firstname Lastname"
     export DEBEMAIL DEBFULLNAME
     EOF

让我们按照以下方法使用 dh_make 来初始化 Debian 软件包。

     $ . ~/.bashrc
     $ cd ~/gentoo/gentoo-0.9.12
     $ dh_make -f ../gentoo-0.9.12.tar.gz

当然,使用你的原始源代码归档文件名替代示例中的文件名。[9]参看 dh_make(1) 以获得详细信息。

此时会出现一些提示信息。它会询问你要创建那种类型的软件包。Gentoo 是单个的二进制软件包——编译后仅生成一个二进制文件,也因此只需要一个 .deb 文件——所以我们使用 s 键选择第一个选项,检查屏幕上显示的信息,无误后按 ENTER 确认。[10]

执行 dh_make 后,上一级目录中自动创建了一份上游 tarball 的副本,名为 gentoo_0.9.12.orig.tar.gz,这个文件和稍后介绍的 debian.tar.gz 在一起满足了 Debian 非本地源代码包的要求。

     $ cd ~/gentoo ; ls -F
     gentoo-0.9.12/
     gentoo-0.9.12.tar.gz
     gentoo_0.9.12.orig.tar.gz

请注意 gentoo_0.9.12.orig.tar.gz 这个文件名的两个关键特点:

你应该可以注意到 debian 目录下有了许多模板文件。这些文件将在 debian 目录中的必须内容, 第 4 章debian 目录下的其他文件, 第 5 章 一一解释。你还应该明白,打包不是一个自动的过程,你还需要按照 修改源代码, 第 3 章 中的方法来修改软件包。此后,你还要按照 构建软件包, 第 6 章 中叙述的合适的方法来编译 Debian 软件包、按照 检查软件包中的错误, 第 7 章 中的方法检查其中错误,最终依照 上传软件包, 第 8 章 的介绍将其上传。我将对所有的这些步骤进行解释。

再次强调,作为一个新维护人员,不推荐创建复杂的软件包,例如:

它们并非特别难于掌握,但确实需要更多的知识,所以我们不在这里对所有情况进行描述。

如果你在修改过程中不小心删除或弄坏了某些模板文件,你可以使用 dh_make 加上 --addmissing 参数来将其还原。

更新一个已存在的软件包可能比较复杂,因为它可能使用旧的技术。请继续在这里学习最新的打包技术以便掌握必要的基本功。我们会在稍后的 更新软件包, 第 9 章 中回头讲解如何处理这种情况。


[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 下一页 ]


Debian 新维护人员手册

版本 1.2.25, 2010-12-21 14:06:56 UTC

Josip Rodin joy-mg@debian.org

翻译:Aron Xu happyaron.xu@gmail.com
翻译:李凌 lilingv@gmail.com
翻译:郑原真 ycheng@slat.org