最简单的PATCH制作方法 | |||
| |||
Author: wangxg | |||
MINI RPM PATCH HOWTO 最简单的PATCH制作方法 V 0.1 版本 目的: 您目的是希望修改了RPM源码包中的源代码后,将自己修改的代码制作成PATCH的形式编译到原RPM包中,从而方便RPM包的制作,以及保证代码的一致性和可维护性. 常规操作: 1. 在系统中建立三个目录: 1.1 源代码调式和编译目录 (定义为 “工作目录”) 1.2 修改目标代码目录 (定义为 “目标目录”) 1.3 原始源代码目录 (定义为 “源目录” ) 注释: 1.1“工作目录”即是我们直接修改和调式源代码的目录,一般情况下我们会解开 RPM源代码包,然后进行 rpmbuild ,在/usr/src/redhat/Build/目录下会产生系统 的源代码目录,建议将该目录作为工作目录. 1.2 “目标目录”是存放最终代码(修改过的源代码)的目标目录,一般我们将“工作目录”中修改好的源代码复制到该“目标目录”中,覆盖该目录中的旧文件,如果是新增的文件,则将新增文件直接复制到相应的目录结构中. 为工作方便,目标目录一般情况下在系统/usr/src/redhat/SOURCE/目录下.该目录是解压在SOURCE目录下的源代码包压缩包( 包名.tar.bz2)产生的. 注: SOURCE目录下的tar.bz2包是在安装源代码包(执行rpm -ivh )时 自动生成的. 1.3 “源目录”是制作patch时对比用的目录,方法是在SOURCE目录制作“目标目录”时复制一个目录更名为 包名.orig (后最只是用来和“目标目录” 做区分) 1.4 注意:解压tar.bz2包生成“目标目录”和“源目录”后要恢复一个 tar.bz2包,否则在执行rpmbuild时,系统会提示在SOURCE目录下找不到包名.tar.bz2文件. 2. 在“工作目录”中调式和修改源代码; 2.1 记录修改的文件名 2.2 记录新增的文件名 2.3 记录删除的文件名 注释: 2.1 这里指的修改过的文件是没有编译前存在的文件 2.2 这里新增的文件是指用户额外编写的程序代码,也可以是二进制模块 2.3 这里删除的文件是指用户手动删除的编译和调式前存在的文件 3. 当调式“工作目录”中代码无误时,将“工作目录”目录中修改过的文件,用户新增加的 文件,将“目标目录”对应于“工作目录”中用户删除的文件删除. 注意: 3.1 修改过的文件会覆盖“目标目录”相应的文件 3.2 将新增的文件拷贝到“目标目录”相应的目录结构中 3.3 删除“目标目录”中对应于“工作目录”中用户删除的文件 4. 制作PATCH文件 4.1 在SOURCE目录下用如下命令: # diff -uNr “源目录” “目标目录” > 包名.作者.日期.patch 注: a. “包名.作者.日期.patch ”是用户自己取的.作者可以根据自己的规范命名; b. patch文件一定在SOURCE目录下; 5. 修改SPECS文件 5.1 在SPECS下有包的SPEC文件,名为 “包名.SPEC” 5.2 修改该SPEC文件,这里我们举一个小型的 spec 文件为例 (vim-3.0-1.spec): ***************************************************** Summary: ejects ejectable media and controls auto ejection Name: eject Version: 1.4 Release: 3 Copyright: GPL Group: Utilities/System Source: sunsite.unc.edu:/pub/Linux/utils/disk-management/eject-1.4.tar.gz Patch: eject-1.4-make.patch Patch1: eject-1.4-jaz.patch %description This program allows the user to eject media that is autoejecting like CD-ROMs, Jaz and Zip drives, and floppy drives on SPARC machines. %prep %setup %patch -p1 %patch1 -p1 %build make RPM_OPT_FLAGS=\"$RPM_OPT_FLAGS\" %install install -s -m 755 -o 0 -g 0 eject /usr/bin/eject install -m 644 -o 0 -g 0 eject.1 /usr/man/man1 %files %doc README COPYING ChangeLog /usr/bin/eject ***************************************************** 注意:从上面示例中我们看到,修改SPEC文件只有两个地方,一是在Source后面, 二是在%setup后面. 修改方法: 1. 如果原 SPEC 文件没有PATCH,则在文件的“Source:”行后增加“Patch:”行. 将您的Patch名写在Patch: 后面,例如: Patch: OpenOffice-hhj-20030715.patch 如果原 SPEC 文件有PATCH,则在旧的“Patch:”行后新增“PatchN:”行. 如果原来只有一个“Patch:”,您则增加“Patch1:”,并将您的Patch名写在Patch1: 后面,例如: Patch1: OpenOffice-hhj-20030715.patch,依此类推. 2. 如果原 SPEC 文件没有PATCH,则在 SPEC 文件%setup行后面 增加一行%patch -p1 ,其中 -p1 是参数 如果原来只有一个“Patch:”,您增加“Patch1:”,则在SPEC文件%setup行后面,的 %patch -p1后面新增一行: %patch1 -p1 依此类推. 注释: Source行后面的Patch项在%setup行后面肯定有对应项. 6. 执行rpmbuild -ba 命令,这时打出来的二进制RPM包就是修改过的包了,源代码包则包含 了您的PATCH. (列举修改 anaconda源代码): 1.在RedHat9.0中安装anaconda-9.0.src.rpm # rpm -ivh anaconda-9.0.src.com 1.1 在系统中会出现如下文件: /usr/src/redhat/SOURCE/anaconda-9.0.tar.bz2 2. 解压上面目录中的压缩包--anaconda-9.0.tar.bz2 # bunzip2 anaconda-9.0.tar.bz2 2.2 在系统中会出现如下文件 : /usr/src/redhat/SOURCE/anaconda-9.0.tar 2.3 解压上面2.2 tar 包 # tar -xvf anaconda-9.0.tar 在系统中产生如下目录 /usr/src/redhat/SOURCE/anaconda-9.0 2.4 复制anaconda-9.0 目录 # cp -rf anaconda-9.0 anaconda-9.0.orig 现在系统SOURCE目录下存在两个没有编译过的源代码目录 一个是源目录: anaconda-9.0.orig 一个是修改目录: anaconda-9.0 注意:千万不要在SOURCE中的修改目录中编译和调式源代码.该目录只是用来存放修改过的源代码(将其他编译和调式环境中的源代码文件直接覆该目录中的原文件). 一般我们修改的代码都是直接在源代码目录中进行编译,最常用的是在BUILD目录中的源代码目录中, |
联系客服