构建DEBIAN软件包

一直没有系统地看过,这个讲的很详细:
http://debian.linuxsir.org/doc/inthedebianway/debian_build_package.html

1. 声明

* 版本信息:

本文档的最新版本将张贴于: LinuxSir.Org论坛 Debian 发行版讨论区 ;

也可以从 http://debian.linuxsir.org/ 获取.
* 反馈:

所有评论, 错误报告, 其他信息以及批评, 请邮寄到 etony@tom.com ;

或在LinuxSir.Org论坛 Debian发行版讨论区 张贴.
* 版权信息:

本文档的版权(c)2006-2007 归 etony C.F.AN 所有.

转载请注明源自 http://debian.linuxsir.org/ .

2. Debian软件包介绍

在Debian中存在两种类型的软件包:

* 源代码包

源代码包, 包括一个描述源代码包的 .dsc 文件, 一个包含 gzip-tar 归档压缩格式的未经修改源码的 .orig.tar.gz 文件, 一个包含对源代码作 Debian 特有修改的 .diff.gz 文件. 可以使用 dpkg-source 打包和解压 debian 源码文档. 详见联机手册.
* 二进制包

二进制包以 .deb 扩展名来表示,这些文件通常称为DEB文件,其中包含可执行文件,文档,配置文件和版权信息及其它一些东西.可以使用 Debian 的 dpkg 工具解包(安装).但除去版权信息(和 changelog.Debian 文件)不讲,二进制包也可以是空的,这种软件包作为过渡包或关联包(也称虚拟包),它们的唯一的作用是用于满足依赖性.

在本文中我们将主要讲述 .deb 包的构建,源代码包的只会有少量舍己

软件包命名约定

Debian软件包命名遵循下列约定: <软件包名称>_<版本>-_<平台>.deb

例如

nano_1.3.10-2_i386.deb

软件包名称: nano
版本: 1.3.10
修订号: 2
平台: i386

3. .deb 文件的结构

参阅 Debian 的软件包管理系统介绍
4. 修改现有 .deb 文件

比如 nano(1.3.10) 需要满足以下依赖关系:

$ dpkg-deb -f nano_1.3.10-2_i386.deb depends //depends 为对应查询段

libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)

当系统不能满足依赖关系, 比如不能满足里来版本, 可以通过下边的方法处理, 当然这种情况下安装的nano并不一定运行正常, 这种方法可以应用于某些软件的变通安装.

$ mkdir nano //创建nano目录

$ dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN //解压控制文件

$ dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano //解压程序文件

$ vi ./nano/DEBIAN/control //修改控制信息

$ dpkg-deb -b nano nano_1.3.10-2_ill.deb //重新打包

注:

下载 .deb 包的方法

* 方法一

运行命令

$apt-get install -d packagename

$aptitude install -d packagename

将下载 .deb 文件到 //var/cache/apt/archives/ 目录

如果管理系统数据库中的对应版本不低于源上的版本将不会下载
* 方法二

运行命令:

$aptitude download packagename

将直接执行下载操作, 将 .deb 文件下载到当前目录.

5. 从当前系统构建 .deb 包

Debian软件包: dpkg-repack 可以用来重新构建已经安装到系统中的软件包为 .deb 文件. 并包含已经修改了的配置文件. 详细新息参阅:

dpkg-repack manpages

Debian GNU/Linux Anwenderhandbuch

对于某些需要修改配置后进行大面积安装的软件包, 可以是用 dpkg-repack 重新打包, 然后分发.

运行 dpkg-repack 需要 root 权限,也可以是用 fakeroot 取代 root 权限。例如:

# aptitude install dpkg-repack

$ fakeroot -u dpkg-repack nano
dpkg-deb: building package `nano' in `./nano_1.3.11-2_i386.deb'.

user@debian:~$ fakeroot -u dpkg-repack apt
dpkg-deb: building package `apt' in `./apt_0.5.22_i386.deb'.

可以使用 dpkg-deb 进行验证

$ dpkg-deb -I ./nano_1.3.11-2_i386.deb
new debian package, version 2.0.
size 256488 bytes: control archive= 2749 bytes.
12 bytes, 1 lines conffiles
857 bytes, 22 lines control
3529 bytes, 51 lines md5sums
613 bytes, 21 lines * postinst #!/bin/sh
160 bytes, 5 lines * postrm #!/bin/sh
379 bytes, 20 lines * preinst #!/bin/sh
288 bytes, 14 lines * prerm #!/bin/sh
Package: nano
Priority: important
Section: editors
Installed-Size: 1452
Maintainer: Jordi Mallach
Architecture: i386
Version: 1.3.11-2
Replaces: pico
Provides: editor
Depends: libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)
Suggests: spell
Conflicts: nano-tiny (<= 1.0.0-1), pico Conffiles: /etc/nanorc 0f0e96f9c7e5ffe2338e79c9aacb9b9f Description: free Pico clone with some new features GNU nano is a free replacement for Pico, the default Pine editor. Pine is copyrighted under a restrictive licence, that makes it unsuitable for Debian's main section. GNU nano is an effort to provide a Pico-like editor, but also includes some features that were missing in the original, such as 'search and replace', 'goto line' or internationalization support. . (Repackaged on Fri, 26 May 2006 22:17:52 +0800 by dpkg-repack.) Architecture: i386 tony@tony:~/doc/build_package$ $dpkg-deb -c ./nano_1.3.11-2_i386.deb drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./ drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./etc/ -rw-r--r-- root/root 13611 2006-04-06 06:22:03 ./etc/nanorc drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./usr/ drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./usr/share/ drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./usr/share/doc/ drwxr-xr-x root/root 0 2006-05-26 22:17:52 ./usr/share/doc/nano/ -rw-r--r-- root/root 3419 2002-07-19 09:08:58 ./usr/share/doc/nano/BUGS.gz -rw-r--r-- root/root 1847 2005-08-30 02:29:02 ./usr/share/doc/nano/AUTHORS -rw-r--r-- root/root 102030 2006-03-30 14:34:43 ./usr/share/doc/nano/changelog.gz -rw-r--r-- root/root 2338 2005-03-20 05:33:13 ./usr/share/doc/nano/README -rw-r--r-- root/root 3234 2006-03-17 01:57:28 ./usr/share/doc/nano/THANKS -rw-r--r-- root/root 2206 2005-06-08 10:28:06 ./usr/share/doc/nano/TODO -rw-r--r-- root/root 1066 2003-03-24 21:09:26 ./usr/share/doc/nano/UPGRADE ..... 6. 使用源提供的源代码构建 .deb 包 * 下载源码包 APT提供了一套简便的方法帮你获得发布版中众多程序的源代码以及创建一个.deb所需的所有文件。 首先, 在 /etc/apt/sources.list 文件中加入 deb-src 条目. 详细参阅 APT HOWTO 然后, 运行命令 # apt-get update 或 # aptitude update 就可以用下面的命令下载源码包: # apt-get source packagename 或 # aptitude source packagename 通常会下载三个文件:.orig.tar.gz,.dsc 和 .diff.gz。对于 Debian 专用的软件包,最后一个文件不会下载,第一个文件的文件名中没有“orig”项。 dpkg-source 读取 .dsc 文件信息,将源码包解包到 packagename-version 目录,下载下来的源码包中有一个 debian/ 目录,里面是创建 .deb 包所需的文件。 例如: $ apt-get source nano Reading package lists... Done Building dependency tree... Done Need to get 1199kB of source archives. Get:1 http://ftp.us.debian.org testing/main nano 1.3.11-2 (dsc) [706B] Get:2 http://ftp.us.debian.org testing/main nano 1.3.11-2 (tar) [1173kB] Get:3 http://ftp.us.debian.org testing/main nano 1.3.11-2 (diff) [25.4kB] Fetched 1199kB in 3m46s (5287B/s) ... ... dpkg-source: extracting nano in nano-1.3.11 dpkg-source: unpacking nano_1.3.11.orig.tar.gz dpkg-source: applying ./nano_1.3.11-2.diff.gz 做相应调整后, 在源代码的根目录 nano-1.3.11 下运行: # dpkg-buildpackage -rfakeroot -uc -b 将代码编译成为软件包. 想要下载的源码包自动编译成软件包,只需在命令行中加上 -b,例如: # apt-get -b source packagename 请在下载包所在的目录中运行上面的命令。 # dpkg -i file.deb apt-get的source命令与它的其它命令有所不同,普通用户权限就可以运行source命令,指定文件被下载到用户调用 apt-source package 命令时所处的目录中。 * 编译源码包所需的软件包 通常,编译源码包时要用到某些头文件和共享库,所有的源码包的管理文件 (control file) 中都有一个域 "Build-Depends:", 域中指出了编译该源码包需要哪些附加包。 如果你仅仅想检查一下编译当前包需要哪些相关软件包,可以使用 apt-cache show 命令的一个变种,它将显示软件包信息中有关 Build-Depends 的行。 $ apt-cache showsrc nano|grep Build-Depends Build-Depends: dpkg-dev (>= 1.13.9), libncurses5-dev, libncursesw5-dev, libslang2-dev, debhelper (>= 5.0.22), dpatch

APT 提供了一个简单的方法下载这些附加包,你只需运行 apt-get build-dep package, 其中 package 就是你打算编译的源码包名称。例如:

# apt-get build-dep nano
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
build-essential dpatch g++ libncursesw5-dev libslang2-dev
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 986kB of archives.
After unpacking 2806kB of additional disk space will be used.
Do you want to continue [Y/n]?

这些用于 nano 正确编译指定源码包的附加包将会被安装。注意这个命令不能用来搜索软件的源码包,你得另外运行 apt-get source 下载源码包。

7. 对现有文件打包:

* 创建工作目录

构建模拟根目录, 比如 fakeroot :

$ mkdir fakeroot

* 部署文件

在 fakeroot 下构建模拟文件系统, 将欲打包文件放置到对应目录

形如:

tony@tony:~$ tree fakeroot/
fakeroot/
|-- DEBIAN
| |-- control
| `-- preinst
`-- usr
`-- share
`-- doc
`-- securing-debian-howto.zh-cn
|-- ap-bind-chuser.zh-cn.html
|-- ap-bridge-fw.zh-cn.html
|-- ap-checklist.zh-cn.html
... ...

* 创建配置文件

在 fakeroot 下创建DEBIAN目录用于放置控制文件比如:

control preinst postinst prerm postrm 等, 只有 control 是必须的, 其他为可选.

可以在 /var/lib/dpkg/info 目录下找到这些脚本的范例

比如

tony@tony:~/fakeroot/DEBIAN$ cat control

Package: securing-debian-howto.zh-cn
Priority: extra
Section: doc
Maintainer: tony
Architecture: all
Version: 3.0
Description: Securing Debian Manual
This manual describes the security of the Debian GNU/Linux operating system and within the Debian project. It covers some of the common tasks involved in setting up a secure user and network environment, gives information on the security tools available, steps to take before and after a compromise and also describes how security is enforced in Debian by the security team. The document includes a step by step hardening guide and within the appendix there is detailed information on how to setup an intrusion detection system and a bridge firewall with Debian GNU/Linux.

tony@tony:~/fakeroot/DEBIAN$ cat preinst
#! /bin/sh

echo "."
echo "."

echo "Welcome to install Securing Debian HOWTO. "
echo "press any key to continue... "
read
exit 0

* 生成 .deb 包

在 fakeroot 目录外执行:

$ dpkg -b fakeroot securing-debian-howto-zh-cn.deb

dpkg-deb: building package `securing-debian-howto.zh-cn' in `securing-debian-howto-zh-cn.deb'.

将会在当前目录下生成 securing-debian-howto-zh-cn.deb 包
* 检查包内容

可是用以下命令检查:

$ dpkg -c securing-debian-howto-zh-cn.deb

$ dpkg -I securing-debian-howto-zh-cn.deb

8. 源代码构建

这次以 leafpad 为例, leafpad 的当前版本为 0.8.9

* 下载程序源代码

#wget http://savannah.nongnu.org/download/leafpad/leafpad-0.8.9.tar.gz

* 创建工作目录

# mkdir leafpad

#mv leafpad-0.8.9.tar.gz leafpad/

#cd leafpad

#tar zxvf leafpad-0.8.9.tar.gz

#cd leafpad-0.8.9

* 安装打包环境

运行一下命令,安装编译 leafpad 所需的环境

# apt-get install dh-make dpkg-dev g++ patch make libc6-dev fakeroot libgtk2.0-dev cdbs debhelper pkg-config gnome-pkg-tools

* Debian 初始化

# dh_make -e etony@tom.com -f ../leafpad-0.8.9.tar.gz

Type of package: single binary, multiple binary, library, kernel module or cdbs?
[s/m/l/k/b] s

Maintainer name : tony
Email-Address : etony@tom.com
Date : Sun, 28 May 2006 22:38:08 +0800
Package Name : leafpad
Version : 0.8.9
License : blank
Type of Package : Single
Hit to confirm:
Done. Please edit the files in the debian/ subdirectory now. leafpad
uses a configure script, so you probably don't have to edit the Makefiles.

* 构建配置文件

根据需求修改 debian/ 目录下的内容

修改 changelog, control,

以下为自动生成的 changelog, control 配置文件框架

/leafpad/leafpad-0.8.9/debian$ cat control
Source: leafpad
Section: unknown
Priority: optional
Maintainer: tony
Build-Depends: debhelper (>= 4.0.0), autotools-dev
Standards-Version: 3.6.2

Package: leafpad
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description:

/leafpad/leafpad-0.8.9/debian$ cat changelog
leafpad (0.8.9-1) unstable; urgency=low

* Initial release Closes: #nnnn (nnnn is the bug number of your ITP)

-- tony Sun, 28 May 2006 22:38:08 +0800

如有需要自己,根据示例文件 *.ex 生成 postinst, postrm, prerm 等脚本文件
* 构建 .deb 包

# dpkg-buildpackage -rfakeroot -uc -b

如果您已经多次运行了上边的命令, 也可以使用下边的命令快速构建临时 .deb 包:

#fakeroot debian/rules binary

将会在其上一级目录生成 leafpad_0.8.9-1_i386.deb

9. 参考文档

* Debian 新维护人员手册
* 用Open Source工具开发软件: 软件包制作


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注