分类:
2012-12-29 20:53:46
原文地址:deb包的制作方法 作者:szufhc2006
参考
如何制作Deb包和相应的软件仓库,其实这个很简单。这里推荐使用dpkg来进行deb包的创建、编辑和制作。
首先了解一下deb包的文件结构:
deb 软件包里面的结构:它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)。在DEBIAN目录中起码具有control文件,其次还可能具有postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright (版权)、changlog (修订记录)和conffiles等。
control: 这个文件主要描述软件包的名称(Package),版本(Version)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。同时为了能将软件包进行充分的管理,可能还具有以下字段:
Section: 这个字段申明软件的类别,常见的有`utils’, `net’, `mail’, `text’, `x11′ 等;
Priority: 这个字段申明软件对于系统的重要程度,如`required’, `standard’, `optional’, `extra’ 等;
Essential: 这个字段申明是否是系统最基本的软件包(选项为yes/no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载)
Architecture:申明软件包结构,如基于`i386′, ‘amd64’,`m68k’, `sparc’, `alpha’, `powerpc’ 等;
Source: 软件包的源代码名称;
Depends: 软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;
Pre-Depends: 软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;
Recommends: 这个字段表明推荐的安装的其他软件包和库文件;
Suggests: 建议安装的其他软件包和库文件。
对于control,这里有一个完整的例子:
Package: bioinfoserv-arb Version: 2007_14_08 Section: BioInfoServ Priority: optional Depends: bioinfoserv-base-directories (>= 1.0-1), xviewg (>= 3.2p1.4), xfig (>= 1:3), libstdc++2.10-glibc2.2 Suggests: fig2ps Architecture: i386 Installed-Size: 26104 Maintainer: Mingwei LiuProvides: bioinfoserv-arb Description: The ARB software is a graphically oriented package comprising various tools for sequence database handling and data analysis. If you want to print your graphs you probably need to install the suggested fig2ps package.
preinst: 这个文件是软件安装前所要进行的工作,工作执行会依据其中脚本进行; postinst这个文件包含了软件在进行正常目录文件拷贝到系统后,所需要执行的配置工作。 prerm :软件卸载前需要执行的脚本 postrm: 软件卸载后需要执行的脚本
现在来看看如何修订一个已有的deb包软件
假 如您已经从本BioInfoServ Deb仓库中获取了bioinfoserv-base-directories_1.1-22_i386.deb。
使用命令:
dpkg -x bioinfoserv-base-directories_1.1-22_i386.deb bioinfoserv-base-directories
这样,您就可以将已经打包好的bioinfoserv-base- directories_1.1-22_i386.deb解开在bioinfoserv-base-directories目录中,此时解开的软件包在bioinfoserv-base-directories目录中就是一些文件目录和相应的文件。
使用命令:
dpkg -e bioinfoserv-base-directories_1.1-22_i386.deb bioinfoserv-base-directories/DEBIAN
此时,就可以将bioinfoserv-base-directories_1.1-22_i386.deb软件包的规则文件解开,可以看见control、postrm等包含脚本的文件,如果要修改软件的信息和安装行为,那么就打开这些文件,进行修改。修改完成,可以采用dpkg -b bioinfoserv-base-directories bioinfoserv-base-directories_1.1-22_i386.deb重新包装这个软件包。
如何从源码打包deb?这个可以参考。貌似要用代理“翻墙”才可以访问了,可恶的G*F*W。既然这样就把文章转载过来吧,并修正两个很小的错误。
deb檔要包裝前要寫一堆資訊檔才行,其中包括了 像pkgtools一樣的scripts,debian也有像Solaris裡的 postinstall preinstall postremove preremove這些scripts可以用, 其中最重要的資訊檔是一個名叫control的檔
需要的一些工具
dpkg dpkg-deb 這兩個是最基本的 |
如果想成為Debian的distribution開發者,因為他們有一些遊戲規矩, 包括source code的改版,必要文件等規則, 下面的套件會幫你,如果不想submit你的deb檔給Debian,就不用裝了
dh-make 製做必要資訊檔的sample檔案 這其實還蠻有用的 debhelper dh-make 的dependency devscripts 一些scripts fakeroot 假裝是root的工具 lintian 測試與檢查package檔的工具 |
deb必須先有source tree,站在source tree的最上面, 解開後直接用
$ dh_make |
幫你建一個叫debian的目錄及寫一堆sample後再自己改, 我用cscope 15.1 做例子。
$ dpkg-buildpackage -rfakeroot |
,會自己叫configure創造Makefile, 不然必需自己想辦法創造一個Makefile再叫 dpkg-buildpackage -rfakeroot就會自己創造出xxxx.deb。 只想自己包裝一個套件不把包裝檔送到Debian組織, 只必需把它安裝到一個假的根目錄就好
$ ./configure --prefix=~/fakeroot/usr/ ps:~/fakeroot/usr/应该写成绝对地址的形式
$ make ; make install |
在~/fakeroot下建一個叫DEBIAN的目錄, 這裡面要放套件資訊檔control與安裝移除scripts檔。
control preinst 四個shell script檔會被dpkg自動呼叫做該做的事 postinst 可以看/var/lib/dpkg/info下的範例 prerm postrm |
fakeroot就像一個假的根目錄,想放檔案到/etc/或 /usr/share/doc 下就把它放到 fakeroot/etc/ fakeroot/usr/share/doc下就好。 在fakeroot外
$ dpkg -b fakeroot cscope_15.1.0_i386.deb |
創造一個deb檔,有個命名規矩pkgname_version_cpuarch.deb。version 通常有三層level, ver.patch.sublevel。也不一定要遵守啦。 用
$ dpkg -c cscope_15.1.deb |
看有那些檔案,用
$ dpkg -i cscope_15.1.deb
ps:应该是$ dpkg -I cscope_15.1.deb |
看有那些資訊。
其中資訊檔的意義與使用格式, 兩個方法不一樣, 一般開發者只要在DEBIAN下放control與install/remove scripts就好, 要送給Debian組織的開發者比較囉唆,進debian這個目錄改一些檔, 注意debian與DEBIAN兩個目錄的意義不同。 在dh_make創造的檔中,
control 這是主要package的資訊檔 copyright 這個檔在很多商用的軟體中也會出現就是你的版權申明 changlog 就是跟上一版的差別 這兩個會放在/usr/share/doc/cscope/ rules 這是主要install script是個Makefile, 會去叫很多dh_xxx command 其中上面四個檔在Debian組織是必需要的 下面的檔案可有可無 READ.Debian 就是readme吧,有什麼跟原始程式不一樣特別為debian的事 conffiles configuration file 的所在,通常是/etc/xxx 有的軟體不用configuration file 例如 init.d debian是system V style的 initial script 放在/etc/init.d 有的軟體不用initial script,通常是deamon才需要 這些也可以用postinstall script來裝 dirs 真的要裝的目錄 docs 這是除了man page外其它的文件 這會放在/usr/share/doc/pkgname/ manpage.1 manpage.2 .....manpage.9 這是你的man page檔 我們要把manpage的source code改成cscope.1 /usr/share/man/ 其實這也不用,只要make install有裝man page 不用寫在這 doc-base 除了man page外的文件說明檔 /usr/share/doc-base/ menu debian有一套為X-window的menu install系統 在/usr/lib/menu 可以寫一些資訊讓menu系統幫user安裝 preinst 四個shell script檔會被dpkg自動呼叫做該做的事 postinst 可以看/var/lib/dpkg/info下的範例 prerm postrm |
自動建立example file 如preinst.ex, ex.doc-base.package等等,把ex拿掉並自己改完即可呼叫, dpkg-buildpackage -rfakeroot. 這會放一個假根目錄在debian/tmp
其中各檔的格式中最重要的是control這個檔, 即使是自己包裝的在DEBIAN目錄下一定要有此檔, man deb-control可以有詳細解釋
Package: grep Essential: yes Priority: required Section: base Maintainer: Wichert Akkerman |
section 與priority是debian有的定義用dselect可以看出有那些
Section: base admin doc libs editors devel x11 ...... 這個可以看debian的CD distribution裡的目錄名就知道了 Priority: Required Standard Important Optional Extra |
制作方法主要摘自《full circle 》第12期,内容略有修正。(ps:这种制作方法似乎显得不够规范,还是建议使用上面deb 檔的包装所述的制作方法)
制作一个.deb软件包的第一步通常是下载这个程序,接着编译(如有必要)并进行安装。这通常涉及到./configure,make,sudo make install.然后找出这个程序的安装路径。(用文本编辑器打开那个Makefile文件,查看里面的install部分,如果你找不到这个文件,去/usr看看)
现在是时候生成control(控制)文件。简单的说,这是.deb包的描述文件。下面是一个control文件的示例(把下面的内容粘贴到一个名为”control”的文件,不要任何扩展名):
Package:fungame Version:1.0 Section:games Priority:optional Architecture:i386 Essential:no Depends:libfungame,gamelibrary(>=1.4.0) Suggests:optionalfungame Installed-Size:1024 Maintainer:Game Maker[gamer@gamers.net] Conflicts:stupidfungamethatbreaksthisone Replaces:oldfungame Description:A short description of the program ... A long description
需要注意的有一下几点:首先,你需要在文件最后留下一空白行。这是至关重要的,如果没有…你的.deb包无法运行(ps:无法生成deb包)。ps:其实还有一点是在Description域的那个“A long description”中的每一行开头要留空白(比如要有一个空格)。
这些语句本身是简洁易懂的。Package部分指该软件包的名字。如果你的软件包名称有两个词,用一个连字符(-)把它们连起来。软件包的名称只能由小写的英文字母、数字(不管你相信不相信)以及”+”和”-”组成。Version部分显然是程序的版本。确保这里的值不包括连字符。Section部分列出了你的软件属于的类别,可能的值包括admin(管理),games(游戏),gnome,kde,mail(电子邮件),misc(杂项)<译者注:misc是miscellaneous的简称>,net(网络),sound(声音),text(文本),utils(实用工具)和web(万 维网)。Priority部分声明这个包的优先级(大部分的时候使用 optional(可选的))。Architecture是该程序可运行的CPU架构 (可能的值为i386,amd64和powerpc)<译者注:此处虽然是专有名词,但是由于 linux是大小写敏感的,所以文件内还是应该小写>。Eseential指该软件包是否是必须的(大部分的时候不是)。Depends、Recommends和Suggests都很相似。 Depends意味着要使用这个程序必须拥有的程序,Recommends指除了极特殊情况下的安装之外,大多数时候都需要的依赖关系,而 Suggests 意味可能给这个软件带来更多功能的,但是没有完全没有问题的依赖关系<译者注:同Recommands>。你可以用英文的半角逗号分开不同的依赖关系。如果两个软件中的任何一个可以工作,用竖线”|”分开它们。你也可以指定特定的版本,用在括号里用<<(小于),<=(小于或等于),=(等于),>=(大于或等于),或>>(大于)来表示。Install-Size是程序安装后的大小,按KB算。Maintainer就是你(写上你的名字,后面的方括号”[ ]“里留下你的电子邮件地址)。Conflicts表示跟这个程序冲突的软件。Replaces表明哪些软件包将被这个程序取代。最 后,Description显示你的描述。
这样你的control文件就完成了,把它保存到一个名为”/DEBIAN”的文件夹里(注意必须大写)。例如,如果你正在建立一个软件包,并且你的要打包的软件是在~/fungame/,那么你应该把你的control文件放在~/fungame/DEBIAN/下面。
现在是时候添加实际程序了。复制要打包的程序到你的工作文件夹(比如上文中的~/fungame)。比如说,如果软件fungame位于 /usr/local/fungame/,可执行文件在/usr/bin/fungame/(ps:也许没有),你的.deb文件夹是~/fungame/,那么把/usr/local/fungame/下的所有东西复制到~/fungame/usr/local/fungame/,同时复制文件夹/usr/bin/fungame/ (ps:也许没有)下的所有东西到~/fungame/usr/bin (ps:如果在/usr/bin或/usr/local/bin目录下没有fungame的可执行文件,那么你需要新建一个~/fungame/usr/bin或~/fungame/usr/local/bin目录,并在~/fungame/usr/local/fungame/下找到程序的可执行文件,把它们复制过来或建立相应的符号链接)。
你也可以建一个菜单条目(一 个.desktop文件),这里的例子位于~/fungame/usr/share/applications/fungame.desktop。
这个文 件的内容如下:
[Desktop Entry] Type=Application Version=1.0 Encoding=UTF-8 Name=Fun Game Exec=fungame Comment= Icon=/usr/local/fungame/fungame.png Terminal=false Categories=Application;Game; StartupNotify=false MimeType=
你可以忽略”Icon”那一行。(ps:但是如果能找到图标文件,建议还是写上好看一点)
现在是生成你的软件包的时候了。cd到你工作文件夹的上层目录(例如~/fungame/的上层目录)并在终端运行命令
dpkg -b [derectory] [packagename.deb]
将[derectory]替换成你的工作目录(这里是~/fungame/), [packagename.deb]替换成将要生成的软件包的名字。软件包的名字也是有规定的。正确的命名规则为: program-name_version_architeture.deb。所有的值应该与它们在control文件里对应的语句相同。