1. 概述
有时候我们向用户提供软件时,并不希望提供源码(虽然这挺狗的...),而是只希望提供一些可执行文件。小程序还好说,可以轻易地提取有用的信息出来。
但对于一些比较庞大的程序,尤其是需要配置文件,并且需要内核的支持等条件的时候,就会因为程序内部各个文件与程序的复杂性,在搞清其中关系上花上不少的时间了。
这样就需要一个办法将其中的可执行文件提取出来并且能够保证其能够正常执行,当然,你可以将你编译源代码的目录中的代码都删掉,只留下中间产物和可执行文件,是可以的。但这里我们讨论的是如何通过制作deb软件包来达到目的。
而做成deb包还有另一个好处,就是方便软件的安装与卸载,这是源码安装的很多软件无法做到的。
2. 需要工具
完成刚才所描述的操作只需要一个工具:checkinstall,是一个将源码转化成deb或者rpm包的工具,操作也比较简单。
而完成安装包并不是最终目的地,我们有时还需要对安装包进行适当的修改,此时则需要dpkg,debian下强大的包管理工具。
有的系统可能会不提供checkinstall在线安装的,下载地址如下:http://asic-linux.com.mx/~izto/checkinstall/。但是我真没搞明白怎么用,应该是直接用的,但会报错,也没系想去深究,不要鄙视我。
我在debian上直接用apt-get装的。
==== 操作流程 ====
3. 制作包过程
我们在正常编译软件源码是通过 ./configure ; make ; make install 来完成的。
而我们要做的就是用checkinstall去替换make install这步,然后我们就会得到一个deb包了...
整个过程将像如下显示
在通过./configure && make之后,输入sudo checkinstall命令
经过很短时间的初始化之后,系统会提示你
The package documentation directory ./doc-pak does not exist. Should I create a default set of package docs? [y]:
选择y
然后会让你对包做一定的描述,以空行结尾
Please write a description for the package. End your description with an empty line or EOF. >> i am description >>
然后会提示你完成一些描述性的输入
This package will be built according to these values: 0 - Maintainer: [ [email protected] ] 1 - Summary: [ i am the summary ] 2 - Name: [ name ] 3 - Version: [ 1.0 ] 4 - Release: [ 1 ] 5 - License: [ GPL ] 6 - Group: [ checkinstall ] 7 - Architecture: [ amd64 ] 8 - Source location: [ nameofthesrc ] 9 - Alternate source location: [ ] 10 - Requires: [ ] 11 - Provides: [ command ] 12 - Conflicts: [ ] 13 - Replaces: [ ]
此处的requires可以指定所需要的包
比如,我需要libxml2-dev,pkg-config的支持,输入
10 #回车 >> libxml2-dev,pkg-config #回车
当然,你也可以在适用checkinstall命令的时候加一个参数
checkinstall --requires="libxml2-dev,pkg-config"
这里,如果你加了要求,别人在安装你的包的时候,如果没有相应的库,或者软件,程序就检查并提示,否则不会检查的,直接去安装,最后程序没法用,而且谁也不知道为什么。除非你能够提供一个说明。
如果没有这里直接回车就好了,然后就可以完成deb包的创建了。
正常情况下,此时这个deb包就可以拿去给别人装软件了,安装过程需要使用命令
sudo dpkg -i name.deb
4. 通过dpkg管理deb包
有时我们可能需要对这个deb先进行一定的处理,因为制作包的过程是通过替换make install过程完成的,可能有些东西我不想放在包里,我要把它删除。我也希望向里面添加一些其它的东西。比如是两个不同系统的程序,你希望你的系统同时拥有他们,但不希望通过多个步骤。
这个过程需要dpkg命令来实现,dpkg的一些基本功能如下所示
dpkg -i name.deb #安装软件包 dpkg -I name.deb #从包里获取deb包的信息 dpkg -i name #移出所安装的软件包,名字可以通过查看包信息得到 dpkg -c name.deb #查看包内的内容,看起来就跟压缩包一样 dpkg -s name #查看已安装的包裹信息 dpkg -r name #删除一个已安装的包裹 dpkg -P name #删除一个已安装的包裹,包括配置文件
其实就是重新组装一下目录,大概就是这个意思。
其实dpkg已经强大到无以复加的地步,如果想了解更详细的信息,请看这里
http://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.zh-cn.html
http://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.en.html
这里向说明的是dpkg的一些其他功能,解包和重新打包
dpkg -x name.deb name #得到包内的文件 dpkg -e name.deb name/DEBIAN #得到包内的控制信息 dpkg -b name name.deb #创建一个deb包