从源代码编译Debian包
时间:2006-10-23 作者:Debian思维 来源:Debian思维
从源代码编译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
阅读(2454) | 评论(0) | 转发(0) |