从源代码编译Debian包

Debian优秀的包管理无疑是其吸引人的一个重要原因,安装于Debian系统的所有包有着紧密的依赖关系。举个例子来说,假设你只希望安装一个叫 foo的包,这个包依赖于其它的一些库或工具,如libbaa,那么当你使用:

apt-get install foo

来安装这个包时,实际上这个过程会提示并安装foo所依赖的包libbaa。反之,如果你通过命令:
apt-get remove libbaa

来御载libbaa,毫无疑问的,apt工具会提示包foo也将被御载掉。这样,Debian的系统将始终保持着一种稳定的完整性,不存在安装但由于依赖性而不可用的软件(但可能存在安装但没有用的软件或库,但可以通过一些工具将这些包删除掉)。

显然,如果我们自行从源代码通过常规的 make/make install的方式进行安装,系统的这种完整性就会被破坏掉。虽然Debian的官方和非官方的站点提供了大量的应用软件和库,但有时我们为了在系统中使用最新版本的软件或对某些软件需要特别的配置,还是有可能需要从源码生成可执行文件。这就有必要了解一下该如何生成一个deb包,并可以通过Debian的包管理工具进行统一的管理。

从头开始制作一个debian的安装包并不容易,只有软件的开发者或对该软件有相当了解的人才能制作一个善的deb包。从最基本的原代码开始,必需对代码所依赖的编译环境,编译时库和运行时库或其它软件条件支持等非常了解和全面。如果只想学习一下过程,完全可以从Debian的镜像站点中下载Debian软件包和对应的支持文件来编译一个Debian的安装包。下面我们以编一个gaim包的过程简要说明一下如何制作一个debian的安装包并制作第三方发布镜像。

获取源代码
首先,从Debian的镜像站点下载gaim的源代码及Debian的补丁和支持文件(扩展名dsc的文件),包括:
  • gaim_1.5.0+1.5.1cvs20051015.orig.tar.gz
  • gaim_1.5.0+1.5.1cvs20051015-5.dsc
  • gaim_1.5.0+1.5.1cvs20051015-5.diff.gz
其中,第一个文件为gaim的源代码,通常是从源码开发者所提供的代码发布版本或源代码库中取得(如CVS或Subversion),本例中的gaim即是从CVS库中获取的2005年10月15日的代码版本,从版本号看,应该是1.50版本之后经过修定,但1.51版本尚未推出时的一个版本。Debian代码库中对这些源代码通常会保持其原状而不作任何修改。

第二个文件包含了一些编译过程和Debian包所需的一些信息,包括包名,版本号,生成deb包的名称(一个源码可能不只生成一个.deb的包,如gaim源码会生成gaim, gaim-dbg, gaim-dev, gaim-data几个.deb的包),作者/发布者,平台,编译环境依赖,冲突,包签名和Hash等信息。

第三个文件为Debian为了编译.deb包而对源代码所作的修定,有时还可能包括对一些功能的改进或对Bug的修改等。最主要的,这个补丁会在源代码目录中增加一个包含了如何生成Debian发布包信息的目录,目录名称debian。

从源代码编译debian包
前面已经提到,dsc扩展名的文件内包含了编译一个源码包所依赖的其它软件包,编译前,我们应该确认一下这些包否已经安装,并且版本满足要求。本例中,编译gaim所依赖的其它软件有:
bzip2, cdbs, debhelper (>= 5.0.0), libgtk2.0-dev, libxss-dev, libgnutls-dev (>= 1.0.16-5), tcl8.4-dev, tk8.4-dev, libao-dev, libaudiofile-dev, libgtkspell-dev, libltdl3-dev, libstartup-notification0-dev, xutils, libzephyr-dev, libxml2-dev, libebook1.2-dev, libedata-book1.2-dev, libcamel1.2-dev
要查看一个包是否安装,可以通过dpkg命令来查看,如查看是否安装bzip2:
redice@debian $ dpkg -l bzip2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description========================================
pn bzip2 (no description available)
上面的信息说明没有安装bzip2,通过 apt-get install bzip2 安装bzip2后,再次查看:
redice@debian $ dpkg -l bzip2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-===================-===================-======
ii bzip2 1.0.3-2 high-quality block-sorting file compressor - utilities
确认上面所有依赖的包都已经安装好后,可以开始编译gaim包了。编译过程较为简单,通过下面几条命令即可完成:
redice@debian $ dpkg-source -x gaim_1.5.0+1.5.1cvs20051015-5.dsc
redice@debian $ cd gaim-1.5.0+1.5.1cvs20051015
redice@debian $ fakeroot dpkg-buildpackage
简单说明一下,第一条命令用于将上面下载的源代码包解开到目录gaim-1.5.0+1.5.1cvs20051015中,并打上debian补丁包,然后通过debian专用的编译debian包的工具dpkg-buildpackage完成对源代码的编译工作。fakeroot是一个使普通用户可以虚拟的完成超级用户才能做的一些功能的库,如通过fakeroot普通用户可以执行mknod等功能。

编译完成后,在源代码的上级目录会生成几个deb扩展名的包,本例中会生成以下几个文件:
gaim-data_1.5.0+1.5.1cvs20051015-5_all.deb
gaim_1.5.0+1.5.1cvs20051015-5_i386.deb
gaim-dbg_1.5.0+1.5.1cvs20051015-5_i386.deb
gaim-dev_1.5.0+1.5.1cvs20051015-5_i386.deb

构建一个本地包发布库
这样构造出来的包可以通过dpkg直接安装,更好的方式是构造一个类似于非其它Debian非官方的包发布站点的库,这样可以直接通过apt-get或dselect等工具来进行统一的管理。

假设我们只需要在本地构造一套发布库,如/opt/my_packages。建立目录/opt/my_packages,将生成的所有deb扩展名的包复制到该目录,然后通过Debian工具dpkg-scanpackages来生成索引文件。
redice@debian $ mkdir -p /opt/my_packages
redice@debian $ mv *.deb /opt/my_packages
redice@debian $ dpkg-scanpackages /opt/my_packages /dev/null | gzip -f9 > /opt/my_packages/Packages.gz
以root身份更新 /etc/apt/sources.list后,即可通过 apt-get 或dselect等工具来安装刚生成的这些Debian包了。
redice@debian # echo "deb file:/opt/my_packages ./" >> /etc/apt/sources.list
redice@debian # apt-get update
redice@debian # apt-get install gaim

没有评论: