《2022年RPM打包教程 .pdf》由会员分享,可在线阅读,更多相关《2022年RPM打包教程 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Rpm build(RPM包的制作)要 想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec(现在大多情况下都是直接用:软件名.spec),这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM 就可以制作出相应的包裹文件来。下面以制作简易的realplayer软件包(realplayer-11.0.0-1.i386.rpm)为例,详细说明一下软件包描述文件的书写。其描述文件为realplayer.spec,该文件内容的大概框架
2、如下(spec 文件中最好都用英文,用中文是方便说明):Name:realplayer Version:11.0.0 Release:1 Summary:视频播放工具Group:Applications/Multimedia License:Shareware Vendor:HQ制作Source0:RealPlayer-11.0.0-1.tar.gz url:http:/ Requires:bash%description realplayer是一款能播放mp3、rmvb 等多种音视频格式文件的强大工具。%prep echo 预处理脚本程序(prep)开始执行%setup%build echo
3、 编译连接脚本程序(build)开始执行 make%install echo 安装脚本程序(install)开始执行 make install%clean echo 建包结束后清理脚本程序(clean)开始执行%pre echo 安装前执行脚本程序(pre)开始执行 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 12 页 -%post echo 安装后执行脚本程序(post)开始执行%preun echo 卸载前执行脚本程序(preun)开始执行%postun echo 卸载后执行脚本程序(postun)开始执行%files 打包的文件列表%changelog*Sun May
4、31 2009 小强-修改信息该描述文件包括以下几方面的内容:一、文件头文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。一个域占用一行,其描述格式为:域名 :域值注意:域名不分大小写,并且域值不能为空。文件头必选域有以下六个:1.Name:此域定义软件名。2.Version:此域定义版本号。仅当软件较以前有较大改变时才增加版本号。注:版本号中不能含减号(-)字符。3.Release:此域定义释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。注:释出号中亦不能含减号(-)字符。RPM 利用上述的Name(软件名),Version(版本号),Release(释出
5、号)及体系号来命名软件包,如本例输出的包裹文件名为realplayer-11.0.0-1.i386.rpm。4.Summary:此域定义软件包简介,为一句话说明。5.Group:此域定义软件所属类别很多,如:Amusements/Games 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 12 页 -Applications/System Development/Tools System Environment/Base User Interface/X Hardware Support 6.License:此域定义软件适用的许可证或版权规则。该域也可用Copyright(版权)
6、来定义,二者同意。许可 证 具体 有:GPL(通 用 公 共 许 可 证,自 由 软 件 适 用),BSD,MIT,Public Domain(公 共域),Distributable(贡献),Commercial(商业),Share(共享)等。文件头可选的域包括如下几类:1.基本信息1.1 Vendor:此域定义软件的供应商(销售商)。1.2 URL:此域定义包含打包软件有关信息的网页地址。如:URL:http:/ RPM 用来描述软件包之间关系的。一个软件包依赖的东西RPM 称作功能,它可以是真实存在的软件包,也可以是虚拟的软件包(虚包)。虚包没有版本号。依赖相关的域有:2.1 Provid
7、es:此域定义软件包提供的功能,可重复多行。其描述格式为:Provides:功能 1,功能 2.注:所括为可选项,多个功能之间以逗号或空格分隔。软件包所提供的功能一般是以虚包形式存在的共享库。当有多个软件包均提供相同的服务时,常用虚包来表示其服务。如,一个邮件客户端软件允许用户使用不同的看信方式(文本形式,HTML 形式等),可以要求任何一个看信程序必须提供 mail-reader虚包。这样,看信程序的描述文件应有这么一行:Provides:mail-reader 如此它才能被邮件客户端使用。2.2 Requires:此域定义软件包所需的功能,可重复多行。其描述格式为:Requires:功能
8、1 比较符 1 序列号 1:版本号 1-释出号 1,功能 2 比较符 2 序列号 2:版本号 2-释出号 2.名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 12 页 -其中:*所括为可选项;*比较符可使用(大于),=(等于),=(大于等于)或=3.0,ccc 2:5.0-1 注:本例定义生成的包在安装时需要系统有如下功能:(1)aaa(系统中已安装aaa 包,或者已安装软件包中有软件包提供aaa 虚包);(2)bbb 包已安装且版本要求大于等于3.0;(3)ccc 包已安装且版本要求小于序列号为2,版本号为5.0 且释出号为1。RPM在进行版本比较时,执行比较的顺序是;先版本号
9、,再释出号,最后比较序列号。通过比较,确定哪个版本较新,哪个版本较老。2.3 Conflicts:此域定义有哪些功能与本软件包相冲突(不能共存)。此域亦可在描述文件中书写多次。其描述格式形同Requires 域,为:Conflicts:功能 1 比较符 1 序列号 1:版本号 1-释出号 1,功能 2 比较符 2 序列号 2:版本号 2-释出号 2.其中:*所括为可选项;*比较符可使用(大于),=(等于),=(大于等于)或=3.0 注:本例阐明生成的包冲突的功能有:(1)当系统中 xxx 包版本等于序列号为1 且版本号为2.0 时;(2)当系统中yyy 包版本大于等于 3.0 时。*依赖关系的
10、自动实现*一 般情况下,当 RPM 建立一个软件包时,它要执行/usr/lib/rpm目录下的两个小程序。一个是find-requires,用于查找软件包所需的共享库,这些库将以虚包的形式加入到该软件包所需的功能(Requires)之中。另一个是find-provides,它用于查找软件包所提供的共享库,这些库将以虚包的形式加入到该软件包所提供的功能(Provides)之中。这两个程序都是SHELL程序,代码量虽小,但确实帮了软件包制作者一个大忙-不必劳心费神地自己写这样的依赖关系了,因为程序均自动完成了。下面三个域用于指示RPM 是否执行这两个程序。3.源码相关下列四个域均是为制作源码包而设
11、计的。源码包里有什么?用户可以通过查询包的文件列表得到,命令是“rpm-qpl 源码包文件”。一般情况下,源码包里有这么四类文件:一是程序源码(SOURCE),二是源码补丁(PATCH),三是软件包描述文件,四是图标文件(ICON)。通过安装源码包,用户可以轻松地实现现场编译、连接和应用,同时更方便了软件开发者与软件包制作者:他们维护程序容易了,并且维护过后可以很快地生成执行代码包与源码包。这,也是所有人钟爱 RPM 的重要原因之一。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 12 页 -3.1 Source:此域定义RPM 打包时要包含的程序源码文件。这些文件一般先用tar
12、 命令打包,然后再用gzip 压缩。一个描述文件中可包含多个Source 域,当有多个这样的域时,需要进行编号:第 1个编为 Source0(也可直接用Source),第 2 个编为Source1,第 3 个编为 Source2等等。此域的描述格式为:Source 编号 :源码文件注:所括为可选项。具体用法如:Source0:RealPlayer-11.0.0-1.tar.gz 3.2 Patch:Patch 的本义是补丁,用在这里指的是源程序的补丁,它是用diff 命令比较新老源程序所产生的输出(命令为“diff-Nur 旧文件新文件补丁文件”),而系统中的patch 命令又可利用此输出将老
13、版本的源程序升级为新版本。此 域定义 RPM 制作源码包时所要包含的补丁文件,该文件的命名建议用软件名-版本号.补丁功能.patch 的格式。一个软件包描述文件中可有多个Patch 域,当有多个这样的域时,也需要象 Source 域那样进行编号(注:第 1 个域编为Patch0,也可省略0,用 Patch)。此域的描述格式为:Patch 编号 :源码补丁文件注:所括为可选项。具体用法如:Patch0:RealPlayer-11.0.0-bugfix.patch Patch1:RealPlayer-11.0.0-config.patch Patch2:RealPlayer-11.0.0-some
14、thingelse.patch 注:此域的域值也可以象Source 域一样,采用 URL 的形式,RPM 仅提取其中的文件名供其使用。三、功能段1.%description 本段是描述段,段的内容是对软件包进行较为详细的介绍,不象文件头的Summary域仅用一句话说明。介绍的文本形式自由,可任意换行,不受限制。本段段名描述格式是:%description 子包选项 其中,子包选项的格式为:-n 子包名注:所括为可选项。2.%files 本段是文件段,它定义的是软件包需要包含哪些文件。本段通常放在描述文件尾部,以便于添加文件名,便于编辑。本段段名描述格式为:%files 子包选项 -f 文件名
15、注:所括为可选项。当没有任何选项时,本段内容定义的是父包要打包的文件列表;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 12 页 -当有子包选项时,本段内容定义的则是子包要打包的文件列表;当 选择-f 选项时,RPM 除了从文件段读取打包文件列表外,还将从指定的文件中读取要打包的文件列表。指定的文件中,一个文件名占用一行。此选项方便了软件包制作者,他们可以通过程序自动产生有关软件的文件列表,并将其写入到一个特定的文件中,这样制作软件包时,只需引用一下这个文件,RPM 就会自动从这个文件中读取文件名并将其加入包中。如果没有此选项,软件包制作者只能在文件段里,将要打包的文件名一个一
16、个写进去,有点麻烦。文件段的内容格式为:修饰符 1 修饰符 2.文件名其中:修饰符是可选的,一个文件可以有多个修饰符,文件名必须以/开头(绝对路径形式)。修饰符有以下几类:(1)文件相关*%doc:此修饰符设定文件类型为说明文档*%config:此修饰符设定文件类型为配置文件*%attr:此修饰符设定文件的属性信息,使用格式为:%attr(文件权限,属主,属组,文件夹权限)注:权限常用数字形式(八进制),属主和属组可以是数字,也可以是字符串。如果文件的权限,属主和属组想使用系统默认值,则可用减号(-)表示它。文件夹权限基本不会用到,默认权限就行。如下例采用两个修饰符,定义/etc/funkey
17、.def文件的权限为755,属主默认,属组为 root,类型为配置文件:%attr(755,-,root,-)%config/etc/funkey.def(2)目录相关*%docdir:此修饰符定义说明文档前缀,这样,后面所有含指定文件名作为前缀的文件,RPM打包时会将其类型统一设定为说明文档。例如某描述文件的文件段中有这么三行:/root/readme%docdir/root/root/mydoc.txt 此例指明/root 为说明文档的前缀,因为/root/mydoc.txt在%docdir的下一行,所以 RPM 打包时会设定此文件的类型为说明文档。而/root/readme文件则不做此设
18、定,因为它在%docdir定义之前。通过此修饰符,用户可以很方便地设定说明文档一类的文件,因为它们通常固定在某个目录下面,有着共同的前缀。%dir:RPM 在制作软件包时,如果要打包的文件是个目录,那么 RPM 会将该目录下面的所名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 12 页 -有文件包含到软件包中。(注意:如果要打包的文件是个符号连接,此符号连接又指向一个目录,则 RPM 并不会将其视作目录,只会把它当为普通文件处理。)如果仅想将这个目录名包含到软件包中,制作者用此修饰符修饰一下这个目录名就行了。如:/etc 是个系统目录,其下有多个文件,如果想将其均加入包中,描述文
19、件的文件段里可写上这么一行:/etc 如果仅想包含此目录,则可用:%dir/etc 可选的功能段可分为如下三类:1.建包用功能段:RPM通过源程序来建立一个软件包时,要执行预处理,编译,安装和清理四项操作,分别对应于%prep,%build,%install和%clean 四个段。下面按其执行顺序逐段进行说明:1.1%prep:此为预处理段,其内容为预处理脚本程序。该程序完成以下任务:*建立软件编译用目录;*将源程序解压缩;*通过打补丁,升级源程序;*执行其它一些操作,使源程序随时可进行编译。在此脚本程序中,可使用如下两个宏命令:1.1.1%setup 这个宏利用系统中的gzip 与 tar
20、等命令,来解压源程序包。RPM 会自动探测源程序包是否压缩,如果压缩,它会用 gzip 将其解压缩,否则直接用tar 命令展开包中文件。其使用格式为:%setup-n name-c-D-T-b N-a N 注:所括为可选项。(1)当没有任何选项时:这个宏用来解压默认的源程序包(由文件头Source或 Source0域指定)。注意:源程序包中的文件应用 软件名-版本号 作为其上层目录,这样%setup宏就可以正常工作。如果不以软件名-版本号 作为其上层目录,则%setup宏工作时有一个指令cd 软件名-版本号(转目录)会因为系统中没有此目录而出错退出(除非在此宏上面加上建立此目录的命令)。(2)
21、-n name:上面已经谈到,源程序包中的文件应采用软件名-版本号 作为上层目录。如果用了别的什么目录(如 name),%setup宏无法正常工作,那该怎么办?没关系,可以用-n 选项,引用一下这个目录(name)就行了。假如我的LZE 源程序包中的文件是以 lze 为上层目录,那么我就可以用%setup-n lze宏命令来解压缩该包。(3)-c:此选项的作用是创建上层目录(软件名-版本号 目录)并转到这个目录。对于LZE 软件,其效果相当于在上例的第4 行与第 5 行之间加上这么两行命令:mkdir-p lze-6.0 cd lze-6.0 名师资料总结-精品资料欢迎下载-名师精心整理-第
22、7 页,共 12 页 -它适用的情况是:有的源程序包是在源程序所在目录下打的包,所以其中的文件都没有上层目录。这样的话,要想正确解压,必须创建上层目录。(4)-D:本选项的作用是在解压源程序包之前不要删除软件的上层目录(软件名-版本号)。在上例中,其效果是不执行第4 行的命令(rm-rf lze-6.0)。(5)-T:本选项的作用是不解压默认的源程序包(由文件头的Source 或 Source0 域所定义)。在上例中,其效果是不执行第 5-9 行的命令:第 5 行是解压源程序包(用 gzip-dc 将包的内容解压缩到管道中,再由 tar-xvvf-从管道中读取数据并展开),第 6-9 行是检查
23、解压命令的返回值,非 0时执行非正常退出。(6)-b N:本选项指示RPM 在转到上层目录前解压第N 个源程序包(由文件头SourceN 域定义)。这适用于含上层目录的源程序包。注意:如果使用此选项时不同时使用-T 选项,则 RPM 解压的是两个源程序包,一个是默认的包(由 Source 或 Source0域定义),一 个是-b 选项指定的包(由SourceN 域定义)。这样,当 N 等于 0 时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T 选 项,以禁止解压默认的源程序包。下面的宏命令仅解压第1 个源程序包,然后转到上层目录:%setup-b 1-T(7)-a
24、 N:本选项指示RPM 在转到上层目录后再解压第N 个源程序包(由文件头SourceN 域定义)。这适用于不含上层目录的源程序包。使用本选项时,一般加上-c 选项,以创建上层目录并转到此目录。注意:如果使用此选项时不同时使用-T 选项,则 RPM 解压的是两个源程序包,一个是默认的包(由 Source 或 Source0域定义),一个是-a 选项指定的包(由 SourceN域定义)。这样,当 N 等于 0 时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T 选项,以禁止解压默认的源程序包。下面的宏命令让RPM 先转到上层目录,再仅解压第2 个源程序包:%setup-
25、T-a 2 1.1.2%patch 此宏利用系统中的patch 命令,来给指定的源程序包打补丁,从而将程序升级。其使用格式为:%patch-P N-p N-b name-E 注:所括为可选项。为了说明下列选项的作用,我们为 LZE 软件包描述文件中定义三个补丁文件:Patch0:realplayer-patch.zero Patch1:realplayer-patch.one Patch2:realplayer-patch.three(1)当没有任何选项时:没有任何选项时,该宏使用的是默认的补丁文件(第 0 个补丁文件),即由文件头Patch或Patch0 域所定义的文件。该宏在执行时,扩展为
26、以下指令:名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 12 页 -echo Patch#0:patch-p0-s&1|nl 2)X=l 时,指示 RPM 检查文件段(%files),看其中的文件是否存在。如果不存在,则 RPM 会报错退出。#rpmbuild-bl-vv RealPlayer.spec|nl 3)当 X=c 时,指示 RPM 依次执行预处理段(%prep),编译段(%build)的脚本程序。编译段的脚本程序用来编译连接软件的源程序,生成可执行程序,通常一个make 命令足够。因为一个有良好习惯的程序员会把Makefile(程序维护文件)写好,以便其它程序员编译
27、该软件。如果某个软件没有维护文件的话,用户要么自己写个Makefile,要么在编译段里写上软件编译与连接的各项命令。4)当 X=i 时,指示 RPM 依次执行预处理段(%prep),编译段(%build)和安装段(%install)的脚本程序。安装段的脚本程序的任务是将编译连接好的执行程序拷贝到适当的目录(如/bin,/usr/bin等公共执行目录),以便打包或执行。它通常执行的指令是make install。5)当 X=b 时,指示 RPM 依次执行预处理段(%prep),编译段(%build),安装段(%install)的脚本程序,之后根据文件段(%files)的文件列表,将文件打包,生成
28、RPM 执行程序包,最后执行清理段(%clean)。#rpmbuild-bb RealPlayer.spec 2&1|nl 从上我们可以清楚看出RPM制作软件包的工作流程:预处理段,编译段,安装段,软件包制作,清理段。6)当 X=s 时,指示 RPM 建立源码包。RPM 源码包的内容包括软件包描述文件(SPEC),软件源程序,软件补丁程序,图标文件等几项。建立源码包不需要执行软件包描述文件中的各个功能段,仅需将所需文件包含到包中即可。1.rpmbuild-bs RealPlayer.spec 注:本例中,使用 rpm-bs 命令生成了源码包realplayer-11.0.0-1.src.rpm
29、(在 RPM 标准源码目录/usr/src/dist/SRPMS下),然 后用 rpm-qplv 命令查询源码包中所含的文件信息,此文件由描述文件中的Source 域确定。7)当 X=a 时,指示 RPM 依次执行预处理段(%prep),编译段(%build),安装段(%install)脚本程序,之后先生成RPM 源码包,再根据文件段(%files)的文件列表,将文件打包,生成 RPM 执行程序包,最后执行清理段(%clean)脚本程序,清除中间文件。此 命令执行的结果相当于先执行rpm-bs 命令生成源码包,再执行 rpm-bb 命令生成执行码包。名师资料总结-精品资料欢迎下载-名师精心整理
30、-第 11 页,共 12 页 -1、编译选项:-target:设定目标平台该选项的用法为:-target 体系-平台-操作系统注:RPM制作出来的软件包默认的体系为i386,平台为pc,操作系统为linux。如果用户想加以改变,就需要使用此选项来确定一下,如下例:#rpmbuild-bb-target i686-pc-solaris realplayer.spec 本例设定生成的RPM 包适用的目标平台为:i686-pc-solaris(即体系为 i686,平台为 pc,操作系统为 solaris)。注意:必须在/usr/src/dist/RPMS目录下创建一个i686 的子目录,没有指定体系
31、的子目录,RPM 将无法生成软件包。-quiet:尽量减少信息输出此选项的目的,是让 RPM 减少信息的输出。使用此选项后,如果没有错误发生,RPM 就不会输出多余的信息,这时的 RPM 也显得比较“安静”(quiet)了。$rpmbuild-bl-quiet RealPlayer.spec$-clean:执行文件清理如果软件包描述文件的清理段(%clean)没有删除临时文件的命令,那么RPM建包结束后那些临时文件还是存在的,占用了一定的空间。如果想让RPM 自动删除那些临时文件,可以在建包时使用-clean 选项。此选项执行一条命令,即:rm-rf 软件名-版本号用它来删除软件名-版本号 目
32、录及该目录下的所有文件。这个软件名-版本号 目录,也即RPM 默认的存放解压后的源程序的目录。#rpmbuild-bl-clean RealPlayer.spec 2.重建立命令:用法为:rpm-rebuild RPM源码包 1 RPM 源码包 2.如:rpm-rebuild realplayer.src.rpm 重编译命令执行后并不建立新的RPM软件包,而此重建立命令执行后则会制作出一个新的RPM 软件包。重建立命令执行时,首先安装RPM 源码包,然后依次执行源码包内软件包描述文件的预处理段(%prep),编译段(%build),安装段(%install),清理段(%clean)的脚本程序,生成一个新的RPM 执行包,最后删除源程序包,描述文件及其它临时文件。本文来自:http:/www.linux-ren.org/modules/wiki/index.php/Rpm_build名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 12 页 -