最簡(jiǎn)單的PATCH制作方法 | |||
| |||
Author: wangxg | |||
MINI RPM PATCH HOWTO 最簡(jiǎn)單的PATCH制作方法 V 0.1 版本 目的: 您目的是希望修改了RPM源碼包中的源代碼后,將自己修改的代碼制作成PATCH的形式編譯到原RPM包中,從而方便RPM包的制作,以及保證代碼的一致性和可維護(hù)性. 常規(guī)操作: 1. 在系統(tǒng)中建立三個(gè)目錄: 1.1 源代碼調(diào)式和編譯目錄 (定義為 “工作目錄”) 1.2 修改目標(biāo)代碼目錄 (定義為 “目標(biāo)目錄”) 1.3 原始源代碼目錄 (定義為 “源目錄” ) 注釋: 1.1“工作目錄”即是我們直接修改和調(diào)式源代碼的目錄,一般情況下我們會(huì)解開 RPM源代碼包,然后進(jìn)行 rpmbuild ,在/usr/src/redhat/Build/目錄下會(huì)產(chǎn)生系統(tǒng) 的源代碼目錄,建議將該目錄作為工作目錄. 1.2 “目標(biāo)目錄”是存放最終代碼(修改過的源代碼)的目標(biāo)目錄,一般我們將“工作目錄”中修改好的源代碼復(fù)制到該“目標(biāo)目錄”中,覆蓋該目錄中的舊文件,如果是新增的文件,則將新增文件直接復(fù)制到相應(yīng)的目錄結(jié)構(gòu)中. 為工作方便,目標(biāo)目錄一般情況下在系統(tǒng)/usr/src/redhat/SOURCE/目錄下.該目錄是解壓在SOURCE目錄下的源代碼包壓縮包( 包名.tar.bz2)產(chǎn)生的. 注: SOURCE目錄下的tar.bz2包是在安裝源代碼包(執(zhí)行rpm -ivh )時(shí) 自動(dòng)生成的. 1.3 “源目錄”是制作patch時(shí)對(duì)比用的目錄,方法是在SOURCE目錄制作“目標(biāo)目錄”時(shí)復(fù)制一個(gè)目錄更名為 包名.orig (后最只是用來和“目標(biāo)目錄” 做區(qū)分) 1.4 注意:解壓tar.bz2包生成“目標(biāo)目錄”和“源目錄”后要恢復(fù)一個(gè) tar.bz2包,否則在執(zhí)行rpmbuild時(shí),系統(tǒng)會(huì)提示在SOURCE目錄下找不到包名.tar.bz2文件. 2. 在“工作目錄”中調(diào)式和修改源代碼; 2.1 記錄修改的文件名 2.2 記錄新增的文件名 2.3 記錄刪除的文件名 注釋: 2.1 這里指的修改過的文件是沒有編譯前存在的文件 2.2 這里新增的文件是指用戶額外編寫的程序代碼,也可以是二進(jìn)制模塊 2.3 這里刪除的文件是指用戶手動(dòng)刪除的編譯和調(diào)式前存在的文件 3. 當(dāng)調(diào)式“工作目錄”中代碼無誤時(shí),將“工作目錄”目錄中修改過的文件,用戶新增加的 文件,將“目標(biāo)目錄”對(duì)應(yīng)于“工作目錄”中用戶刪除的文件刪除. 注意: 3.1 修改過的文件會(huì)覆蓋“目標(biāo)目錄”相應(yīng)的文件 3.2 將新增的文件拷貝到“目標(biāo)目錄”相應(yīng)的目錄結(jié)構(gòu)中 3.3 刪除“目標(biāo)目錄”中對(duì)應(yīng)于“工作目錄”中用戶刪除的文件 4. 制作PATCH文件 4.1 在SOURCE目錄下用如下命令: # diff -uNr “源目錄” “目標(biāo)目錄” > 包名.作者.日期.patch 注: a. “包名.作者.日期.patch ”是用戶自己取的.作者可以根據(jù)自己的規(guī)范命名; b. patch文件一定在SOURCE目錄下; 5. 修改SPECS文件 5.1 在SPECS下有包的SPEC文件,名為 “包名.SPEC” 5.2 修改該SPEC文件,這里我們舉一個(gè)小型的 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文件只有兩個(gè)地方,一是在Source后面, 二是在%setup后面. 修改方法: 1. 如果原 SPEC 文件沒有PATCH,則在文件的“Source:”行后增加“Patch:”行. 將您的Patch名寫在Patch: 后面,例如: Patch: OpenOffice-hhj-20030715.patch 如果原 SPEC 文件有PATCH,則在舊的“Patch:”行后新增“PatchN:”行. 如果原來只有一個(gè)“Patch:”,您則增加“Patch1:”,并將您的Patch名寫在Patch1: 后面,例如: Patch1: OpenOffice-hhj-20030715.patch,依此類推. 2. 如果原 SPEC 文件沒有PATCH,則在 SPEC 文件%setup行后面 增加一行%patch -p1 ,其中 -p1 是參數(shù) 如果原來只有一個(gè)“Patch:”,您增加“Patch1:”,則在SPEC文件%setup行后面,的 %patch -p1后面新增一行: %patch1 -p1 依此類推. 注釋: Source行后面的Patch項(xiàng)在%setup行后面肯定有對(duì)應(yīng)項(xiàng). 6. 執(zhí)行rpmbuild -ba 命令,這時(shí)打出來的二進(jìn)制RPM包就是修改過的包了,源代碼包則包含 了您的PATCH. (列舉修改 anaconda源代碼): 1.在RedHat9.0中安裝anaconda-9.0.src.rpm # rpm -ivh anaconda-9.0.src.com 1.1 在系統(tǒng)中會(huì)出現(xiàn)如下文件: /usr/src/redhat/SOURCE/anaconda-9.0.tar.bz2 2. 解壓上面目錄中的壓縮包--anaconda-9.0.tar.bz2 # bunzip2 anaconda-9.0.tar.bz2 2.2 在系統(tǒng)中會(huì)出現(xiàn)如下文件 : /usr/src/redhat/SOURCE/anaconda-9.0.tar 2.3 解壓上面2.2 tar 包 # tar -xvf anaconda-9.0.tar 在系統(tǒng)中產(chǎn)生如下目錄 /usr/src/redhat/SOURCE/anaconda-9.0 2.4 復(fù)制anaconda-9.0 目錄 # cp -rf anaconda-9.0 anaconda-9.0.orig 現(xiàn)在系統(tǒng)SOURCE目錄下存在兩個(gè)沒有編譯過的源代碼目錄 一個(gè)是源目錄: anaconda-9.0.orig 一個(gè)是修改目錄: anaconda-9.0 注意:千萬不要在SOURCE中的修改目錄中編譯和調(diào)式源代碼.該目錄只是用來存放修改過的源代碼(將其他編譯和調(diào)式環(huán)境中的源代碼文件直接覆該目錄中的原文件). 一般我們修改的代碼都是直接在源代碼目錄中進(jìn)行編譯,最常用的是在BUILD目錄中的源代碼目錄中, |
聯(lián)系客服