deb 包简易制作:以 gmlive 为例

这篇早该和大家见面的文章今天终于在笔者的努力下和大家见面了。正如大家看到的题目一样,本文讲的是有关于 deb 包的制作。当然,笔者并不是一个 debian 开发者,也不是一个 ubuntu 开发者。本文的目的是给新手一个简单的,关于如何将一般安装步骤为 configure, make, make install 的软件打成一个 deb 包,以方便管理的一个指南。当然有的朋友会说,用 checkinstall 就可以了。不过关于 checkinstall,我听过好多人说这种方法过于 dirty,到底如何笔者没有试过,也不好评价。您可以选择使用 checkinstall,但我可以保证,看完本文,您将会发现其实用常规的方法制作一个 deb 包也是很简单的。

所需软件

要成功编译软件并打包,您需要 build-essential, dh-make, debhelper, devscripts 以及其他成功编译所需的开发包。

获取源码包

这个不用多说了。首先笔者需要从 gmlive 主页上下载 gmlive 的源码包。这里笔者下载的是 0.21.1 版本。

debian 化

简单地理解,debian 化就是将源代码解包后,在其下建立一个名为 debian 的目录,该目录里面包含一些特定的描述文件,以指导程序正确生成 deb 包。

在本文的例子里,解压后笔者得到一个名为 gmlive-0.21.1 的目录,那么它下面需要有一个 debian 目录。这里我们不会手工创建它,而是使用 dh_make 命令。这里笔者进入 gmlive-0.21.1 目录,然后在该目录下执行:

1
$ dh_make -e mail@dot.com -f ../gmlive-0.21.1.tar.gz

mail@dot.com 为笔者的 email,您得用自己的 email 替换。命令执行后您会被问及一系列问题,比如问您是不是打一个单一的包,还是其他什么类型的。这里笔者选择单一的包。然后检查屏幕上的信息,一切 ok 输入回车。

编辑 debian 目录里的内容

如果您已经看过 debian 目录里的内容,那么您可能会被吓到,哇!这么多文件。其实不用怕,因为好多文件都不是必需的。在这个例子中,笔者只留下这 6 个文件:changelog, control, compat, copyright, rules, docs,甚至,连 docs 也可以不要,不过这里笔者还是将它保留了。下面需要做的是逐一打开查看并编辑这些文件。

changelog

这是更新日志,当然是指 deb 包的更新日志,而非软件本身的更新日志。笔者将它改成了这样:

1
2
3
4
5
gmlive (0.21.1-1) unstable; urgency=low

* Initial release

-- my name <mail@dot.com>  Fri, 02 Jan 2009 15:55:19 +0800

因为不需要提交到官方软件仓库,所以不需要 close 什么 bug,笔者直接将后面的 close 字样去掉了。

control

这个文件记录软件的相关信息,例如其主页的软件包描述(就是 apt-cache show 时看到的东西)。需要改的地方是 Homepage 和 Description。比如笔者将它改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Source: gmlive
Section: unknown
Priority: extra
Maintainer: my name <mail@dot.com>
Build-Depends: debhelper (>= 7), autotools-dev
Standards-Version: 3.8.0
Homepage: http://code.google.com/p/gmlive/

Package: gmlive
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: live video for linux
live video for linux,
maybe it is a UI for mplayer by playing live video.

注意哦,最后两行描述前面是要空一格的。

这个顾名思义,是版权声明文件,声明软件以及 deb 包的版权。我们需要用 gmlive 的真实作者名字和以及邮件地址来替换里面的相应字段,如果不只一个作者,那就每个作者写一行。笔者将其改成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
This package was debianized by:

my name <mail@dot.com&> on Fri, 02 Jan 2009 15:55:19 +0800

It was downloaded from:

http://code.google.com/p/gmlive/

Upstream Author(s):

lerosua <lerosua@gmail.com>
wind <xihels@gmail.com>
yetist <yetist@gmail.com>

Copyright:

Copyright (C) 2008 Cyclone Team

License:

This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this package; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

On Debian systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL'.

The Debian packaging is:

Copyright C) 2009, my name <mail@dot.com>

and is licensed under the GPL, see above.

rules

这个文件是关键,能不能打包成功就看这个文件了。可以看到这个文件上面的注释说我们应该勇敢地按需修改这个文件。这里笔者作了很多修改,让这个文件尽量简短:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/make -f
# -*- makefile -*-

config.status: configure
dh_testdir
./configure --prefix=/usr

build: build-stamp

build-stamp:  config.status
dh_testdir

$(MAKE)

touch $@

clean:
dh_testdir
dh_testroot
rm -f build-stamp

[! -f Makefile ] || $(MAKE) distclean

dh_clean

install: build
dh_testdir
dh_testroot
dh_prep
dh_installdirs

$(MAKE) DESTDIR=$(CURDIR)/debian/gmlive install

binary-indep: install

binary-arch: install
dh_testdir
dh_testroot
dh_installchangelogs ChangeLog
dh_installdocs
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

大家应该已经发现了,这里其实就是编译软件所需执行的一系列命令。首先,dh_testdir 检查当前的工作目录是不是源代码目录,然后再执行 ./configure –prefix=/usr。再往下看,它执行了 make,然后下面的一系列命令将之打成一个 deb 包。想了解下面的一系列 dh 开头的命令是什么意思,可以看看他们的 man 手册。

docs

顾名思义,是文档,如果希望源代码目录下的某个文档出现在 /usr/share/doc/gmlive/ 下,那就把它写进去。比如笔者希望源代码目录下的 AUTHORS, NEWS, README 文件能出现在 /usr/share/doc/gmlive 下,那 docs 文件就是这样:

1
2
3
AUTHORS
NEWS
README

制作 deb 包

好了,一切完毕,下面就可以生成 deb 包了。

1
$ dpkg-buildpackage

如果一切顺利,该命令执行完毕后您就会得到一个 deb 包。对了,这个命令要在源代码目录下执行的,而不是 debian 目录下。如果之中出现什么依赖问题,那就该装什么装什么,多半是因为少了什么开发包的缘故。

有新版本了怎么办?

本来是没有这一节的,因为在一开始笔者也说了,这篇文章本该很早就和大家见面的,但是笔者一直拖到 gmlive 0.21.2 发布了才写出来,所以就加了这一节。

下载新的源代码包,并将其与旧的源代码放于同一目录下。然后在旧的源代码目录下执行:

1
$ uupdate ../gmlive-0.21.2.tar.bz2

一切 ok 后,cd 到新的源代码目录,再按上一节的方法生成新的 deb 包。

好了,本文到此为止,希望您已经打出自己第一个 deb 包了。您可以把您的成果和别人分享,如果您希望您打的包能进入官方软件仓库,那么您还有许多工作需要做,你会发现这样的包还远没有达到合格的标准。关于打包更详尽的细节,请您参考 debian 新维护员指南,那里可以给你全面的指导。你可以通过

1
# apt-get install maint-guide-zh

命令来安装这个指南。如您所料,您将会在 /usr/share/doc/ 目录下找到它。祝您打包愉快!