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

Debian新维护人员手册
第 4 章 - debian/目录中必需的内容


在程序的源代码目录中有一个名叫`debian'的新子目录。在这个子目录中有 很多我们需要文件,通过修改这些文件可以定制软件包的行为。其中最为重要的 是`control'、`changelog'、`copyright'和`rules',它们对于所有的软件包都 是必需的。


4.1 `control'文件

在这个文件中包含了很多变量,dpkgdselect和其它软件包 管理工具通过它们来管理软件包。

dh_make为我们创建的control文件如下所示:

       1  Source: gentoo
       2  Section: unknown
       3  Priority: optional
       4  Maintainer: Josip Rodin <joy-mg@debian.org>
       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(自由软件)、 non-free(非自由软件)和contrib(基于非自由软件的自由软件)。在这些部分中, 还有子分类,这些子分类以简短的方式说明了软件包的用途。比如`admin'是只有 系统管理员才能使用的程序,`base'是基本的工具,`devel'是给程序员使用的工 具,`doc'是文档,`libs'是函数库,`mail'是邮件阅读工具和守护程序,`net' 是网络应用程序和守护程序,`x11'是不属于以上各个部分的X11程序,还有更多 这里就不一一叙述了。

我们把它改成x11。("main/"是缺省的前缀,因次我们可以忽略它。)

第3行描述了在用户安装系统时此软件包的重要程度。参考政策手册中相应的 指导可以知道应当把它设置成什么。"optional"的优先级对于新软件包通常是合 适的。

所属部分和优先级对dselect等前端软件是有用的,它们在排序和选择 缺省的软件包时会用到这些变量。当你把软件包上传到Debian以后,这两个字段 的值可以被文档维护员修改,在这种情况下,你会收到一封通知电邮。

因为这是一个普通级别的软件包,并且它不和其它任何软件包冲突,我们让它 保留原来的"optional"。

第四行是维护者的姓名和电子邮件地址。一定要保证这个字段包含有一个合法 的电子邮件"To: "字段,因为在你把软件包上传以后,bug跟踪系统将会使用这个 地址来传递通知bug信息的电子邮件给你。不要使用逗号、ampersands和 parenthesis。

第五行包括了要构件你的软件包需要的软件包列表。包括gcc和make在内的一 些软件包是不需要列出来的,关于此内容的详细信息可以参考软件包 build-essential。如果在构造你的软件包时需要一些非标准的编译器或者 是其它的工具,你就需要把它们加到`Build-Depends'这一行上。多个项目之间用 逗号隔开;要了解关于这个项目的语法的更多信息,请阅读关于二进制文件倚赖 性的解释。

你还可以在这里加入Build-Depends-Indep、Build-Conflicts和其它一些字 段。Debian的软件包自动构造系统将会使用这些数据为其它的计算机平台创建二 进制软件包。可以参考政策手册中关于build-dependencies的部分和程序员参考 手册,里面包含有关于其它平台(体系结构)以及如何把软件移植到上面的更多信息。

要想知道你的软件在编译的时候需要用到哪一个软件包,可以通过下面的方法:

       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-devlibgtk1.2-devlibglib1.2-dev才能够构造,因此我们把它们加到debhelper 的后面。

第6行是这个软件包遵循的Debian政策标准的版本,也就是你在制作这个软件 包时读的政策手册的那个版本。

第8行是二进制软件包的名字。它通常和源文件软件包有一样的名字,但实际 上并不一定得是这样。

第9行描述了可以使用这个二进制软件包的CPU类型。我们让它保持原来的 "any"值,因为dpkg-gencontrol(1)会在为任何一种 机器编译这个软件包时自动为这个字段填写合适的值。

如果你的软件包是体系结构无关的(比如一个shell或Perl脚本,或者是文 档),就把这个字段修改成"all",另外在稍后还要仔细看一下`rules' 文件, 第 4.4 节 中关于用`binary-indep'规则来代替`binary-arch'规则的内容。

第10行显示了Debian软件包系统的一个强大功能。软件包可以通过多种不同的 方式和其它的软件包相关连。除了Depends:之外,还有其它的关联字段,它们是 Recommends:、Suggests:、Pre-Depends:、Conflicts:、Provides:和Replaces:。

在管理这些软件包的关联时,所有的软件包管理工具通常的行为都是一样的; 如果不是这样的话,它将会给出解释。(参考dpkg(8)dselect(8)apt(8)aptitude(1)等。)

下面给出每一种软件包依存性的含义:

所有这些字段使用统一的语法格式:用逗号分隔的一系列软件包名称。这 里的软件包名称可以是用竖线符号`|'分开的一系列可相互替换 (alternative)的软件包名称。

对于每一个软件包的特定版本的要求也可以在这个字段中限制。只要在软 件包的名称后写上括号并在括号中写明版本列表并在每一个版本号前注明 当前软件包和它的关系就可以了。这里提到的关系可以是: <<<==>=>>, 它们分别表示先于、先于或等于、等于、晚于和晚于或等于。例如,

       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),后者将会把这些信 息填写到正确的位置上,你就不用为它操心了。

说了这么多,我们现在可以继续了,让Depends:这一行保持原状,并在它后面 插入一行,在这一行中些上Suggests: file,因为gentoo可以使用这个程 序/软件包提供的一些功能。

第11行是一个简短的描述。大多数人的屏幕都是80列宽的,所以描述文字不能 超过大概60个英文字符长。我把它改成"fully GUI configurable X file manager using GTK+"。

第12行是一个比较长的描述。在这里可以写关于这个软件包的详细情况的一段 话。每行的第1列应该是空白的。两行之间不能有空白行,如果真的想留一个空白 行,可以通过写一个单独的小数点符号实现。还有,在长描述之后,不能有超过 一行的空白。

最后,我们给出一个修改好的control文件:

       1  Source: gentoo
       2  Section: x11
       3  Priority: optional
       4  Maintainer: Josip Rodin <joy-mg@debian.org>
       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: 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' 文件

这个文件中包含着关于软件包的来自于上游的资源、版权和授权信息。它的格 式在政策中并未dictated,关于它的内容是(13.6 "Copyright information").

dh_make将会创建一个缺省的,其内容如下:

       1  This package was debianized by Josip Rodin <joy-mg@debian.org> 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协议,你就必需把它的协议包含在这个文件中。而当它使 用上述自由软件授权协议时,你可以直接引用/usr/share/common-licenses/目录 中的相应文件,它们已经存在于Debian系统中了。

简而言之,下面是gentoo的copyright文件:

       1  This package was debianized by Josip Rodin <joy-mg@debian.org> 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 <emil@obsession.se>
       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'.

(我为它增加了行号。)


4.3 `changelog' 文件

这是一个必需的文件,它的格式已经在政策文件的4.4节"debian/changelog" 中说明了。dpkg和其它需要获取你的软件包的版本号、修订号、发行版和紧急度 的程序会需要使用这个格式。

对你而言,它也是非常重要的,因为它可以让你写下所有你所做的所有变更。 这可以帮助下载了你的软件包的人们了解软件包中是否有它们应该知道的问题。 在二进制版本的软件包中,它会被保存在 `/usr/share/doc/gentoo/changelog.Debian.gz'文件中。

dh_make创建了一个缺省的,如下所示:

       1  gentoo (0.9.12-1) unstable; urgency=low
       2
       3   * Initial Release.
       4
       5  -- Josip Rodin <joy-mg@debian.org>  Wed, 11 Nov 1998 21:02:14 +0100
       6

(我为它增加了行号。)

第1行是软件包的名称、版本、发行版和紧急度。这里的名称必需和源代码包 的名称相同,发行版应当是`unstable'(或者`experimental'),urgency应当改成 任何比`low'高一些级别的内容。 :-)

第3到5行是一个很长的项目,在这里你可以写下你对这个版本的软件说做的修 改(不包括上游修改——有专门的由作者创建的文件来记录它们,稍后你将会把它 安装到/usr/share/doc/gentoo/changlog.gz)。新的内容必需插入在最上方的星 号(`*')前。你可以用dch(1)来做或者用 一个文本编辑器手工修改。

最后,你的文件应该是下面的样子:

       1  gentoo (0.9.12-1) unstable; urgency=low
       2
       3   * Initial Release.
       4   * This is my first Debian package.
       5   * Adjusted the Makefile to fix $DESTDIR problems.
       6
       7  -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100
       8

(我为它增加了行号。)

在后面的更新更新软件包, 第 9 章中你可以找到更多关于更新changelog的内容。


4.4 `rules' 文件

现在我们需要来看看dpkg-buildpackage(1)用来 创建软件包的精确规则了。这个实际上是另一个Makefile脚本,但同上游源代码 中的那个不同。与debian/目录中的其它文件不同的是这个文件有可执行标记。

就象其它的Makefile一样,每个`rules'文件都有一些用来指导如何处理源代 码的规则。每个规则都由目标、文件名或者是需要执行的操作的名称(如 `build:'、`install:')组成。当你要执行一个规则时可以在命令行参数上加入参 数(比如`./debian/rules build` 或者 `make -f rules install`)。在目标名称 之后,你可以写这个规则对程序活文件的倚赖性。之后,可以有任意数目的命 令,这些命令要用<tab>符号缩进。新的规则以位于第一列上目标声明开 始。空白行和以`#'(井字号)开始的行将会被作为注释忽略掉。

现在你可能已经听糊涂了,但只要看一下dh_make为我们创建的缺省的`rules' 文件你就能明白了。另外你也应该读一下info中的`make'项目来获得更多的信息。

有一个关于dh_make所创建的rules文件你的重要问题是你应该知道的:它只 是一个建议版本。对于一些简单的软件包它可以工作,但对于稍为复杂一些的, 应当敢于增加或者删减其内容使其符合你的需求。唯一你不能修改的就是规则的 名称,因为政策手册中提到的所有工具都将使用它们。

这里是dh_make为我们产生的缺省的debian/rules文件:

       1  #!/usr/bin/make -f
       2  # Sample debian/rules that uses debhelper.
       3  # GNU copyright 1997 to 1999 by Joey Hess.
       4
       5  # Uncomment this to turn on verbose mode.
       6  #export DH_VERBOSE=1
       7
       8  # This is the debhelper compatibility version to use.
       9  export DH_COMPAT=4
       10 
       11 CFLAGS = -g
       12 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
       13 CFLAGS += -O0
       14 else
       15 CFLAGS += -O2
       16 endif
       17
       18 build: build-stamp
       19 build-stamp:
       20        dh_testdir
       21
       22        # Add here commands to compile the package.
       23        $(MAKE)
       24        #docbook-to-man debian/gentoo.sgml > gentoo.1
       25
       26        touch build-stamp
       27
       28 clean:
       29        dh_testdir
       30        dh_testroot
       31        rm -f build-stamp
       32
       33        # Add here commands to clean up after the build process.
       34        -$(MAKE) clean
       35
       36        dh_clean
       37
       38 install: build
       39        dh_testdir
       40        dh_testroot
       41        dh_clean -k
       42        dh_installdirs
       43
       44        # Add here commands to install the package into debian/gentoo.
       45        $(MAKE) install DESTDIR=$(CURDIR)/debian/gentoo
       46
       47 # Build architecture-independent files here.
       48 binary-indep: build install
       49 # We have nothing to do by default.
       50
       51 # Build architecture-dependent files here.
       52 binary-arch: build install
       53        dh_testdir
       54        dh_testroot
       55 #      dh_installdebconf
       56        dh_installdocs
       57        dh_installexamples
       58        dh_installmenu
       59 #      dh_installlogrotate
       60 #      dh_installemacsen
       61 #      dh_installpam
       62 #      dh_installmime
       63 #      dh_installinit
       64        dh_installcron
       65        dh_installman
       66        dh_installinfo
       67 #      dh_undocumented
       68        dh_installchangelogs ChangeLog
       69        dh_link
       70        dh_strip
       71        dh_compress
       72        dh_fixperms
       73 #      dh_makeshlibs
       74        dh_installdeb
       75 #      dh_perl
       76        dh_shlibdeps
       77        dh_gencontrol
       78        dh_md5sums
       79        dh_builddeb
       80
       81 binary: binary-indep binary-arch
       82 .PHONY: build clean binary-indep binary-arch binary install

(我为它增加了行号。)

对于第1行你一定很熟悉,因为它和shell及Perl脚本很象。它告诉操作系统 这个文件应当交给/usr/bin/make来处理。

第6到9行上提到的DH_*变量应当被evident从简短的说明。要想知道关于 DH_COMPAT的更多信息,可以阅读debhelper(1) 手册中关于"Debhelper compatibility levels"一节。

第11到16行是一个支持DEB_BUILD_OPTIONS的骨架,它的描述可以在政策文档 的第11.1节"Binaries"中找到。简单的说,它们控制着在构造二进制文件的时候 是否要加入调试符号,是否要在安装的时候进行裁减。再重复一下,这只是一个 骨架,一个你应当做这件事的提示。你需要找出上游的构建系统是如何处理调试 符号和安装裁减的,然后自己实现它们。

一般情况下,你可以通过CFLAGS变量来让gcc在编译的时候使用"-g"选项—— 如果这是你的软件包的情况,你可以把CFLAGS="$(CFLAGS)"附加到 $(MAKE)调用的后面来propagete这个变量(看下面)。还有另外一种方 法,如果你的软件包使用了autoconf脚本,你可以把通过给./configure调用加上 前缀来把它传递给构建规则。

关于裁减的问题,一般情况下程序自己的安装配制都不会进行裁减,而且通常 也不会包含一个选项让 你来做这件事情。幸运的是,你有 dh_strip(1),而且当你设定了 DEB_BUILD_OPTIONS=nostrip时,他会安静地退出。

第18到26行描述了`build'(和`build-stamp')规则,它们运行应用程序自己的 Makefile来编译它。稍后在manpage.1.ex, manpage.sgml.ex, 第 5.8 节中我们会讨论docbook-to-man的 例子。

第28到36行的`clean'规则会清除所有不需要的二进制文件和自动产生的东 西,在每次构建软件包的时候都会首先执行。这个规则必须在所有的时候都能正 常工作(即便源代码目录已经清理被清理好的),所以请使用强制选项 (比如对于rm是`-f'),或者通过在命令的名字前加上`-'让make忽略返回值(失 败)。

`install'规则从第38行开始,它指导了安装过程。它通常去执行软件自己的 Makefile中的`install'规则,但会把软件包安装在$(CURDIR)/debian/gentoo 目录中——这就是为什么我们要在gentoo的Makefile中指定$(DESTDIR)作为安装 的跟目录。

就象注释中说明的那样,第48行上的`binary-indep'规则是用来构建体系结构 无关的软件包的。因为这里我们并没有这样的软件包,所以什么都不用做了。

在52-79行上是下一条规则`binary-arch',在这里我们运行了好几个 debhelper软件包中的小工具,它们将会在你的软件包上执行不同的操作来使其符 合政策。

如果你的软件包是`Architecture: all'的,那么你需要在`binary-indep'中 包含所有的命令,而让`binary-arch'保持空白。

debhelper程序都是以dh_开始的,剩下的部分描述了这个工具具体的作用。其 实它们的名字都已经说的很清楚了,但这里我们还是给出一些额外的解释:

要想了解更完整的的关于这些dh_*脚本究竟会做什么的信息以及它们其它的选 项,请阅读它们相应的手册。还有一些可能是非常有用的dh_*脚本文件在这里没 有提及。如果你需要使用它们,情阅读debhelper的文档。

在binary-arch一节中,你必须要注释掉或者删除掉你不需要的功能调用。对 于gentoo,我把关于examples、cron、init、man和info的行注释掉了,因为 gentoo根本不需要它们。而且在第68行上,我把`ChangeLog'换成了`FIXES',因 为那是上游的changelog文件的真实名字。

最后的两行(和其它这里未曾解释的地方)是需要的,在make的手册和Debian政 策文件都是可以找到。现在知道它们的作用并不重要。


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

Debian新维护人员手册

version 1.2, 2002年4月6日.

Josip Rodin joy-mg@debian.org