Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512308
  • 博文数量: 119
  • 博客积分: 5054
  • 博客等级: 大校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-03 13:13
文章分类

全部博文(119)

文章存档

2011年(4)

2010年(115)

我的朋友

分类: LINUX

2010-04-07 11:37:50

参考

如何制作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 Liu 
Provides: 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 檔的包装

簡介

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 做例子。

  1. 先去cscope.sourceforge.net捉原始檔.tar.gz回來
  2. 解開在/home/cyril/cscope-15.1,這邊一定要用 pkgname-version這樣形式的目錄
  3. 進去cscope-15.1在source code最上層直接執行dh_make, 會創造一個目錄叫debian,然後改這裡面的資訊檔
  4. 有兩種情況, 想成為Debian的distribution開發者, 如果有configure檔可直接執行
    $ 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 
Architecture: sparc
Version: 2.4-1
Pre-Depends: libc6 (>= 2.0.105)
Provides: rgrep
Conflicts: rgrep
Description: GNU grep, egrep and fgrep.
The GNU family of grep utilities may be the "fastest grep in the west".
GNU grep is based on a fast lazy-state deterministic matcher (about
twice as fast as stock Unix egrep) hybridized with a Boyer-Moore-Gosper
search for a fixed string that eliminates impossible text from being
considered by the full regexp matcher without necessarily having to
look at every character. The result is typically many times faster
than Unix grep or egrep. (Regular expressions containing backreferencing
will run more slowly, however.)

section 與priority是debian有的定義用dselect可以看出有那些

Section: base
         admin
         doc
         libs
         editors
         devel
         x11 ......
         這個可以看debian的CD distribution裡的目錄名就知道了

Priority: Required
	  Standard
          Important
          Optional
	  Extra

以下的制作方法摘自《full circle 》第12期

制作方法主要摘自《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文件里对应的语句相同。

阅读(3107) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~