本页面简单介绍如何打包DEB包,相关细节以官方文档为准
deb包的构建的命令为:
dpkg-buildpackage
这样会自动完成所有从源代码包构建二进制包的工作,包括以下几个步骤:
0、清理源代码树(debian/rules clean)
1、构建源代码包(dpkg-source -b)
2、构建程序(debian/rules build)
3、构建二进制包(fakeroot debian/rules binary)
4、使用 gpg 签署 .dsc 文件
5、使用 dpkg-genchanges 和 gpg 创建并签署上传用的 .changes 文件
其中0~3这四步中,其实都是调用的dh命令,
第一步执行的其实是:dh clean ;若是想修改默认的clean项的时候,那么可以使用如下语句写入到rules文件中进行重写clean动作内容:
override_dh_auto_clean:
rm -rf build-deb build-udeb
第三步执行的其实是:dh build ;当然和第一步中的clean一样,也是可以通过override_dh_auto_configure、override_dh_auto_build等类似于第一步中的动作进行重写的;
如:
override_dh_auto_configure:
dh_auto_configure -Bbuild-deb -- $(confflags)
dh_auto_configure -Bbuild-udeb -- $(confflags_udeb)
override_dh_auto_build:
# Debian's /var/log/btmp has inappropriate permissions.
perl -pi -e 's,.*#define USE_BTMP .*,/* #undef USE_BTMP */,' build-deb/config.h
perl -pi -e 's,.*#define USE_BTMP .*,/* #undef USE_BTMP */,' build-udeb/config.h
第四步执行的其实是:dh binary; 此步骤会用到各种dh_*的命令,主要包括以下命令:
dh_testroot
dh_prep
dh_installdirs
dh_install
dh_installdocs
dh_installchangelogs
dh_installexamples
dh_installman
dh_installcatalogs
dh_installcron
dh_installdebconf
dh_installemacsen
dh_installifupdown
dh_installinfo
dh_pysupport
dh_installinit
dh_installmenu
dh_installmime
dh_installmodules
dh_installlogcheck
dh_installlogrotate
dh_installpam
dh_installppp
dh_installudev
dh_installwm
dh_installxfonts
dh_installgsettings
dh_bugfiles
dh_ucf
dh_lintian
dh_gconf
dh_icons
dh_perl
dh_usrlocal
dh_link
dh_compress
dh_fixperms
dh_installdeb
dh_md5sums
dh_gencontrol
dh_builddeb
以上的命令都是可以使用 override_dh_auto_$(strstr("dh_*", "*")):
action…………………………
以上的*是dh_后对应的名称;
当然还会用到强大的安装命令:
install
以上的dh_install*的命令其实是将/debian/deb包名/下的对应的系统中的目录路径的相同的路径名下的东东安装到系统对应的目录下,例如:有一个包名为:openssh-client的包,那么在debian目录下应该就存在一个这样的目录:debian/openssh-client/usr/share/man/pl/man*/, dh_installman是将debian/openssh-client/usr/share/man/pl/man*/目录下的man时的对应帮助文件安装到系统的/usr/share/man/pl/man*/目录下, 其它命令的安装路径请参看命令的帮助信息;
.
相关文档
dsc源码包格式
新格式的优点
1.支持 bzip2、lzma (估计就是 7z 格式)、gzip 压缩格式
2.支持多个上游 tarballs
3.支持包含二进制文件,旧格式使用 diff 文件(diff.gz)来存储打包过程中对源代码的改变,而 diff 文件是处理文本文件的,所以如果想添加一个二进制文件(比如 png 图标),就需要使用 uuencode 把二进制文件转换为文本文件,比较麻烦
4.不需要因为 strip debian 目录而重新打包上游 tarball(debian 目录在 deb 源代码包解压缩的时候自动被.debian.tar.{gz,bz2,lzma}里面的设为首页内容取代)
5.Debian-specific 的改变现在不是保存在单一的 .diff.gz 文件里面而是保存在 debian/patches/ 下的多个 patch 文件里。这种处理方式和 quilt 的处理方式兼容但不需要使用 quilt,因为 dpkg-source 可以处理所有的事情,它在解压缩过程中使用 patch 文件,在构建二进制包的过程中更新 patch series
6.NMU workflow is now really: unpack, hack, rebuild (for all 3.0 (quilt) packages).
新格式的种类
Format:1.0 Format:2.0 Format:3.0 (native) Format:3.0 (quilt) Format:3.0 (git) Format:3.0 (bzr)
- Format:1.0 格式介绍
这个是原来的格式:一个 .dsc 文件,一个 .orig.tar.gz 文件,一个 .diff.gz 文件
- Format:2.0 格式介绍
这个格式不建议广泛使用,是个过渡格式
- Format:3.0 (native) 格式介绍
这个格式是 Format:1.0 的扩展,可以支持多种压缩方式{gz,bz2,lzma}
- Format:3.0 (quilt) 格式介绍
这个格式可能被 debian 的下一个版本采用,它是 Format:2.0 的扩展,因为它补丁的处理方式和 quilt 兼容,所以如此命名
源代码包的组成:
1.一个 .orig.tar.{gz,bz2,lzma}压缩包,这个包是上游源代码更名后得到的
2.一个 .debian.tar.{gz,bz2,lzma}压缩包,这个包包含了 debian 化的所有更改
3.零个或者多个 .orig-.tar.{gz,bz2,lzma},比如:.orig-hello.tar. {gz,bz2,lzma} 或 .orig-world.tar.{gz,bz2,lzma}。这是为了支持多个上游 tarball
4.一个 .dsc 文件
源代码包的解压缩:
1.orig 包首先解压缩,产生一个目录,比如:helloworld_0.1.1.orig.tar.gz 就会生成 helloworld-0.1.1 这个包含上游源代码的目录
2.所有 orig- 解压缩,产生一个目录,比如:helloworld_0.1.1.orig-toy.tar.gz 就会生成 helloworld-0.1.1/toy/ 目录,这个目录包含 helloworld_0.1.1.orig-toy.tar.gz 里面所有的内容,原来存在的 helloworld-0.1.1/toy/ 将被取代.
3.debian 包解压缩,生成 debian 目录,比如:helloworld_0.1.1.debian.tar.gz 就会生成 helloworld-0.1.1/debian/ 目录,原来存在的这个目录在这个过程中将被删除….注意:debian.tar.{gz,bz2,lzma}里面必须包含一个 debian 目录,它也可以包含二进制文件。
4.应用补丁:文件 debian/patches/debian.series 或者 debian/patches/series 里面罗列的补丁。补丁必须是 patch -p1 的。补丁也可以删除文件。如果在解压缩过程中应用了某些补丁,那么 debian/patch/.dpkg-source-applied 文件会记录它们。
5.和 quilt 的默认相似,这里使用补丁也可以删除文件
源代码包的构建:
1.更新 debian-changes- 补丁:当前目录中所有的源代码包 (orig 包,component 包) 都会解压缩到一个临时目录中,然后 debian 目录也拷贝到这个临时目录最后打上除 debian-changes- 补丁外的所有补丁,比较临时目录和源代码所得补丁(如果不同),会保存为 debian/patches/ 补丁文件,任何二进制文件的变化都不会出现在 diff 中,否则会导致构建失败,除非维护人员决定在 debian 包中包含二进制文件 (相对于源代码目录,在 debian/source/include-binaries 中列出添加或更改的二进制文件的文件名) 如果发现 debian 子目录中有二进制文件,构建也会失败,除非文件名已经在 debian/source/include-binaries 中列出。
2.更新 debian.tar.{gz,bz2,lzma}:通过更新的 debian 目录和更改过的二进制文件 (列出的) 会重新生成 debian 包
注意:自动生成的 diff 不包含 VCS 描述文件和许多临时文件 (参照 -i 选项) 的变化,例如:quilt 使用的 .pc 目录在生成自动补丁时就会被忽略。
- Format:3.0 (git)
这个源代码格式是实验性质的,也许会在 debian 的下下或者下下下个版本采用,也许永远不会采用……这是源代码包和版本控制系统 (git) 的结合,具体细节请:man dpkg-source。
- Format:3.0 (bzr)
这个源代码格式是实验性质的,也许会在 debian 的下下或者下下下个版本采用,也许永远不会采用………这是源代码包和版本控制系统 (bzr) 的结合,具体细节请:man dpkg-source。
DEB打包
准备编译环境
在开始之前,建议你把如下软件包安装到系统中
sudo apt-get install build-essential debhelper make autoconf automake patch dpkg-dev
如果需要更多的功能,请把这些也安装上
sudo apt-get install fakeroot pbuilder gnupg
相应的软件包功能简介
gcc GNU C语言编译器 g++ GNU C++语言编译器 make GNU自动化构建工具 autoconf 和 automake 很多新的程序在这一类工具的帮助下来配置脚本文件并对Makefiles进行预处理。(参考“info autoconf”和“info automake”) dpkg-dev 这个软件包包括了在解开、制作、上传Debian源文件包时需要用到的工具 diff/patch 源码补丁制作与补丁管理工具 fakeroot 模拟变成root用户,这在创建软件包的过程的一些部分是必要的 pbuilder 这个软件包中包含了用于创建和维护chroot环境的程序。在此chroot环境中构建Debian可以检查构建软件包的依赖关系的正确性并防止FTBFS错误发生。 libc6-dev gnupg
首次 "Debian"
所谓的“Debian化”是指:当我们获取上游社区发布的软件包后,需要对软件包里面的内容进行调整,以适应deb打包的需要,所幸的是现在这个工作不需要过多的手动操作,我们可以使用 dh-make 这个工具可以很简单地帮助您作“Debian化”。
我们以GNU官方的tar-1.2.6.tar.gz为例子来演示如何使用dh-make “Debian化”一个上游源码包,获取源码:
wget http://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2
将源码解后进入源码目录,执行命令:
tar -xvpf tar-1.26.tar.bz2 cd tar-1.26 dh_make -e regulus_cn@163.com -f ../tar-1.26.tar.bz2 ...
debian/rules示例
rules文件本质上是一个Makefile文件,这个Makefile文件定义了创建deb格式软件包的规则。打包工具按照rules文件指定的规则,完成编译,将软件安装到临时安装目录,清理编译目录等操作,并依据安装到临时目录的文件来生成deb格式的软件包。
rules文件一般会包含,”binary-arch”, ”binary-indep”,”binary”,”build”, ”clean”, ”install”, 等targets。
debian/rules 示例:
#!/usr/bin/make -f binary:build install dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary-indep: binary binary-arch: binary build: ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --localstatedir=/var make -j16 install: dh_auto_install clean: dh_auto_clean rm -rf debian/xorg .PHONY: build clean binary-indep binary-arch binary install
dh命令简要解析
dh是debhelper包中的命令序列,dh开头的命令主要用于简化rules文件的编写,把一些通用的重复的操作用perl命令来代替。
下面是一些dh命令和实际对应执行的操作的简要介绍
dh_auto_clean make distclean dh_auto_configure ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var ... dh_auto_build make dh_auto_test make test dh_auto_install make install DESTDIR=/path/to/package_version-revision/debian/package
以上的targets 如果需要 fakeroot 操作,则需要加上dh_testroot,下面还有一些功能性的操作
dh_makeshlibs dh_shlibdeps 自动生成软件包的依赖关系 dh_installdeb
deb包的执行脚本
许多软件安装前或安装后都需要进行一些设置工作,deb格式的软件安装过程执行的操作是由如下脚本来控制的
debian/preinst 安装前执行脚本 debian/postinst 安装后执行脚本 debian/prerm 卸载前执行脚本 debian/postrm 卸载后执行脚本
debian/preinst
#!/bin/sh if [ "$1" = "upgrade" ] || [ "$1" = "install" ];then 需要执行的脚本 fi
debian/postinst
#!/bin/sh set -e if [ "$1" = "configure" ]; then ldconfig fi
debian/prerm
if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then 需要执行的脚本 fi
debian/postrm
#!/bin/sh if [ "$1" = "purge" ] ; then 需要执行的脚本 fi