rpm补丁文件和升级包制作教程

来源:互联网 发布:飞狐 指标数据输出 编辑:程序博客网 时间:2024/06/05 18:53

1.介绍
在开始介绍之前,首先表达一个观点,一般不推荐使用root构建构建RPM包,尤其对RPM包构建不是很熟悉的用户,因为一些配置或者误操作可能会影响甚至破坏系统,造成一些不必要的损失。另外一点是使用普通用户基本可以满足构建大多数RPM包的要求。
RPM包是一种优秀的软件包安装管理系统,而RPM源码包则是RPM包系统中重要的组成部分,是其他各种RPM包母体,其他种类的RPM包都是由RPM源 码包生成的。这样当软件有升级更新时,首先需要更新的是RPM源码包,下来通过RPM源码包生成新的RPM安装包等其他包。
准备知识
制作RPM升级包需要一个完整的RPM包构建环境,如何构建RPM构建环境可以参考另一份文档(RPM包如何制作)。我个人认为RPM升级包制作分为两种情况:
1 只是对RPM包小部分的内容进行更新,比如是代码中的一个bug或者小变动。这种情况通过生成一个补丁文件附加到已存在的RPM源码包的方式就可以实现升 级操作。该升级方式操作简单,生成一个源码补丁另外在SPEC文档中添加两行针对新补丁文件的操作即完成源码更新包的操作。
2 软件有重大功能变化,即有大量的源码文件发生变化或者大的内容变化,这种情况一般处理的方式是使软件包进行一个大的版本号的升级,并把上一版源码包中所有 补丁文件和最新更新的所有内容结合到一起,重新制作出新版本的源码包。这种升级方式相对来说操作复杂一些,需要重新打包源码压缩包,需要修改SPEC文档 较多内容。

作为普通软件包的使用者最多遇到的是第一种情形,一般只会针对某个功能添加一点自己的补丁以改善软件包的特性。而第二种情况更多的软件包的开发者、维护者可能会做的大手术。

RPM源码包的组成可以分为:软件源码所有文件的归档文件(即压缩文件)、一些补丁文件(可能不存在)和SPEC文档。如果是需要对SPEC文档更新,则需要直接修改该文档(补丁文件对此是没有效果的)。

2.下面主要以上面提到的第一种情况介绍升级包的制作过程。

制作升级包
假设如下:
当前用户的RPM构建根目录是 ~/rpmbuild.
软件包名和版本号为 hellorpm-0.1

1.安装hellorpm源码包,安装程序将会把hellorpm源码包中的SPEC文档解压到~/rpmbuild/SPECS,把源码归档包和补丁文件安装到~/rpmbuild/SOURCES。
2. 获得一个干净的hellorpm源码树,该步操作将在SPEC文档的内容的控制下,从SOURCES目录下解压源码归档文件到BUILD目录,并打上所有SPEC文档中列出的补丁文件和其他一些操作。该步操作命令如下:

$rpmbuild  -bp  SPECS/hellorpm.spec

3 现在一个完整的源码工作目录以及生成,现在可以进入源码目录,修改需要的内容,并可以在此目录下使用configure和make命令进行测试,如果确认 完成源码的修改,则可以开始生成补丁文件。在开始生成补丁文件之前,为了确保补丁文件的正确,这里我推荐按如下操作生成补丁文件:
首先进入BUILD目录:

 cd  ~/rpmbuild/BUILD/

重命名当前hellorpm源码工作目录:

 mv hellorpm-0.1 hellorpm-0.1.work

按上面第2步从新生成一个干净的源码目录:

 rpmbuild -bp  ../SPECS/hellorpm.spec

重命名上步生成的源码目录:

 mv hellorpm-0.1 hellorpm-0.1.new

把在前面源码树中所做的源码的确定修改再次更新的hellorpm-0.1.new中,完成修改操作后,再次重复第二步操作生成一个干净的源码目录,并使用diff命令生成补丁文件,生成的补丁文件将存放于SOURCES目录,操作如下:

 rpmbuild -bp  ../SPECS/hellorpm.spec diff -uNr  hellorpm-0.1  hellorpm-0.1.new >../SOURCES/hellorpm-0.1-test.patch

注意,使用 diff 时运用了选项 -uNr 。 -u 以 统一格式创建补丁文件,这种格式比缺省格式更紧凑些。 -N 确保补丁文件将正确地处理已经创建或删除文件的情况。 -r 比较命令行上所给出的两个目录的所有子目录中的所有文件。

另外还要注意:只要您完全按上述来做,这些目录名是无关紧要的。 补丁文件中将有这些目录名,但我们将通知补丁程序忽略它们。

检查一下补丁文件 hellorpm-0.1.patch可以确认补丁文件内容是否正常。

到此补丁文件制作成功,接着需要修改SPEC文档加入新生成的补丁文件的内容。下面是一个已该好的hellorpm SPEC文档的模板,大家可以参考。

hellorpmp.spec文件内容

Summary: hellorpm is a test program。Name: hellorpmVersion: 0.1Release: 1                    #注意更新该代码Source0: %{name}-%{version}.tar.bz2License: GPLGroup: Development/ToolsBuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-rootPatch0:hellorpm-0.1-test.spec  #新加入行%descriptionThe hellorpm program is a test.%prep%setup -q%patch0  -p1                  #新加入行%build#./configure                make%installmake DESTDIR=$RPM_BUILD_ROOT install%files%defattr(-,root,root)/usr/local/bin/hellorpm%doc %attr(0444,root,root) /usr/local/man/man1/hellorpm.1%doc README

对于这个简单例子中,SPEC文档对于新补丁文件的改变主要是两行,也就是上面加注的两行,补丁文件序号顺序递增,且上下两处之间的数字是对应的。另一个修改是软件版本号的修改,一般修改Release后面的数值以便和老的版本区别。

现可以使用下面命令生成新的RPM源码包和二进制安装包等其他包, 新生成的源码包在~/rpmbuild/SRPMS/目录,二进制安装包和调试信息包在~/rpmbuild/RPMS。

 rpmbuild -ba  SPECS/hellorpm.spec

到此一个事例的RPM源码包的升级包制作过程全部完成。

一些特殊情况
1 如果在源码目录中一些文件增删会影响到最终生成的二进制安装包中文件的增删,那么可能需要修改SPEC文档中file字段的内容,file字段中列出的文 件声明这些文件都将作为软件包中文件存在,构建程序再构建过程会核对该出列出的文件和实际存在的文件列表,任何不符都将报错。如果你给hellorpmp 包新加了一个配置文件hellorpm.conf,而最终此文件的安装目录是/etc,那么你可以在hellorpm.spec文件中的file段添加如 下一行来声明新文件:

 %files /etc/hellorpm.conf

2 有些情况你在源码目录中添加的新文件,需要最后安装到实际系统中,对于此安装操作,你可能需要修改源码目录中的Makefile文件告诉它该如何安装此文 件,添加安装命令到SPEC文档中的install段可以达到同样的效果,但你不要忘记上面提到的更新file字段的操作。
3 对于一些需要在软件包安装到真实系统之后进行某些操作的需求,可以通过在SPEC文档post字段添加命令语句方式实现。比如你想在安装软件包后新建或者 删除一些文件,或者改变某文件的属性等等,但原则是一般可以通过Makefile实现的操作步推荐使用post脚本的方式。

注:上面介绍的补丁文件的制作不适合一种情况,即对于有二进制文件变化情况,上面介绍的方法生成的补丁文件无法完全表示其中内容的变化,关于此问题的解决,目前我推荐的办法是直接更新源码目录归档文件。

注2:此内容是对上面[注:]内容的补充,如果源码中有非文本文件的增加,可以通过在SPEC文档中添加Source的方式声明,并在下面的预处理段(pre)中正确的此声明即可。

参考文档
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/index.html 用 RPM 打包软件,第 2 部分