diff 命令用法--如何打補丁【原創--學習筆記】


diff 命令用法

1、”-u”:表示在比較結果中輸出上下文中一些相同的行,這有利於人工定位

2、“-r“:表示遞歸比較各個子目錄下的文件

3、“-N“:將不存在的文件當作空文件

4、“-w“:忽略對空格的比較

5、“-B“:忽略對空行的比較

例如:假設Linux-2.6.22.6目錄中是原始的內核,Linux-2.6.22.6_ok目錄中是修改后的內核,可以使用以下命令制作補丁文件linux-2.6.22.6_ok.diff(原始目錄在前,修改過的目錄在后)

diff  –urN -w -B  linux-2.6.22.6  linux-2.6.22.6_ok  >  linux-2.6.22.6.diff

由於linux-2.6.22.6是標准的代碼,可以從網上自由下載,要發布的linux-2.6.22.6_ok中所做的修改時,只需要提供補丁文件linux-2.6.22.6_ok.diff(它通常是很小的)

         patch 命令被用來打補丁----就是依據補丁文件來修改原始文件。比如對於上面的例子,可以使用以下命令將補丁文件linux-2.6.22.6_ok.diff 應用到原始目錄linux-2.6.22.6上去。假設linux-2.6.22.6_ok.diff 和linux-2.6.22.6位於同一個目錄下.

cd  linux-2.6.22.6

patch   -p1  <  ../linux-2.6.22.6_ok.diff

         patch 命令中最重要的選項是“-pn”: 補丁文件中指明了要修改的文件的路徑,“-pn”表示忽略路徑中第n個斜線之前的目錄。

 

如何打內核補丁

make kernel_menuconfig 里面存在了打補丁的過程,在更新已打過的patch的話就需要先make clean ,再make menuconfig , 再make kernel_menuconfig, 此時就會打上補丁,那么想更新的話就把原來的補丁刪了,再make kernel_menuconfig,然后再把新內核和改動的內核對比,再按照下面的方法打補丁即可

內核打補丁后,需要再運行這個腳本

diff-urNwB build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5/drivers/video/backlight/pwm_bl.c pwm_bl.c > drivers-video-backlight-pwm_bl.c.patch

 

補丁里必須在第一行加入diff打補丁命令

diff -urNwB

linux-3.6.5/drivers/video/backlight/pwm_bl.c linux-3.6.5/drivers/video/backlight/pwm_bl.c >

drivers-video-backlight-pwm_bl.c.patch

diff -urNa linux-3.0.56_old linux-3.0.56_new > out.patch

 

perl spldiff.pl < usb.patch

patch里就可以出現.orig

這是做了拆分補丁的動作

補丁里必須在第一行加入diff打補丁命令

 

spldiff.pl代碼:

 #use warnings;
 use strict;
 no strict 'refs';
 
 my %seen = (); 
 my $pf;
 
 while (<>) {
     if (/^diff\s+\S+\s+.+?\/(\S+)/) {
         $pf = $1; 
         $pf =~ s/\//-/g;
         unless (exists $seen{"$pf"}) {
             open("$pf", ">$pf.patch");
             $seen{"$pf"} = 1;
         }   
     } else {
         s/(^---\s).+?\/(\S+)/$1linux-3.6.5\/$2.orig/;
         s/(^\+\+\+\s).+?\/(\S+)/$1linux-3.6.5\/$2/;
         print {"$pf"} $_; 
     }   
 }    

 

make kernel_menuconfig 里面存在了打補丁的過程,在更新已打過的patch的話就需要先make clean ,
再make menuconfig , 再make kernel_menuconfig, 此時就會打上補丁,那么想更新的話就把原來的補丁刪了,
再make kernel_menuconfig,然后再把新內核和改動的內核對比,再按照下面的方法打補丁即可 第一步 首先要提取一個干凈的內核; svn co …. cp configs
/brcm5830-prolin2-defconfig .config
make menuconfig
進入patch目錄下把補丁都刪了
make V
=s kernel_menuconfig
這樣就會在build_dir目錄下產生一個干凈的linux內核 第二步 產生一個服務器上的原有內核 svn co …. cp configs
/brcm5830-prolin2-defconfig .config
make menuconfig
進入patch目錄下把補丁都要保留
make V
=s kernel_menuconfig
這樣就會在build_dir目錄下產生一個有patch提交過的linux內核 第三步 注意: 對比服務器的內核和原來的內核的區別,如果你所需要修改的文件原來的內核中沒有,那么直接打補丁即可,如果所要修改的內核文件已經有了補丁,那么就要更新這個補丁即可。 diff
-urNa linux-3.0.56_old linux-3.0.56_new > out.patch 打補丁命令 perl spldiff.pl < out.patch 拆分補丁,生成你所需要的補丁

 

 

 

 

歡迎交流
如有轉載請注明出處

新浪博客:http://blog.sina.com.cn/u/2049150530
博客園:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM