Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149361
  • 博文数量: 24
  • 博客积分: 2396
  • 博客等级: 上尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-28 18:36
文章分类

全部博文(24)

文章存档

2011年(14)

2010年(10)

分类: LINUX

2010-11-30 09:07:03

主讲人:happyaron

收集,整理: & delectate

deb 格式是 Debian 系专用安装包格式,配合 APT 软件管理系统,成为了当前在 linux 软件中非常流行的一种安装包。Debianubuntu软件安装用的都是deb

但是很多人制作deb包时,都是从rpm为 deb,或者使用dpkg -b进行转换。虽然这两种方法可以制作出来deb但是显然很粗糙,今天介绍一下正规方法:使用 debhelper 制作 deb今天用一个例子来和大家一起做个包试试看。

我们的例子是 gwrite 这个软件,软件主页 。您可以下载源码。这个源码包在Debian项目里的术语叫做 upstream tarball,也就是上游发行的代码包

源码下载完成后,我们在主目录里新建一个文件夹,例如叫packaging,然后执行如下命令:

mkdir ~/packaging

cd ~/packaging

把刚才下载的 .tar.gz 文件放到这个文件夹里。然后用命令解压这个文件

tar zxf gwrite-0.5.0.tar.gz

不要使用图形化工具解压,因为会造成权限混乱),进入解压出来的目录

cd gwrite-0.5.0

然后大家要安装几个软件包,依次介绍一下。第一个要安装的是 debhelper

sudo aptitude install debhelper

debhelper软件包里是各种脚本,可以帮助我们接下来的打包工作。下一个要安装的是 dh-make

sudo aptitude install dh-make

dh-make 包提供了我们需要用到的 dh_make 命令。这个命令用于根据上游tarball生成我们deb包模板。现在我们已经cd到解压好的程序目录,现在的文件夹路径是 ~/packaging/gwrite-0.5.0 然后我们执行这个命令:

dh_make -e First Last <> -f ../gwrite-0.5.0.tar.gz

其中First Last 是姓名,比如我是 Aron Xu<>里是你的email地址。 -f 后面是上游tarball的路径如果上面那个命令报错,请使用这个:

dh_make -e  -f ../gwrite-0.5.0.tar.gz

(../ 的意思是当前目录的上层目录下来程序会提示:

Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs?

我们输入s,表示这个源代码包只生成一个deb输入 s,按回车然后会显示一些信息,回车确认 这时候再看当前的目录,会多出一个 debian/ 文件夹上级目录里,会出现gwrite_0.5.0.orig.tar.gz 文件。

接下来下面进到 debian/ 目录第一个文件是 changelogChangelog顾名思义是说软件版本历史的。

gwrite (0.5.0-1) unstable; urgency=low

Initial release (Closes: #nnnn)

-- Aron Xu <> Wed, 17 Nov 2010 20:21:24 +0800

文件里面的姓名和邮箱,是用来识别这个包制作者的当然就是在动手的各位啦。(changelog 里没有写中文的,都是英文。不知道deb包是否允许用中文。changelog是必须得文件,没有这个文件接下来的步骤会出错。

然后compat文件,里面就一个数字,现在是7这个数字是debhelper的版本。不管它就可以

下一个文件是control文件

Source: gwrite表示源码包的名称

Section: unknown这行表示软件分类

Priority: extra代表优先级,一般可以写optional或者extra。其中optional是普通包最常用的,extra的优先级相比则还要再低一些

Maintainer: Aron Xu <>这行是软件包维护者格式为:First Last <>

Build-Depends: debhelper (>= 7)这行是编译依赖关系,也就是说要安装哪些软件包才可以编译这个程序。这个例子中debhelper是必须的。我们手里这个例子需要这些程序才能编译:Build-Depends: debhelper (>= 7), python, python-support, python-setuptools, python-distutils-extra这些也是编译基本的python程序缩必须的包。( 依赖需要自己分析)

Standards-Version: 3.8.3这行是使用的Debian Policy版本目前最新的是 3.9.1所以我们写成:Standards-Version: 3.9.1

Homepage:  这行是上游的首页地址。我们是从 下载的所以写:Homepage: 

下面是一个空行,表示Source 部分结束

Package: gwrite这是说deb包的名叫gwrite将来apt-get安装的时候,就用这个名字

Architecture: any 这是指要编译的硬件构架any代表所有构架all代表这个软件包是跨平台的,比如说同python程序文件可以在所有平台上跑我们打包的是python包,把any改成all如果打一个C程序的包,则用any

Depends: ${shlibs:Depends}, ${misc:Depends}这一行是deb包的依赖关系。${shlibs:Depends}, ${misc:Depends}是两个变了,表示debhelper自动检测依赖这个例子,我们还要添加python, python-gtk2, python-jswebkit, python-webkit, mimetex, wv。添加完的Depends是这样的:Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-gtk2, python-jswebkit, python-webkit, mimetex, wv

Kandu: dpkg-dev会检测自己的host,把那个项在编译时替换成当前的。所以写any即可

Description: 这行是简单的描述要在60个字符以内,要用英语从语言学来讲,这应该是一个名词性的成分,比如手里这个就写成: simple GTK+ HTML5 rich text editor写完的样子是:

Description: simple GTK+ HTML5 rich text editor

 这里写的是长描述。也是用英语,应该是完整的句子每行大概写70个字符,不要太多没写完可以换行每行的开头都要有一个空格,示例gWrite is a simple GTK+ HTML5 WYSIWYG editor, focusing on writing and simple text formating. It can automatically generate a table of contents based on the document structure. 每行开头都有一个半角空格这样我们control文件就写完了。

Control 文档示例

Source: gwrite

Section: editors

Priority: optional

Maintainer: Aron Xu <>

Build-Depends: cdbs, debhelper (>= 7), python, python-support, python-setuptools, python-distutils-extra

Standards-Version: 3.9.1

Homepage: 

Package: gwrite

Architecture: all

Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-gtk2, python-jswebkit, python-webkit, mimetex, wv

Description: simple GTK+ HTML5 rich text editor

gWrite is a simple GTK+ HTML5 WYSIWYG editor, focusing on writing

and simple text formating. It can automatically generate a table of

contents based on the document structure.

.

It aims to be lighter than OOWrite & OOWeb, and to be as useful as them.

下面是copyright文件 这个文件里写的是版权内容。版权的写法比较复杂,今天先按下不表。(您可以参考范本进行修改)

再看文件夹里有很多 .ex 文件。这些文件都是某些功能性的脚本通常来说,大多数包都只需要一个watch.ex图形化程序还需要menu.exwatch.exdebian监视上游新版本用的工具,不进入官方仓库的包用不上,今天不讲写法menu.ex是桌面菜单项我们要使用它,所以把他重命名为menu也就是去掉.ex后缀。默认模板

?package(gwrite):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ title="gwrite" command="/usr/bin/gwrite"

needs="X11|text|vc|wm" 这句是说这个包需要什么显示平台来运行如果是文本的程序,可以写text,图形化程序则写X11section="Applications/see-menu-manual" 这是说程序的分类。所有可以用的选项在这里找到 为例子里的程序是个编辑器,所以写:

?package(gwrite):needs="X11" section="Applications/Editors"\ title="gwrite" command="/usr/bin/gwrite"

其余的 .ex文件和.EX文件在例子里都用不上,删除。

README.Debian README.source 的用处是,如果你想就这个包做点什么说明,那么写在这里 README.Debian 是写给最终用户的README.source 是关于源代码包有什么问题如果没有什么要在里面说的,删掉。docs 文件是dh_make自动检测的上游文档列表,如果是空的,删掉。我们的例子里它就是空的,所以删了。现在要在文件夹里创建一个名为pycompat的文件里面写2就行了,这个文件没有什么变的,python包就加上它,不是python包不需要它pycompat 文件里只有一个数字:

在当前目录下创建一个文件夹: source然后在source目录下创建一个名为format的文本文件里面写一行文字:3.0 (quilt)这代表使用3.0 (quilt) 的源代码格式

最后剩下 rules 文件了。这个文件是编译deb包的主控文件它本身是一个Makefile但是不要往里乱写target90%的情况下,默认的rules就可以满足我们的要求,现在 debian/ 目录下的工作基本完成了。

我们开始尝试编译这个包。

编译的第一步,是安装所有编译依赖也就是写在 control 文件的 Build-Depends 项里的内容:debhelper python-support python-setuptool python-distutils-extra。当前的例子里是这些

sudo aptitude install debhelper python-support python-setuptool python-distutils-extra

安装完之后,先检查自己是在源代码目录里例子里也就是 gwrite-0.5.0 目录在 gwrite-0.5.0 里运行

dpkg-buildpackage -rfakeroot 不需要root,直接运行即可

如果执行成功,在父目录里就会出现 .deb .build 和 .changes 文件;如果出现错误,就要根据提示再头找原因了一个最简单deb包的制作例程,就是这样。完整地展示给大家了。

参考材料已重新翻译最新版

示例内容及下载:解包即可

完整记录 

pdf下载:

阅读(2614) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-30 10:50:31

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com