• 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 (/^diffs+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

  • 相关阅读:
    关于JAVA的线程问题
    Java 对JTextField添加回车响应
    Failed to install *.apk on device 'emulator-5554': timeout .
    静态属性
    类与对象的实例属性

    面向对象2
    面向对象设计
    re模块,主要用来查询
    xml对标签操作,
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4514099.html
Copyright © 2020-2023  润新知