通常情况下,我们从网上下载的rpm源码包包含三种文件,patch、tar.bz2和spec文件。patch是源代码补丁文件;tar.bz2是源代码程序包;spec是控制源代码编译的脚本文件。可能我们需要的仅仅是其打上所有补丁后的源码,但如何从rpm源码包中获取其已打补丁后的源码呢?本文是我在实际操作后总结所得,可供参考。
基础知识。
可以大概了解下RPM软件包的制作和安装方法,这可以为我们后边的工作做个铺垫,知其然也知其所以然。但这部分内容在网上有N多参考资料,在此不在赘述。
推荐资料如下:
RPM包制作(上):
http://blog.chinaunix.net/space.php?uid=70565&do=blog&id=2070337
RPM包制作(下):
http://os.chinaunix.net/a2006/0309/1001/000001001601.shtml
源代码RPM包的安装:
http://familycandy.blog.51cto.com/3382942/781523
linux下源码包制作成rpm包教程:
http://www.mysqlops.com/2012/02/22/linux-rpmbuild-rpm.html
下载rpm源码包。
rpm源码包命名为:包名.src.rpm
源码包下载
从网上下载所需rpm源码包,例如,LVM2的rpm源码包是lvm2-2.02.95-10.el6.src.rpm。其中有一个基本的压缩源码包,还有36个patch。
源码包安装
执行如下命令:
rpm -ivhlvm2-2.02.95-10.el6.src.rpm
命令执行之后,会生成rpmbuild目录(本人试验时,总是在当前用户的主目录下),下边有两个文件夹SOURCES和SPECS。命令执行时可能会输出N多下面语句,但似乎没什么问题,不用管它。
warning:user mockbuild does not exist - using root
warning:group mockbuild does not exist - using root
warning:user mockbuild does not exist - using root
warning:group mockbuild does not exist - using root
执行rpm的预处理
执行如下命令,但会出错
rpmbuild-bp lvm2.spec
error:Failed build dependencies:
corosynclib-devel >= 1.2.0-1 is needed bylvm2-2.02.95-10.el6.x86_64
openaislib-devel >= 1.1.1-1 is needed bylvm2-2.02.95-10.el6.x86_64
clusterlib-devel >= 3.0.6-1 is needed bylvm2-2.02.95-10.el6.x86_64
libudev-devel is needed bylvm2-2.02.95-10.el6.x86_64
在网上查到,需要加参数–nodeps –force
#rpmbuild -bp lvm2.spec --nodeps --force
Executing(%prep):/bin/sh -e /var/tmp/rpm-tmp.QLFBab
+ umask022
+ cd/root/rpmbuild/BUILD
+ LANG=C
+ exportLANG
+ unsetDISPLAY
+ cd/root/rpmbuild/BUILD
+ rm -rfLVM2.2.02.95
+/bin/tar -xf /root/rpmbuild/SOURCES/LVM2.2.02.95.tgz
+ cdLVM2.2.02.95
+/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
命令执行很快,觉得patch好像没有打上,检查发现果然如此。不断查找资料,不断试验,偶然间发现了如下的解决方法。其实很简单,就是去掉–force,即执行命令:
rpmbuild -bp lvm2.spec –nodeps
命令输出提示如下:
Executing(%prep):/bin/sh -e /var/tmp/rpm-tmp.v5zMwH
+ umask022
+ cd/root/rpmbuild/BUILD
。。。
can-be-fixed.patch
+/usr/bin/patch -s -p1 -b --suffix .partial_activation --fuzz=0
+ exit 0
查看结果(目录为rpmbuild/BUILD/源码),patch已经达到初始的源码包上。
也可以发现,rpm打补丁的同时保留了原来的文件。