+ -
当前位置:首页 → 问答吧 → 怎么做deb包?

怎么做deb包?

时间:2003-01-15

来源:互联网

不要说dh_make &&dpkg-buildpackage,傻子都会,想要完整一点的说明。

我知道有maint-guide,可是英文的,看不来,要不有谁英文好的翻译翻译?
apt-get install maint-guide


呵呵,谁让念书的时候不好好学来着。

作者: achaoge   发布时间: 2003-01-15

http://www.study-area.org/tips/opent...ols/x1425.html
http://www.kclee.com/clemens/unix/Ho...anPackage.html

作者: eTony   发布时间: 2003-01-17

Debian还真的是不错啊。

作者: achaoge   发布时间: 2003-01-17

引用:
最初由 achaoge 发布
不要说dh_make &&dpkg-buildpackage,傻子都会,想要完整一点的说明。

我知道有maint-guide,可是英文的,看不来,要不有谁英文好的翻译翻译?
apt-get install maint-guide


呵呵,谁让念书的时候不好好学来着。
我也很想学习,后来听你说了maint-guide,下来看了一下,还不错。然后试着翻了一些,不过现在没时间再翻了,先把它贴上来,斑竹和兄弟们要是有空的话可以把它继续翻完。翻的比较烂,还望斑竹和兄弟们好好改一下,希望下次能看到个完整的

原文Debian网站上有,这里也可以看到:
http://debian.linuxforum.net/doc/man....html#contents

作者: nilarcs   发布时间: 2003-01-17

Debian New Maintainers' Guide
-----------------------------

Josip Rodin <[email protected]>

version 1.2, 6 April 2002.


-------------------------------------------------------------------------------


Copyright Notice
----------------

Copyright (C) 1998-2002 Josip Rodin.

This document may be used under the terms the GNU General Public
License version 2 or higher.

This document was made using with these two documents as examples:

Making a Debian Package (AKA the Debmake Manual), copyright (C) 1997
Jaldhar Vyas.

The New-Maintainer's Debian Packaging Howto, copyright (C) 1997 Will
Lowe.


-------------------------------------------------------------------------------


目录
--------

1. 起步
1.1. 你需要的程序
1.2. 附加信息

2. 第一步
2.1. 选择你的程序
2.2. 获取程序,进行试验
2.3. 包的名称和版本
2.4. Initial "debianization"

3. 修改源代码
3.1. 在子目录安装
3.2. 不一致的库

4. debian/下需要的东西
4.1. `control'文件
4.2. `copyright'文件
4.3. `changelog'文件
4.4. `rules' file

5. Other files under debian/
5.1. README.Debian
5.2. conffiles.ex
5.3. cron.d.ex
5.4. dirs
5.5. docs
5.6. emacsen-*.ex
5.7. init.d.ex
5.8. manpage.1.ex, manpage.sgml.ex
5.9. menu.ex
5.10. watch.ex
5.11. ex.package.doc-base
5.12. postinst.ex, preinst.ex, postrm.ex, prerm.ex

6. Building the package
6.1. Complete rebuild
6.2. Quick rebuild

7. Checking the package for errors

8. Uploading the package

9. Updating the package
9.1. New Debian revision
9.2. New upstream release
9.3. Verifying package upgrades

10. Where to ask for help


-------------------------------------------------------------------------------


1. 起步
--------------------------------

本文试着描述如何来建立Debian包,并且用实际的例子加以说明。有句罗马
谚语是 Longum iter est per preaecepta, breve et efficax per exempla!
(It's a long way by the rules, but short and efficient with examples!
虽然是技术文章也不乏它的艺术性:-))。

Debian之所以成为如此优秀的发行版,一个重要的原因是有一个非常优秀的包
管理机制。尽管现在有众多Debian格式的软件包,但有时你还是需要安装一些
列表中没有的软件。你也许想知道如何才能制作自己的程序包,可能你认为这
是非常困难的事。假如你确实是个Linux新手,那么它真的很难。但如果你是新
手,你现在也不会读这篇文档。(老外废话就是多,后面不说了)

有一件事是肯定的,要正确地创建和维护Debian包,你需要很多时间。要确定
没有错误,需要维护者有一定的技术能力和dilligent。

这篇文档解释了每一个细致的步骤,帮助你创建第一个包,并使你获得打包的
经验。

最新版的文档可以在http://www.debian.org/doc/maint-guide/和
http://debian.linuxforum.net/doc/manuals/maint-guide/上找到。


1.1. 你需要的程序
--------------------------------------

在开始之前,你需要确定你已经正确地安装了一些额外的包。注意这个列表
中的包并没有`essential'或`required'的标记 - 我们认为你已安装了这些包。

这个版本的文档已经将包升级到了Debian 2.2(`potato')和3.0(`woody')。

下面的包来自于标准的Debian安装,所以你可能已经安装了。尽管如此,我们
还是应该用`dpkg -s <package>`检查一下。

* `dpkg-dev' - 包含解包(unpack)、构造(build)和上载(upload)Debian
源码包的工具。 (see dpkg-source(1))

* `file' - 这个方便的程序能确定一个文件是什么类型。(see file(1))

* `gcc' - GNU C 编译器,必需的,如果你的程序是用C语言写的。(see gcc(1))
这个包也牵涉(pull in)到一些其它的包,比如`binutils'。它包括了
组装和链接目标文件的程序(see `info binutils` in the binutils-doc
package)和`cpp'- C预处理器。(see cpp(1))

* `g++' - GNU C++ 编译器,必需的,如果你的程序是用C++写的。(see g++(1))

* `libc6-dev' - gcc创建目标文件需要链接的C类库和头文件。(see `info libc`
in the `glibc-doc'package)

* `make' - 通常创建一个程序有好几步,如果你不想一边又一边地输入相同
的命令,那么你能用这个程序创建`Makefile'(see `info make`)来自动完
成这一过程。

* `patch' - 这个有用的工具可以获得包含差别列表(由diff程序产生)的文件,
并且将它应用到源文件上,生成一个修补过的版本(see patch(1))。

* `perl' - Perl是一个用来类Unix系统上的解释型脚本语言,通常指"Unix's
Swiss Army Chainsaw". (see perl(1))

你可能也需要安装下面的包:

* `autoconf' and `automake' - 许多新的程序使用配置脚本和Makefiles,
用这些辅助程序来进行预处理。(see `info autoconf`, `info automake`)

* `dh-make' and `debhelper' - dh-make 是创建样包框架所必需的。它还要
使用一些debhelper来创建包。它们不是必需的东西,但对于新的维护者来
说是强烈推荐的。它使得整个过程很容易开始和后继控制。(see
dh_make(1), debhelper(1),/usr/share/doc/debhelper/README)

* `devscripts' - 包含一些很好的、有用的脚本,对维护者可能很有用,但
它们也不是必需的。(see /usr/share/doc/devscripts/README.gz)

* `fakeroot' - 这个工具可以让你模拟为root,这对于构造过程的有些部分
是必要的。(see fakeroot(1))

* `gnupg' - 能让你digitally _sign_ packages的工具。这非常的重要,如
果你想将你的程序发布给其他人。并且当你的工作包含在Debian发行版中时,
你当然需要做这些事。(see gpg(1))

* `g77' - GNU Fortran 77 编译器,必需的,如果你的程序是用Frotran写的。(see g77(1))

* `gpc' - GNU Pascal编译器,必需的,如果你的程序用Pascal编写。
这儿值得注意的是`fp-compiler',Free Pascal Compiler,在这个工作中使
用也很不错。(see gpc(1), ppc386(1))

* `imake' and `xmkmf' - 一些程序,通常是为X11做的,也使用这些程序来从
一组宏中生成Makefiles。(see imake(1), xmkmf(1))

* `lintian' - Debian的包检查器。在你构造包后让你知道任何常见的错误,
并解释发现的错误。(see lintian(1),
/usr/share/doc/lintian/lintian.html/index.html)

以下是非常重要的文档,你应该和本文档一起阅读:

* `debian-policy' - the Policy includes explanations of the
structure and contents of the Debian archive, several OS design
issues, the Filesystem Hierarchy Standard (which says where each
file and directory should be) etc. For you, the most important
thing is that it describes requirements that each package must
satisfy to be included in the distribution. (see
/usr/share/doc/debian-policy/policy.html/index.html)

* `developers-reference' - for all matters not specifically about
the technical details of packaging, like the structure of the
archive, how to rename, orphan, pick up packages, how to do NMUs,
how to manage bugs, when and where to upload etc. (see
/usr/share/doc/developers-reference/developers-reference.html/index.html)

以上的简短介绍只是告诉你每一个包是做什么的。在开始之前请完整阅读每一
个程序的文档,最少是它们的的标准用法。现在做看起来很累,但稍后你会对
你所读的东西感到很高兴。

Note: `debmake' is a package that contains some programs that function
similar to dh-make, but its specific use is _not_ covered in this
document, because it is _deprecated_. Please refer to the Debmake
manual (http://www.debian.org/~jaldhar/) for more information.


1.2. 附加信息
----------------------

你能够制作两种包,源码包和二进制包。源码包包含了能够编译为程序的代
码。二进制包包含的仅仅是完成的程序。不要混淆了程序的源码和程序的源码
包。如果想了解更多术语上的细节,请阅读其它的手册。

在Debian中,“维护者”(maintainer)是指制作包的人,“溯源作者”
(upstream author想不到好词了:-))指程序的作者。在Debian之外,“溯源
维护者”是目前维护程序的人。通常作者和溯源维护者是同一个人,有时甚至
连维护者也是同一个人。如果你制作一个程序,并且想在Debian中获取,你可
以成为一个维护者自由提交你的程序。

在你构造你的包以后,如果你想你的程序在下一个发行版中出现(如果程序有
用,为什么不了),那么你需要成为一个官方的Debian维护者。相关过程在
Developer's Reference中有描述。请阅读。


-------------------------------------------------------------------------------


2. 第一步
--------------


2.1. 选择你的程序
------------------------

你可能已经选择了要创建的包。首先你需要检查发行版中是否已经包含了这
个包。如果你是用的是 `stable',那么最好在
http://www.debian.org/distrib/packages上查询。如果你正使用'unstable',
用下面的命令检查:

dpkg -s program
dpkg -l '*program*'

如果包已经存在,那么安装它就行了!如果是孤立包--它的维护者是
"Debian QA Group",那么你可以来维护它。参考孤立包的列表
(http://www.debian.org/devel/wnpp/orphaned)和包的过继列表
(http://www.debian.org/devel/wnpp/rfa_bypackage)确定所选的包
确实需要获取。

如果你有能力维护这个包,那么获取源码(比如用`apt-get source
packagename')并检查。不幸的是本文档并不包含如何过继包的完整
信息。让人感到欣慰的是你不必花大量的时间来弄清楚包是如何工作
的,因为其他人早已为你做好了最初的工作。但是你还是应该继续读
下去,下面的建议对你的工作还是很有用的。

如果包是新的,并且你想在Debian中看到它,那么照下面的做:

* 在继续工作前,检查没有其他人也在维护这个包
(http://www.de.debian.org/devel/wnpp/being_packaged).如果
已经有人在维护了,你觉得有必要,那么可以联系他们。否则,
寻找其它感兴趣的、没人维护的程序。

* 依据the Debian Free Software Guidelines
(http://www.debian.org/social_contract#guidelines),如果
是自由软件,那么程序必须有许可证。如果它不遵守这些协议,
但是可以自由的发布,那么它就能包含在`contrib'或`non-free'中。
如果你不确定它应该放在什么位置上,那么把许可证的内容贴到
<[email protected]>上,征求意见。

* program certainly should _not_ run setuid root, or even better -
it shouldn't need to be setuid or setgid to anything.

* program should not be a daemon, or something that goes in */sbin
directories, or open a port as root.

* 程序最后应该是二进制、可执行的,类型库很难处理。

* 它应该有详细的文档,或者(且)代码要容易理解。

* 你应该联系程序的作者,确定他们同意将程序打包。能与作者进行
商议是很重要的,防止程序有任何的细节问题,因此,不要试图将未
维护的部分打进包中。

* 最后你必须确定它能工作,并且试过好几次。(你应该做很多事,
而不至这一条)

当然这些只是安全措施,保护你免受愤怒的用户的攻击,如果你做错了一些
事(in some setuid daemon...)。当你获得了足够的打包经验的时候,
你能够做这样的包。但即使是经验丰富的开发者,在他们有疑问的时候,
他们也会参考debian-mentors的邮件列表。那里的人们会很乐意帮助你的。

要获取更多的信息,请查阅Developer's Reference。


2.2. 获取程序,进行试验
------------------------------------

你要做的第一件事是寻找并下载原始的包。我假定你已经拥有了源代码。
自由Unix程序的源代码通常是tar/gzip格式的,后缀名为.tar.gz,通常
有一个被称为program-version的子目录,所有的源代码都在里面。如果
你得到的程序是其它类型的(比如,文件名以".Z"或".zip"结尾),那么
用合适的工具解包,或者在你不知道如何正确解包的情况下,可以在
debian-mentors的邮件列表上询问。(提示:讨论组`file archive.extension`)

作为例子,我选用`gentoo'这个程序,一个X GTK+文件管理器。注意这
个程序已经被打过包了,并且自这个文档第一次写好以来,版本发生了
巨大的变化。

在家目录下创建一个子目录,叫'debian'或'deb'或者其它你认为合适的
名字(比如本文的 ~/gentoo/就不错)。将下载的文件放在里面,解压
(用`tar xzf gentoo-0.9.12.tar.gz`)。确定没有错误,甚至是一些不
相关的错误,因为在别人的系统上解包就很有可能会有问题,他们的解包
工具不一定会忽略这些异常。

现在你有了另一个子目录,叫'gentoo-0.9.12'。进入这个目录,完整地
阅读提供的文档。一般会有文件叫README*, INSTALL*, *.lsm或者 *.html。
通过阅读你必须知道如何正确编译和安装程序。(大多数情况下,我们假定
你想安装到/usr/local/bin目录下,你不用管这些,更多的内容会在
Section 3.1, `Installation in a subdirectory'中涉及)。

这一过程是从程序到程序的改变,但许多现在的程序都来自于一个`configure'
脚本,它基于你的系统来配置源码,并确认你的系统能够进行编译。在用
`./configure`配置后,程序通常用`make`进行编译。有一些支持`make check`,
运行它包括了一个自检。将程序安装到目标目录下通常用`make install`来
完成。

现在试着编译、运行你的程序,确定它能正常工作,并且在安装或运行期间
不会破坏其它的东西。

同样,你可以用`make clean` (或`make distclean`更好)来清理构造目录
。有时甚至有`make uninstall`来卸载所有安装的文件。


2.3. 包的名称和版本
-----------------------------

你的打包工作应该从完全干净的源目录开始,或者重新将源码解包。

为了正确地构造包,你必须使程序的原始名称为小写,并且应将应将源码的
目录改变为<packagename>-<version>的形式。

如果程序的名称不是由一个单词组成的,将其缩短为一个单词,或使用
缩写。例如程序"John's little editor for X",包应该命名为johnledx,或
jle4x或其它你喜欢的,只要符合一些合理的限制,比如20个字符。

同样要检查程序的确切版本号。如果部分软件不是用X.Y.Z的形式标示版本,
但有一种形式的日期,那么可以用日期作为版本号,但要预留一个"0.0."
(这只是为了防止溯源者某天想发布一个新的版本,比如1.0)。因此,如果发行
的日期是1998年12月19日,那么版本号就是0.0.19981219。

有些程序根本就没有数字标识,这种情况下你需要与溯源维护者联系,看他们
是否有其它的追踪修订方法。


2.4. Initial "debianization"
----------------------------

确定在源码目录下,使用这个命令:

dh_make -e your.maintainer@address -f ../gentoo-0.9.12.tar.gz

当然,用你的e-mail替换"your.maintainer@address"字符串,为了包含在变更
目录和其它文件中,并且文件名有最初源码文件的名字。更多信息参阅dh_make(1)。

接着会有一些信息。它会问你要创建那种类型的包。Gentoo是简单的二进制包,
它只创建一个二进制文件,即一个deb文件,因此我们选在第一个选项,用`s'键
查看屏幕上的信息,用<enter>键确认。

再说一次,作为一个新的维护者,你可能会在创建多部件的二进制包或类型库
时感到气馁。它并不是很难,但确实需要更多的知识,因此我们这里不讨论它。

请注意,你只要运行一次dh_make,如果你在同样的、已经"debianized"的目录
再运行的话,它就会出错。这也意味着,你可以在将来用一个不同的方法发布一
个修订版或新的版本。参阅Chapter 9 `Updating the package'。


-------------------------------------------------------------------------------


3. 修改源代码
-----------------------

通常程序安装在/usr/local子目录下。但Debian包不一定要用这个目录,因为
它是为系统管理员(或用户)保留的私有空间。这意味着你必须察看你的程序
构造系统,通常用Makefile开始。脚本make(1)会用来自动构造这个程序。关于
Makefiles的更多细节,参阅Section 4.4, ``rules' file'。

注意如果你的程序使用GNU automake(1) 且/或 autoconf(1),那么意味着源码
包含Makefile.am 且/或 Makefile.in文件,在个别情况下,你需要修改这些文
件。因为每次调用automake都会用Makefile.am产生的信息重写Makefile.in,并
且每次使用./configure也会发生同样的事。编辑Makefile.am需要一些automake
的知识,你可以阅读automake的相关信息。尽管编辑Makefile.in和编辑Makefile
是一样的,但一定要注意变量,比如任何用'@'引起来的字符串,像@CFLAGS@或
@LN_S@,在调用./configure时它们都会被实际的字符串所替代。

Also note that there isn't space here to go into _all_ the details of
fixing upstream sources, but here are a few problems people often run
across.


3.1. 在子目录安装
-----------------------------------

大多数程序都有办法将自己安装到已有的目录结构中,因此它们的二进制文件会
包含在你的$PATH中,在一般的位置你可以找到它们的文档和手册。但是,如果
你那么做, 那么程序会安装在其它的文件中间。这样的话会使你的打包工具很
搞清楚哪些文件属于你的包,哪些不属于。

因此你需要做一些其它的事:将程序安装在一个临时目录中,这样方便用工具
来制作.deb包。当用户安装你的包时,所有需要在用户机器上安装的东西都包
含在这个目录中,唯一不同的是dpkg会把这些文件安装在root目录下。

临时目录通常创建在解开的源码包的debian/目录下,通常叫 `debian/tmp'或
`debian/packagename'。

记住尽管你需要把程序装在debian/packagename下,但在放置到root目录中的
时候仍然需要正确地处理,例如在从.deb包安装的时候。因此,在包文件中不
应该建立硬代码(hardcode),如/home/me/deb/gentoo-0.9.12/usr/share/gentoo'。

对于使用GNU autoconf的程序,这会十分得容易。大多数这样的程序都有
默认设置的makefiles,允许程序安装到任何一个子目录下,记住/usr(例如)
是规范的前缀。当它检测到你的程序使用autoconf,dh_make会自动使用来
自动完成这些事情,因此你也可以跳过这一节。但对于其它的程序,你可能
必须检查并修改Makefiles。

这是gentoo's Makefile的相关部分:

# Where to put binary on 'make install'?
BIN = /usr/local/bin

# Where to put icons on 'make install'?
ICONS = /usr/local/share/gentoo

我们看到文件会被安装到`/usr/local'下,修改这些路径:

# Where to put binary on 'make install'?
BIN = $(DESTDIR)/usr/bin

# Where to put icons on 'make install'?
ICONS = $(DESTDIR)/usr/share/gentoo

为什么是这些路径而不是其它的呢?因为Debian包从不在`/usr/local'下安装
文件 -- 那是为系统管理员预留的目录。在Debian系统上这样文件会在`/usr'
下。

二进制文件、图标、文档等的确切位置在Filesystem Hierarchy Standard (see
/usr/share/doc/debian-policy/fhs/)中指定。我推荐你浏览一下,阅读与你的
包相关的章节。

因此,我们把二进制文件安装在/usr/bin目录下,而不是/usr/local/bin下,
指南在/usr/share/man/man1下,而不是/usr/local/man/man1下等。注意,在
gentoo的makefile中并没有提到指南,但是因为Debian的原则要求每个程序都
要有一个,所以我们会在后面做一个,安装在/usr/share/man/man1目录下。

一些程序不使用makefile变量来定义这样的路径。这意味着你可能必须编辑实际
的C源文件,为的是修改它们以使用正确的位置。但是在哪里,查找什么呢?你
可以用这条命令:

grep -rn usr/local/lib *.[ch]

Grep会在源码包中迭代运行,一旦有所发现,就会告诉你文件的名称和行号。

编辑这些文件,用usr/*代替/usr/local/。小心,别搞坏了其它的代码!:-)

在你找到install标记后(寻找`install:'开头的行,一般都有效),重新命名所有
的引用目录,除了在Makefile中定义的。gentoo预先定义的install标记是这样的:

install: gentoo
install ./gentoo $(BIN)
install icons/* $(ICONS)
install gentoorc-example $(HOME)/.gentoorc

修改后是这样的:

install: gentoo-target
install -d $(BIN) $(ICONS) $(DESTDIR)/etc
install ./gentoo $(BIN)
install -m644 icons/* $(ICONS)
install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc

你一定注意到在其它命令之前有一个`install -d'命令。原始的makefile并没有它,
因为在系统中通常已经有/usr/local/bin和其它的目录,在运行过`make install`
以后。然而,因为我们要在自己的空目录(或者是不存在的目录)中安装,所以我
们必须创建每一个目录。

我们同样可以在末尾增加其它的东西,比如附件文档的安装,这些文档有时是溯源
作者忽略的。

install -d $(DESTDIR)/usr/share/doc/gentoo/html
cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html

细心的读者会发现我将`gentoo'改为`gentoo-target'。这叫做不相关错误的修改:-)

只要你的改变不是特定的与Debian包相关,那么当然可以把它们发给溯源维护者,
这样他们可以在程序的下一个版本中包含它们,这对每个人都有用。同样需要记住,
你做的修改不要针对先前的某个Debian或Linux(甚至是Unix),然后再发给他们,
即使它们便于移植。这会让你的修改更容易应用。

注意你不必发送debian/*文件。


3.2. 不一致的库
------------------------

有一个普遍的问题:从一个平台到另一个平台的库经常是不一样的。比如,
Makefile能够包含一个库的引用,而这个库在Debian系统中根本没有。在这种
情况下,你需要修改它为Debian中有的库,并且有同样的效果。

因此,如果在Makefile(或Makefile.in)中有这么一行(而且你的程序不能编译):

LIBS = -lcurses -lsomething -lsomethingelse

把它改成这样就好了:

LIBS = -lncurses -lsomething -lsomethingelse

(考虑到libncurses包现在有一个libcurses.so的符号链接,作者认为这不是个最好
的例子,但他又想不到一个更好的。欢迎你提出好的建议 :-)


-------------------------------------------------------------------------------


4. debian/下需要的东西
-------------------------------

在源码目录下有一个新的子目录叫`debian'。里面有很多的文件,为了定制包的
行为,我们需要修改它。它们中重要的文件是`control', `changelog',
`copyright'和'rules',这些是所有包都需要的。


4.1. `control'文件
-------------------

这个文件包含了许多的值,这些值是`dpkg', `dselect'和其它一些包管理工具
用来管理包时使用的。

这是dh_make为我们创建的control文件:

1 Source: gentoo
2 Section: unknown
3 Priority: optional
4 Maintainer: Josip Rodin <[email protected]>
5 Build-Depends: debhelper (>> 3.0.0)
6 Standards-Version: 3.5.2
7
8 Package: gentoo
9 Architecture: any
10 Depends: ${shlibs:Depends}
11 Description: <insert up to 60 chars description>
12 <insert long description, indented with spaces>

(我增加了行号。)

1-6行是源码包的控制信息。

第1行是源码包的名称。

第2行是源码包加入的发行版中的位置。

也许你注意到了,Debian分成了几个部分: main (the free
software), non-free (the not really free software) 和 contrib (free
software that depends on non-free software)。在这些大分类之下,逻辑
上的小分类,他们简短地描述了有些什么包。因此,我们用`admin'代表管理
员专用的程序,`base'代表基本工具,`devel'代表开发工具,`doc'代表文
档,`libs'代表库,`mail'代表e-mail readers and daemons,`net'代表
network apps and daemons,`x11'代表X11程序,这些在其它的地方不再适用。

我们把它改成x11。("main/"前缀已经应用,因此我们可以忽略。)

第3行描述了用户安装的包的重要程度。参阅Policy manual来设置这一行。
"optional"优先权通常用于新的包。

Section和priority被`dselect'这样的前端使用,当他们对包排序和选择默认
包时。一旦你把包上传到Debian上,这两部分的值会被档案管理员重写,并且
他们会用email通知你。

由于这是个一般优先权的包,并且不会和其它的冲突,所以我们仍然用"optional"。

第4行事维护者的名字和email。确定在使用email的时候为这行加上一个有效
的头"To: ",因为在你上传后,错误追踪系统会使用它来给你汇报错误。避免
使用逗号(commas)、&(ampersands)和圆括号(parenthesis)。

第5行包括了构造你的包所必需的包的列表。一些包如gcc和make已经有了,参阅
`build-essential'包以获取更多细节。如果需要一些非标准编译器或其它工具
你需要在`Build-Depends'这一行中写明。如果有多个用逗号分开;阅读依赖性的
解释以了解这一行的更多语法。

你同样要有Build-Depends-Indep, Build-Conflicts和其它的行。这些数据会被
Debian的自动打包软件使用,为的是为其它平台创建二进制包。参阅Policy manual
以获得更多关于build-dependencies的信息;参阅Developers' Reference以获得
更多关于平台和移植软件的信息。

你可以用这个找出需要哪些包,在构造你的包的时候:

strace -f -o /tmp/log ./configure
# or make instead of ./configure, if the package don't use autoconf
for x in `dpkg -S $(grep open /tmp/log|perl -pe 's!.* open\(\"([^\"]*).*!$1!' |grep "^/"| sort | uniq| grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|cut -f1 -d":"| sort | uniq`; do echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; done

Gentoo恰好也需要`xlibs-dev', `libgtk1.2-dev'和`libglib1.2-dev',因此我们
把它们添加到`debhelper'之后。

第6行是这个包所遵守的Debian Policy标准的版本,也就是你在制作包时读到
的Policy manual的版本号。

第8行是二进制包的名称。通常跟源码包的名称是一样的,但不一定要这样。

第9行描述了二进制包能够编译的CPU的体系(类型)。我们依然用"any",因为
dpkg-gencontrol(1)会根据编译的机器添上合适的值。

如果你的包是独立体系(比如,a shell或Perl script或一篇文档),那么就把它
改为"all",阅读后面的Section 4.4, ``rules' file',关于使用`binary-indep'
规则来代替`binary-arch'。

第10行表示了Debian包管理系统的最有效的特征。包之间以多种方式相互依赖。
除了Depends:,还有一些关系也是推荐的,如Recommends:,
Suggests:, Pre-Depends:, Conflicts:, Provides:, 和 Replaces:。

包管理工具在处理这些关系时也是以同样的方式来对待的;如果不是这样,它会
有相应的解释。(参阅 dpkg(8), dselect(8), apt(8), aptitude(1)等。)

依赖性的解释:

* Depends:

The package will not be installed unless the packages it depends
on are installed. Use this if your program absolutely will not
run (or will cause severe breakage) unless a particular package
is present.

* Recommends:

Frontends such as dselect or aptitude will prompt you to install
the recommended packages along with your package; dselect will
even insist. dpkg and apt-get will ignore this field, though.
Use this for packages that are not strictly necessary but are
typically used with your program.

* Suggests:

When a user installs your program, all frontends will likely
prompt them to install the suggested packages. dpkg and apt-get
won't care. Use this for packages which will work nicely with
your program but are not at all necessary.

* Pre-Depends:

This is stronger than Depends:. The package will not be
installed unless the packages it pre-depends on are installed
_and correctly configured_. Use this _very_ sparingly and only
after discussing it on the debian-devel mailing list. Read:
don't use it at all. :-)

* Conflicts:

The package will not be installed until all the packages it
conflicts with have been removed. Use this if your program
absolutely will not run or will cause severe problems if a
particular package is present.

* Provides:

For some types of packages where there are multiple alternatives
virtual names have been defined. You can get the full list in
the
/usr/share/doc/debian-policy/virtual-package-names-list.txt.gz
file. Use this if your program provides a function of an
existing virtual package.

* Replaces:

Use this when your program replaces files from another package,
or completely replaces another package (used in conjunction with
Conflicts:). Files from the named packages will be overwritten
with the files from your package.

所有这些字段都有统一的语法。它们是一个包名称的列表,用逗号分开。这些
包的名称也可以组成另一个包名称列表,用`|'分隔。

这些字段可以限定它们能够使用的每个包的特别版本。版本号列在了包名称后
面的圆括号内,而且还可以包含下面列出的一个关系。可用的关系是:`<<',
`<=', `=', `>=' and `>>' 分别代表严格低于,低于或等于,确切地等于,
大于或等于,严格大于。例如:

Depends: foo (>= 1.2), libbar1 (= 1.3.4)
Conflicts: baz
Recommends: libbaz4 (>> 4.0.7)
Suggests: quux
Replaces: quux (<< 5), quux-foo (<= 7.6)

最后一个你需要知道的特征是 ${shlibs:Depends}。在你的包构造和安装在临时
目录以后,dh_shlibdeps(1)会为二进制文件和库寻找它,确定它们的共享库的
依赖性并检测它们在哪些包里,比如libc6或xlib6g。它会传递列表给dh_gencontrol(1),
dh_gencontrol(1)会在合适的位置填上它,你不需要担心它。

上面说的这些,我们可以让Depends:这一行保留它原来的样子,在`Suggests: file'
之后插入另一行,因为gentoo可以使用其它程序/包提供的一些特性。

第11行是简短的描述。大多数人的屏幕是80列宽,因此不要超过60个字符。我把
它改成"A fully GUI configurable X file manager using GTK+"。

第12行是详细详细描述。它可以是一段描述包详细信息的文字。每行的第一列
应该是空的。不能有空白行,但你可以用只用一个 .(点)来代替。而且在详细描
述之后有一个空行,但不能再有其它的东西。

最后,这是更新后的control文件:

1 Source: gentoo
2 Section: x11
3 Priority: optional
4 Maintainer: Josip Rodin <[email protected]>
5 Build-Depends: debhelper (>> 3.0.0), xlibs-dev, libgtk1.2-dev, libglib1.2-dev
6 Standards-Version: 3.5.2
7
8 Package: gentoo
9 Architecture: any
10 Depends: ${shlibs:Depends}
11 Suggests: file
12 Description: A fully GUI configurable X file manager using GTK+
13 gentoo is a file manager for Linux written from scratch in pure C. It
14 uses the GTK+ toolkit for all of its interface needs. gentoo provides
15 100% GUI configurability; no need to edit config files by hand and re-
16 start the program. gentoo supports identifying the type of various
17 files (using extension, regular expressions, or the 'file' command),
18 and can display files of different types with different colors and icons.
19 .
20 gentoo borrows some of its look and feel from the classic Amiga file
21 manager "Directory OPUS" (written by Jonathan Potter).

(我增加了行号。)


4.2. `copyright'文件
---------------------

这个文件包含了包的溯源信息,版权和许可证信息。它的格式规范中并没有规定,
但内容是有规定的(section 13.6 "Copyright information")。

dh_make默认创建的,看起来是这样的:

1 This package was debianized by Josip Rodin <[email protected]> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from <fill in ftp site>
5
6 Upstream Author(s): <put author(s) name and email here>
7
8 Copyright:
9
10 <Must follow here>

(我增加了行号)

这个文件中要增加的重要的东西是包获取的地址和目前的版权注释和许可证。
你必须包括完整的许可证,除非它是一个通用自由软件许可证,如GNU GPL或LGPL,
BSD或Artistic许可证,在你能够引用到合适的文件时,这些文件在每个已有
Debian系统中的/usr/share/common-licenses/目录下。

简言之,gentoo的copyright文件看起来是这样的:

1 This package was debianized by Josip Rodin <[email protected]> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from: ftp://ftp.obsession.se/gentoo/
5
6 Upstream author: Emil Brink <[email protected]>
7
8 This software is copyright (c) 1998-99 by Emil Brink, Obsession
9 Development.
10
11 You are free to distribute this software under the terms of
12 the GNU General Public License.
13 On Debian systems, the complete text of the GNU General Public
14 License can be found in the file `/usr/share/common-licenses/GPL'.

(我增加了行号。)

作者: nilarcs   发布时间: 2003-01-17

对源码编译的包,make完成后,使用checkinstall工具,超简单,对rpm包,使用alien工具,也是超简单

作者: lxiaob   发布时间: 2004-11-25

但alien可能发生转化好的.deb包装不上的情况

作者: akibaleon   发布时间: 2004-11-25

Debian新维护人员手册
http://www.debian.org/doc/maint-guide/

作者: jhuangjiahua   发布时间: 2004-11-25

引用:
最初由 lxiaob 发表
对源码编译的包,make完成后,使用checkinstall工具,超简单,对rpm包,使用alien工具,也是超简单
记住一定要修改 Makefile,否则,生成的 deb 包只可自用,请勿公开
因为一般情况下,如果不修改 Makefile 的话,生成的可执行文件是放在 /usr/local/bin 下面,这是不符合 Debian 规范的哦~

作者: hiweed   发布时间: 2004-11-25

引用:
最初由 hiweed 发表
因为一般情况下,如果不修改 Makefile 的话,生成的可执行文件是放在 /usr/local/bin 下面,这是不符合 Debian 规范的哦~
这个,只要在 configure 时加上 --prefix=/usr 就行了吧。
除非是 Makefile 里写死了路径,一般情况下是不需要修改的。

作者: carlos   发布时间: 2004-11-25

好文!

作者: yggdrasil   发布时间: 2004-12-09

热门下载

更多