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