简易rpm套件的制作

Author: 云飞扬 Date: 2001年 18期

?牐犜谑褂肔inux的过程中可能可能需要安装新的软件,升级已安装的软件或删除已安装的软件,这就或多或少要用到rpm。
  ?牐爎pm是Redhat公司开发的一种源代码和二进制代码封装的方式。这种封装的方式能让用户轻松地进行软件包的管理,包括软件包的安装、升级、删除、查询等。由于采用rpm方式安装软件包无论是从二进制和源代码方面来讲,都比用.tar.gz的方式要简单得多。故采用rpm安装软件成了Linux下安装软件的一个标准。对于有志于在Linux下编程的程序员来说,掌握简易rpm套件的制作方法,对于推广自己的程序非常有用。
  ?牐爎pm套件的制作大致可分为以下几步:
  ?牐?1.取得.tar.gz格式的软件源程序和补丁文件。
  ?牐?2.制作rpm套件的spec规格文件。
  ?牐?3.执行rpm -ba 产生并测试rpm套件。
  ?牐犝霭皉pm套件的重心就在于如何定义完整的rpm套件规格文件(specification)以及包装后的测试工作。制作rpm套件之前,必须先了解整个系统文件的目录结构与运行。因为某些rpm套件的制作会常常牵扯到系统运行的问题,比如安装了某种新的shell,就必须在/etc/shells中加入该shell的可执行文件路径和名称,才能正确使用该shell。为了免除这个顾虑,可以先从无关系统运行的应用软件做起,等对Linux系统相当熟悉了,再尝试涉及系统运行的rpm套件制作。
  ?牐爎pm的spec就如同编译程序时的Makefile,定义制作rpm包的所有文件信息及制作流程,其主要工作是将源程序解压缩,为源程序打补丁,编译源程序,包装二进制码rpm包,包装源代码rpm包,清除包装过程在Build目录产生的临时目录。
  ?牐犓街梢怨ビ瘛6嗫纯此艘丫嗪玫膕pec文件,是学习spec文件编写的捷径,可以用以下命令将spec文件取出。
  ?牐?$:rpm -qlp *.src.rpm
  ?牐?$:rpm2cpio  *.src.rpm|cpio -ivh *.spec
  ?牐犑紫戎葱衦pm -qlp查询,得知该套件中有几个.spec文件,再执行rpm2cpio将rpm文件转换成cpio文件格式,并将转换结果输出给cpio程序,把source rpm套件中的sepc文件解压取出。
  ?牐牬蚩桓鰏pec文件,可以发现它可以分为以下几个段:%define、%description、%prep、%build、%install、%clean、%files、%changelog。
  ?牐?%define段主要用来做一些全局定义,如:版本号:Version;简单的概要:Summary;程序的名称:Name;版权:Copyright;软件所属的组:Group;Source名称是最重要的位置,这里定义Source的来源(一些tar.gz文件和一些补丁文件,若该软件的Source不仅只有一个文件,可以指定多重源程序只需要将“Source”和“Patch”标签编号依次指定即可),用户必须把该文件放在/usr/src/redhat/SOURCES目录下,rpm才可以进行包装工作;icon指名该套件的图标,必须是一个gif文件,且位于/usr/src/redhat/source目录下;常常在安装某些软件是会出现某些依赖关系信息,告诉用户必须先安装某些套件才能安装这个rpm套件的情况,需要制作这种功能的rpm套件,就是依赖“Requires”这个标签, Requires共有<、>、<=、 =、 >=这五种。若某软件同时需要用到三四个函数库,则Requires标签就必须定义三四行。或用逗号隔开写成一行,如:Requires:kdesupport。当然,%define段的标签还有几个,不过不常用,这里就不再多说了。
  ?牐?%description段较为简单,主要是对该软件的一个简要的介绍。
  ?牐?%prep 段是spec的准备段,该段主要执行包装rpm包的准备工作,检查标签语法是否正确,检查/usr/src/redhat/SOURCES目录是否存放源程序及补丁文件,删除旧的软件源程序,并替程序做untar、patch等工作。当然,这些工作可以写一些shell script来进行指定的工作,但是如果真的写shell script来进行这些准备工作,可能会令人苦恼。于是rpm开发人员为用户提供了%setup和%patch这两个命令来替用户处理这些繁杂的准备工作。
  ?牐?%setup  不加任何选项,仅将软件包打开。
  ?牐?%setup -n newdir  将软件包解压在newdir目录。
  ?牐?%setup  -c  解压缩之前先产生目录。
  ?牐?%setup -b num  将第num个source文件解压缩。
  ?牐?%setup -T  不使用default的解压缩操作。
  ?牐?%setup -T -b 0  将第0个源代码文件解压缩。
  ?牐?%setup -c -n newdir  指定目录名称newdir,并在此目录产生rpm套件。
  ?牐?%patch  最简单的补丁方式,自动指定patch level。
  ?牐?%patch 0  使用第0个补丁文件,相当于%patch -p 0。
  ?牐?%patch -s  不显示打补丁时的信息。
  ?牐?%patch -T  将所有打补丁时产生的输出文件删除。
  ?牐?%build  段主要是用来完成程序的编译,通常情况下是一个make命令用来完成编译。
  ?牐?%install  这个段较为复杂,该段主要执行安装的工作,在这里你可以写一些脚本将程序加入菜单栏中,由于各个发行版不同,各个脚本也不通用,最简单的就是执行make install来完成程序的安装(视不同程序的安装而定)。
  ?牐?%clean段是spec的删除段,它是使用rm -f命令删除编译时的临时目录,一般用rm -rf $RPM_BUILD_ROOT即可。
  ?牐?%files、%changelog段分别用来告诉用户软件安装的地方和软件的一些更新的日志等。
  ?牐犠鐾暾庑┖螅桓鰏pec文件就完成了,执行rpm -ba 产生并测试rpm套件,如果没出什么错的话,就会产生相应的二进制rpm包和源代码的srpm包。它们分别位于/usr/src/Redhat/RPMS和/usr/src/Redhat/SRPMS目录下(注:我使用的是Redhat 7.0不同的发行版本路径有差别)。