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