制作篇(上)
要想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec,这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM就可以制作出相应的包裹文件来。
下面以我制作小赵编辑器LZE的软件包(lze-6.0-2.i386.rpm)为例,详细说明一下软件包描述文件的书写。其描述文件为lze-6.0-2.spec,该文件内容如下:(用nl -ba命令列出,每行开头的数字为所在行在文件中的行号)
该描述文件包括以下几方面的内容:
一、注释行
见第1-4行。
它以#号开头,起注解作用,可帮助用户理解所写的内容,但对软件包的生成不起任何作用。此文件中,注释行集中在文件首部。实际上,它可位于描述文件的任何位置。
二、文件头
见第6-17行。
文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。一个域占用一行,其描述格式为:
域名 : 域值
注意: 域名不分大小写,并且域值不能为空。
文件头必选域有以下六个:
1. Name :
此域定义软件名。
2. Version :
此域定义版本号。仅当软件较以前有较大改变时才增加版本号。注: 版本号中不能含减号(-)字符。
3. Release :
此域定义释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。注: 释出号中亦不能含减号(-)字符。
RPM利用上述的Name(软件名),Version(版本号),Release(释出号)及体系号来命名软件包,如本例输出的包裹文件名为lze-6.0-2.i386.rpm。
4. Summary :
此域定义软件包简介,为一句话说明。
5. Group :
此域定义软件所属类别,详见<<精通RPM之五--查询篇>>,本例的Applications/Editors表示本软件属"应用/编辑器"类。
6. License :
此域定义软件适用的许可证或版权规则。该域也可用Copyright(版权)来定义,二者同意。许可证具体有: GPL(通用公共许可证,自由软件适用),BSD,MIT,Public Domain(公共域),Distributable(贡献),Commercial(商业),Share(共享)等。
文件头可选的域包括如下几类:
1. 基本信息
1.1 Vendor :
此域定义软件的供应商(销售商)。
1.2 Distribution :
此域定义软件所属的发行版,这是软件包制作者自己的分类。通常,一个发行版由若干个软件包构成。如我想做一个名为“熊猫'95”的发行版,则其中每个软件包(如竹叶95)的描述文件都应有这么一行:
Distribution : 熊猫'95
1.3 Icon :
此域指定软件包所用的图标文件名。此文件为GIF或XPM格式,必须存放在RPM的%_sourcedir(源码目录)宏所指示目录下,默认为/usr/src/dist/SOURCES。RPM本身并不使用图标,但它将图标文件内容存贮到包裹文件中,安装时亦存贮到RPM数据库中。此图标可被图形界面的RPM包管理工具使用,用以改善界面效果,增加可视性。如下例指示软件包使用panda.xpm作为图标:
Icon : panda.xpm
1.4 Packager :
此域定义打包者,亦即建立此软件包的人或公司。书写格式是:
打包者的名字 <电子信箱或相关网页>
请参考描述文件第13行。
1.5 Serial :
此域定义软件序列号,也可使用域名Epoch。软件序列号为一整数,由打包者指定,它应随着版本号的增加而不断增加,并且始终保持数值的唯一。软件序列号可被用来说明软件包之间的依赖关系。下例指定软件包序列号为4:
Serial : 4
或用:
Epoch : 4
1.6 URL :
此域定义包含打包软件有关信息的网页地址。如:
URL : http://devplanet.fastethernet.net/gxedit.html
2. 依赖相关
依赖是RPM用来描述软件包之间关系的。一个软件包依赖的东西RPM称作功能,它可以是真实存在的软件包,也可以是虚拟的软件包(虚包)。虚包没有版本号。
依赖相关的域有:
2.1 Provides :
此域定义软件包提供的功能,可重复多行。其描述格式为:
注: []所括为可选项,多个功能之间以逗号或空格分隔。
软件包所提供的功能一般是以虚包形式存在的共享库。当有多个软件包均提供相同的服务时,常用虚包来表示其服务。如,一个邮件客户端软件允许用户使用不同的看信方式(文本形式,HTML形式等),可以要求任何一个看信程序必须提供mail-reader虚包。这样,看信程序的描述文件应有这么一行:
Provides : mail-reader
如此它才能被邮件客户端使用。
2.2 Requires :
此域定义软件包所需的功能,可重复多行。其描述格式为:
其中: * []所括为可选项;
* 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于);
* 序列号不选时,RPM默认为0;
* 功能之间的逗号可选,也可使用空格进行分隔。
例子:Requires: aaa, bbb >= 3.0, ccc < 2:5.0-1
注: 本例定义生成的包在安装时需要系统有如下功能:
(1) aaa(系统中已安装aaa包,或者已安装软件包中有软件包提供aaa虚包);
(2) bbb包已安装且版本要求大于等于3.0;
(3) ccc包已安装且版本要求小于序列号为2,版本号为5.0且释出号为1。
RPM在进行版本比较时,执行比较的顺序是; 先版本号,再释出号,最后比较序列号。通过比较,确定哪个版本较新,哪个版本较老。
2.3 Conflicts :
此域定义有哪些功能与本软件包相冲突(不能共存)。此域亦可在描述文件中书写多次。其描述格式形同Requires域,为:
要想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec,这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM就可以制作出相应的包裹文件来。
下面以我制作小赵编辑器LZE的软件包(lze-6.0-2.i386.rpm)为例,详细说明一下软件包描述文件的书写。其描述文件为lze-6.0-2.spec,该文件内容如下:(用nl -ba命令列出,每行开头的数字为所在行在文件中的行号)
1 # 文件名称: lze-6.0-2.spec 2 # 文件功能: lze软件包描述信息 3 # 文件作者: 纵横软件制作中心雨亦奇 国防大学研究生二队赵建利 4 # 修改时间: 2001.10.19 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小赵全屏幕中英文多窗口多功能编辑器(LINUX/UNIX系统适用) 10 Group: Applications/Editors 11 License: Share 12 Vendor: 纵横软件制作中心 13 Packager: 雨亦奇([email protected]) 14 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz 15 Prefix: /usr 16 Requires: /bin/sh 17 Provides: lze-edit 18 19 %description 20 小赵编辑器,是为使用SCO UNIX,LINUX多用户系统的广大用户专门设计的全屏幕多窗 21 口中英文多功能编辑器。 22 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十 23 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特 24 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎 25 添翼。10.即时翻译,按到即译。 26 总之,小赵编辑器会成为您在UNIX,LINUX系统上编制程序和书写一般性文稿的好帮手。 27 它将在工作中助您一臂之力,轻松上阵,游刃有余! 28 29 %prep 30 echo "预处理脚本程序(prep)开始执行" 31 %setup 32 33 %build 34 echo "编译连接脚本程序(build)开始执行" 35 make 36 37 %install 38 echo "安装脚本程序(install)开始执行" 39 make install 40 41 %clean 42 echo "建包结束后清理脚本程序(clean)开始执行" 43 44 %pre 45 echo "安装前执行脚本程序(pre)开始执行" 46 47 %post 48 echo "安装后执行脚本程序(post)开始执行" 49 50 %preun 51 echo "卸载前执行脚本程序(preun)开始执行" 52 53 %postun 54 echo "卸载后执行脚本程序(postun)开始执行" 55 56 %veryfiscript 57 echo "软件包校验脚本程序(verifyscript)开始执行" 58 59 %triggerin -- xiuwu 60 echo "软件包安装时触发脚本程序(triggerin)开始执行" 61 62 %triggerun -- yuntaishan < 2.0 63 echo "软件包卸载前触发脚本程序(triggerun)开始执行" 64 65 %triggerpostun -- dapubu 66 echo "软件包卸载后触发脚本程序(triggerpostun)开始执行" 67 68 %files 69 %defattr (-,root,root) 70 %config /etc/funkey.def 71 %config /etc/inputme.def 72 %doc /usr/doc/lze-6.0/README 73 %doc /usr/doc/lze-6.0/LICENSE 74 /usr/bin/lze 75 /usr/bin/lzeime.py 76 /usr/bin/lzeime.wb 77 /etc/wbzc.dat 78 79 %changelog 80 * Tue Aug 18 1998 雨亦奇 81 - 内置拼音,五笔输入法 82 * Fri May 01 1998 雨亦奇 83 - 增加多窗口操作 84 * Mon Mar 24 1997 雨亦奇 85 - 增加块操作命令 86 |
该描述文件包括以下几方面的内容:
一、注释行
见第1-4行。
它以#号开头,起注解作用,可帮助用户理解所写的内容,但对软件包的生成不起任何作用。此文件中,注释行集中在文件首部。实际上,它可位于描述文件的任何位置。
二、文件头
见第6-17行。
文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。一个域占用一行,其描述格式为:
域名 : 域值
注意: 域名不分大小写,并且域值不能为空。
文件头必选域有以下六个:
1. Name :
此域定义软件名。
2. Version :
此域定义版本号。仅当软件较以前有较大改变时才增加版本号。注: 版本号中不能含减号(-)字符。
3. Release :
此域定义释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。注: 释出号中亦不能含减号(-)字符。
RPM利用上述的Name(软件名),Version(版本号),Release(释出号)及体系号来命名软件包,如本例输出的包裹文件名为lze-6.0-2.i386.rpm。
4. Summary :
此域定义软件包简介,为一句话说明。
5. Group :
此域定义软件所属类别,详见<<精通RPM之五--查询篇>>,本例的Applications/Editors表示本软件属"应用/编辑器"类。
6. License :
此域定义软件适用的许可证或版权规则。该域也可用Copyright(版权)来定义,二者同意。许可证具体有: GPL(通用公共许可证,自由软件适用),BSD,MIT,Public Domain(公共域),Distributable(贡献),Commercial(商业),Share(共享)等。
文件头可选的域包括如下几类:
1. 基本信息
1.1 Vendor :
此域定义软件的供应商(销售商)。
1.2 Distribution :
此域定义软件所属的发行版,这是软件包制作者自己的分类。通常,一个发行版由若干个软件包构成。如我想做一个名为“熊猫'95”的发行版,则其中每个软件包(如竹叶95)的描述文件都应有这么一行:
Distribution : 熊猫'95
1.3 Icon :
此域指定软件包所用的图标文件名。此文件为GIF或XPM格式,必须存放在RPM的%_sourcedir(源码目录)宏所指示目录下,默认为/usr/src/dist/SOURCES。RPM本身并不使用图标,但它将图标文件内容存贮到包裹文件中,安装时亦存贮到RPM数据库中。此图标可被图形界面的RPM包管理工具使用,用以改善界面效果,增加可视性。如下例指示软件包使用panda.xpm作为图标:
Icon : panda.xpm
1.4 Packager :
此域定义打包者,亦即建立此软件包的人或公司。书写格式是:
打包者的名字 <电子信箱或相关网页>
请参考描述文件第13行。
1.5 Serial :
此域定义软件序列号,也可使用域名Epoch。软件序列号为一整数,由打包者指定,它应随着版本号的增加而不断增加,并且始终保持数值的唯一。软件序列号可被用来说明软件包之间的依赖关系。下例指定软件包序列号为4:
Serial : 4
或用:
Epoch : 4
1.6 URL :
此域定义包含打包软件有关信息的网页地址。如:
URL : http://devplanet.fastethernet.net/gxedit.html
2. 依赖相关
依赖是RPM用来描述软件包之间关系的。一个软件包依赖的东西RPM称作功能,它可以是真实存在的软件包,也可以是虚拟的软件包(虚包)。虚包没有版本号。
依赖相关的域有:
2.1 Provides :
此域定义软件包提供的功能,可重复多行。其描述格式为:
Provides : 功能1 [,功能2] ... |
注: []所括为可选项,多个功能之间以逗号或空格分隔。
软件包所提供的功能一般是以虚包形式存在的共享库。当有多个软件包均提供相同的服务时,常用虚包来表示其服务。如,一个邮件客户端软件允许用户使用不同的看信方式(文本形式,HTML形式等),可以要求任何一个看信程序必须提供mail-reader虚包。这样,看信程序的描述文件应有这么一行:
Provides : mail-reader
如此它才能被邮件客户端使用。
2.2 Requires :
此域定义软件包所需的功能,可重复多行。其描述格式为:
Requires : 功能1 [比较符1 [序列号1:]版本号1[-释出号1]] [,功能2 [比较符2 [序列号2:]版本号2[-释出号2]]] ... |
其中: * []所括为可选项;
* 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于);
* 序列号不选时,RPM默认为0;
* 功能之间的逗号可选,也可使用空格进行分隔。
例子:Requires: aaa, bbb >= 3.0, ccc < 2:5.0-1
注: 本例定义生成的包在安装时需要系统有如下功能:
(1) aaa(系统中已安装aaa包,或者已安装软件包中有软件包提供aaa虚包);
(2) bbb包已安装且版本要求大于等于3.0;
(3) ccc包已安装且版本要求小于序列号为2,版本号为5.0且释出号为1。
RPM在进行版本比较时,执行比较的顺序是; 先版本号,再释出号,最后比较序列号。通过比较,确定哪个版本较新,哪个版本较老。
2.3 Conflicts :
此域定义有哪些功能与本软件包相冲突(不能共存)。此域亦可在描述文件中书写多次。其描述格式形同Requires域,为: