如何制作LINUX的patch文件及如何打patch
? ? ? ? ? ? ? ? ? ? ? ? ? ?如何制作LINUX的patch文件及如何打patch
對(duì)某個(gè)版本的Linux內(nèi)核做了修改以后,如果希望發(fā)布出去給別人用,那么就需要制作針對(duì)此版本的patch文件。
patch文件也叫補(bǔ)丁,就是一個(gè)文本文檔,這個(gè)文檔包含了在兩個(gè)不同版本的源代碼樹之間的變化。
補(bǔ)丁是通過(guò)diff應(yīng)用程序來(lái)創(chuàng)建的。
為了正確地打上一個(gè)補(bǔ)丁,你需要知道這個(gè)補(bǔ)丁是從哪個(gè)基礎(chǔ)版本產(chǎn)生出來(lái)的以及這個(gè)補(bǔ)丁將要把
目前的源代碼樹變化到什么新的版本。這些信息或者會(huì)出現(xiàn)在補(bǔ)丁文件的原數(shù)據(jù)中,或者可能從文件名中推斷出來(lái)。
1,如何制作補(bǔ)丁patch文件?
?
?? 比如基于kernel內(nèi)核 做了修改,修改了LCD代碼,修改前的內(nèi)容放在文件夾kernel下,修改后的內(nèi)容放在文件夾kernel_new下,那么制作patch文件的命令為
?? zhenwx-desktop:~/sourcecode/$diff -Naur kernel/??? kernel_new/ > zwx-lcd.patch
?
?? 當(dāng)前目錄為?? /home/zhenwx/sourcecode/,該目錄有原來(lái)修改前的內(nèi)核kernel目錄和修改后的目錄kernel_new
?? 執(zhí)行命令為? diff -Naur kernel/??? kernel_new/ > zwx-lcd.patch
?? diff命令就會(huì)對(duì)比kernel和kernel_new目錄的文件,產(chǎn)生patch文件zwx-lcd.patch
?? 這時(shí)就 可以把zwx-lcd.patch發(fā)布到網(wǎng)上。
?? 這個(gè)patch文件是描述文件的路徑信息和將第幾行內(nèi)容刪除,在第幾行添加內(nèi)容,刪除用減號(hào),添加用加號(hào)
??
?2,怎樣打補(bǔ)丁patch和卸載補(bǔ)丁patch
??? 可以使用patch程序來(lái)打一個(gè)補(bǔ)丁。patch程序讀取一個(gè)diff(或者patch)文件,然后把文件中
??? 描述的變化內(nèi)容應(yīng)用到代碼樹上。
??? Linux內(nèi)核中的補(bǔ)丁是相對(duì)于保存內(nèi)核源代碼目錄的父目錄而生成的。
??? 這就意味著:patch文件中的文件路徑包含了它所基于的內(nèi)核源文件目錄的名字(或者像是"a/"和"b/"
??? 之類的其它名字)。
??? 由于這很可能和你本地機(jī)器上的內(nèi)核源代碼目錄的名字不匹配。你應(yīng)該切換到你的內(nèi)核源代碼目錄,并且在打補(bǔ)丁的時(shí)候去掉patch
??? 中文件名字路徑的第一個(gè)分量(patch命令的-p1參數(shù)可以完成這個(gè)任務(wù))。
??? 為了卸載掉一個(gè)以前已經(jīng)打上的補(bǔ)丁,使用-R參數(shù)來(lái)打補(bǔ)丁。
??? 于是,如果你使用如下的命令來(lái)打補(bǔ)丁:
???? patch -p1
??? 那么你可以像下面這樣來(lái)卸載掉這個(gè)補(bǔ)丁:
???? patch -R -p1?
??
?例如其他人下載到上面提供的patch文件后,只需在標(biāo)準(zhǔn)的kernel內(nèi)核目錄里執(zhí)行
?zhenwx-desktop:~/sourcecode/kernel/$
??
?patch -p1<../zwx-lcd.patch
??
??
?這里假設(shè)zwx-lcd.patch和kernel文件夾是在同一目錄下,且上述命令 在kernel文件夾內(nèi)執(zhí)行
?如果在/sourcecode目錄下面執(zhí)行命令
?zhenwx-desktop:~/sourcecode/$
??
?patch -p0<../zwx-lcd.patch
??
??
?linux下patch命令使用詳解
??
?linux打補(bǔ)丁命令
??
?功能說(shuō)明:修補(bǔ)文件。
??
?語(yǔ) 法:patch [-bceEflnNRstTuvZ][-B <備份字首字符串>][-d <工作目錄>][-D <標(biāo)示符號(hào)>][-F <監(jiān)別列數(shù)>][-g <控制數(shù)值>][-i <修補(bǔ)文件>][-o <輸出文件>][-p <剝離層級(jí)>][-r <拒絕文件>][-V <備份方式>][-Y <備份字首字符串>][-z <備份字尾字符串>][--backup-if -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 <修補(bǔ)文件>] 或 path [-p <剝離層級(jí)>] < [修補(bǔ)文件]
??
?補(bǔ)充說(shuō)明:patch指令讓用戶利用設(shè)置修補(bǔ)文件的方式,修改,更新原始文件。倘若一次僅修改一個(gè)文件,可直接在指令列中下達(dá)指令依序執(zhí)行。如果配合修補(bǔ)文件的方式則能一次修補(bǔ)大批文件,這也是Linux系統(tǒng)核心的升級(jí)方法之一。
??
?參 數(shù):
? -b或--backup 備份每一個(gè)原始文件。?
-B<備份字首字符串>或--prefix=<備份字首字符串> 設(shè)置文件備份時(shí),附加在文件名稱前面的字首字符串,該字符串可以是路徑名稱。?
-c或--context 把修補(bǔ)數(shù)據(jù)解譯成關(guān)聯(lián)性的差異。
? -d<工作目錄>或--directory=<工作目錄> 設(shè)置工作目錄。?
-D<標(biāo)示符號(hào)>或--ifdef=<標(biāo)示符號(hào)> 用指定的符號(hào)把改變的地方標(biāo)示出來(lái)。?
-e或--ed 把修補(bǔ)數(shù)據(jù)解譯成ed指令可用的敘述文件。
? -E或--remove-empty-files 若修補(bǔ)過(guò)后輸出的文件其內(nèi)容是一片空白,則移除該文件。
? -f或--force 此參數(shù)的效果和指定-t參數(shù)類似,但會(huì)假設(shè)修補(bǔ)數(shù)據(jù)的版本為新 版本。?
-F<監(jiān)別列數(shù)>或--fuzz<監(jiān)別列數(shù)> 設(shè)置監(jiān)別列數(shù)的最大值。?
-g<控制數(shù)值>或--get=<控制數(shù)值> 設(shè)置以RSC或SCCS控制修補(bǔ)作業(yè)。?
-i<修補(bǔ)文件>或--input=<修補(bǔ)文件> 讀取指定的修補(bǔ)問(wèn)家你。?
-l或--ignore-whitespace 忽略修補(bǔ)數(shù)據(jù)與輸入數(shù)據(jù)的跳格,空格字符。?
-n或--normal 把修補(bǔ)數(shù)據(jù)解譯成一般性的差異。
? -N或--forward 忽略修補(bǔ)的數(shù)據(jù)較原始文件的版本更舊,或該版本的修補(bǔ)數(shù)據(jù)已使 用過(guò)。?
-o<輸出文件>或--output=<輸出文件> 設(shè)置輸出文件的名稱,修補(bǔ)過(guò)的文件會(huì)以該名稱存放。?
-p<剝離層級(jí)>或--strip=<剝離層級(jí)> 設(shè)置欲剝離幾層路徑名稱。
? -f<拒絕文件>或--reject-file=<拒絕文件> 設(shè)置保存拒絕修補(bǔ)相關(guān)信息的文件名稱,預(yù)設(shè)的文件名稱為.rej。
? -R或--reverse 假設(shè)修補(bǔ)數(shù)據(jù)是由新舊文件交換位置而產(chǎn)生。?
-s或--quiet或--silent 不顯示指令執(zhí)行過(guò)程,除非發(fā)生錯(cuò)誤。?
-t或--batch 自動(dòng)略過(guò)錯(cuò)誤,不詢問(wèn)任何問(wèn)題。?
-T或--set-time 此參數(shù)的效果和指定-Z參數(shù)類似,但以本地時(shí)間為主。?
-u或--unified 把修補(bǔ)數(shù)據(jù)解譯成一致化的差異。?
-v或--version 顯示版本信息。?
-V<備份方式>或--version-control=<備份方式> 用-b參數(shù)備份目標(biāo)文件后,備份文件的字尾會(huì)被加上一個(gè)備份字符串,這個(gè)字符串不僅可用-z參數(shù)變更,當(dāng)使用-V參數(shù)指定不同備份方式時(shí),也會(huì)產(chǎn)生不同字尾的備份字符串。
? -Y<備份字首字符串>或--basename-prefix=--<備份字首字符串> 設(shè)置文件備份時(shí),附加在文件基本名稱開頭的字首字符串。
? -z<備份字尾字符串>或--suffix=<備份字尾字符串> 此參數(shù)的效果和指定-B參數(shù)類似,差別在于修補(bǔ)作業(yè)使用的路徑與文件名若為src/linux/fs/super.c,加上backup/字符串后,文件super.c會(huì)備份于/src/linux/fs/backup目錄里。
? -Z或--set-utc 把修補(bǔ)過(guò)的文件更改,存取時(shí)間設(shè)為UTC。?
--backup-if-mismatch 在修補(bǔ)數(shù)據(jù)不完全吻合,且沒(méi)有刻意指定要備份文件時(shí),才備份文件。?
--binary 以二進(jìn)制模式讀寫數(shù)據(jù),而不通過(guò)標(biāo)準(zhǔn)輸出設(shè)備。?
--help 在線幫助。?
--nobackup-if-mismatch 在修補(bǔ)數(shù)據(jù)不完全吻合,且沒(méi)有刻意指定要備份文件時(shí),不要備份文件。?
--verbose 詳細(xì)顯示指令的執(zhí)行過(guò)程。
??
?patch,是打補(bǔ)丁的命令,有很多用法,見幫助#man patch
?-p參數(shù)決定了是否使用讀出的源文件名的前綴目錄信息,不提供-p參數(shù),則忽略所有目錄信息,
? patch -p0?????? (“p”指的是路徑,后面的數(shù)字表示去掉路徑的第幾部分。0,表示不去掉,為全路徑)
? patch -p1?????? (“p”后面的數(shù)字1,表示去掉前第一個(gè)路徑,第一個(gè)"/"以前的目錄,依此類推。
?如/usr/src/linux-2.6.11/Makefile這樣的文件名,在提供-p3參數(shù)時(shí)將使用linux-2.6.11/Makefile作為所要patch的文件。
?
對(duì)于剛才舉的Linux內(nèi)核源碼LCD升級(jí)包的例子,假定源碼目錄位于/home/zhenwx/sourcecode/kernel中,
?則在當(dāng)前目錄為/home/zhenwx/sourcecode/時(shí)使用"patch -p0<../zwx-lcd.patch"可以工作,
?在當(dāng)前目錄為/home/zhenwx/sourcecode/kernel時(shí),使用"patch -p1<../zwx-lcd.patch"也可以正常工作。
?
如果patch文件里面描述的第一級(jí)目錄和你自己的第一級(jí)目錄名字不一樣,要將第一級(jí)的目錄去掉,這個(gè)方法就派上用場(chǎng)了。
?
比如如果你拿到的patch描述的目錄和你的不一樣,patch第一行描述的目錄信息
?
diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c
?
但是你的目錄既不是a,也不是b,那么你就要將目錄的第一層去掉,到你的kernel的路徑下面打patch
?
用-p1參數(shù)
轉(zhuǎn)自:?http://blog.csdn.net/zhenwenxian/article/details/8393731
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的如何制作LINUX的patch文件及如何打patch的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 日常生活 -- 感悟
- 下一篇: 2022年文化潮流趋势报告