分类: LINUX
2007-04-30 18:35:58
构建 Debian 软件包
etony C.F.AN v0.0.1, 2006-6-29
本文档主要简单介绍几种构建 Debian 软件包的方法.
声明
本文档的最新版本将张贴于: LinuxSir.Org论坛 ;
也可以从 获取.
所有评论, 错误报告, 其他信息以及批评, 请邮寄到 ;
或在LinuxSir.Org论坛 张贴.
本文档的版权(c)2006-2007 归 etony C.F.AN 所有.
转载请注明源自 .
软件包介绍
在Debian中存在两种类型的软件包:
源代码包, 包括一个描述源代码包的 .dsc 文件, 一个包含 gzip-tar 归档压缩格式的未经修改源码的 .orig.tar.gz 文件, 一个包含对源代码作 Debian 特有修改的 .diff.gz 文件. 可以使用 dpkg-source 打包和解压 debian 源码文档. 详见联机手册.
二进制包以 .deb 扩展名来表示,这些文件通常称为DEB文件,其中包含可执行文件,文档,配置文件和版权信息及其它一些东西.可以使用 Debian 的 dpkg 工具解包(安装).但除去版权信息(和 changelog.Debian 文件)不讲,二进制包也可以是空的,这种软件包作为过渡包或关联包(也称虚拟包),它们的唯一的作用是用于满足依赖性.
在本文中我们将主要讲述 .deb 包的构建,源代码包的只会有少量舍己
软件包命名约定
Debian软件包命名遵循下列约定: <软件包名称>_<版本>-
nano_1.3.10-2_i386.deb
软件包名称: nano
版本: 1.3.10
修订号: 2
平台: i386
文件的结构
参阅
修改现有 .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 文件下载到当前目录.
从当前系统构建 .deb 包
Debian软件包: dpkg-repack 可以用来重新构建已经安装到系统中的软件包为 .deb 文件. 并包含已经修改了的配置文件. 详细新息参阅:
或
对于某些需要修改配置后进行大面积安装的软件包, 可以是用 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
.....
使用源提供的源代码构建 .deb 包
APT提供了一套简便的方法帮你获得发布版中众多程序的源代码以及创建一个.deb所需的所有文件。
首先, 在 /etc/apt/sources.list 文件中加入 deb-src 条目. 详细参阅
然后, 运行命令
# 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 testing/main nano 1.3.11-2 (dsc) [706B]
Get:2 testing/main nano 1.3.11-2 (tar) [1173kB]
Get:3 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 下载源码包。
对现有文件打包:
构建模拟根目录, 比如 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
在 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
源代码构建
这次以 leafpad 为例, leafpad 的当前版本为 0.8.9
· #wget
· # 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
· # 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
· 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
如有需要自己,根据示例文件 *.ex 生成 postinst, postrm, prerm 等脚本文件
· # dpkg-buildpackage -rfakeroot -uc -b
如果您已经多次运行了上边的命令, 也可以使用下边的命令快速构建临时 .deb 包:
#fakeroot debian/rules binary
将会在其上一级目录生成 leafpad_0.8.9-1_i386.deb
参考文档