制作patch文件 打patch 附带linux打补丁命令

对某个版本的Linux内核做了修改以后,如果希望发布出去给别人用,那么就需要制作针对此版本的patch文件。


patch文件是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。


补丁是通过 diff命令来创建的。

为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生的以及这个补丁要把目前的源代码树变化到什么新版本

这些信息或者会出现在补丁原数据中,或者可能从文件名中推断出来。


1,如何制作patch文件 
 

   比如基于kernel内核做了修改,修改了LCD代码,

   修改前的内容放在文件夹kernel下

   修改后的内容放在文件夹kernel_new下

   那么制作patch文件的命令为

    zhenwx-desktop:~/sourcecode/$ diff -Naur kernel/    kernel_new/> zwx-lcd.patch

   当前目录为/home/zhenwx/sourcecode/,该目录有原来修改前的内核kernel目录和修改后的目录kernel_new


   diff命令会对比kernel和kernel_new目录的文件,产生patch文件zwx-lcd.patch
 
   这个patch文件 描述文件的路径信息将第几行内容删除,在第几行添加内容删除用减号,添加用加号
  

 2,怎样打补丁patch和卸载补丁patch

    用patch命令来打补丁。patch读取一个diff(或者patch)文件,然后把文件中描述的变化内容应用到代码树上。

    Linux内核中的补丁相对于保存内核源代码目录的父目录而生成的。

    patch文件中的文件路径包含了它所基于的内核源文件目录名(或者像是"a/"和"b/"之类的其它名字),这可能和自己的内核源代码目录名不匹配,

   切换到自己的内核源代码目录,打补丁的时候去掉patch中文件名字路径的第一个分量(patch命令的-p1参数)。


   使用-R参数卸载掉一个以前已经打上的补丁。

   打补丁:

   patch -p1

   卸载掉这个补丁:

   patch -R -p1 

  
   其他人下载patch文件后,只需在标准的kernel内核目录里执行
    zhenwx-desktop:~/sourcecode/kernel/$ patch -p1<../zwx-lcd.patch

   假设zwx-lcd.patch和kernel文件夹是在同一目录下,且上述命令在kernel文件夹内执行


   如果在/sourcecode目录下面执行命令

   zhenwx-desktop:~/sourcecode/$patch -p0<../zwx-lcd.patch

  
  
 linux下patch命令使用详解
  
 linux打补丁命令
  
 功能说明:修补文件。
  

 语  法:patch [-bceEflnNRstTuvZ]

[-B <备份字首字符串>]

[-d <工作目录>]

[-D <标示符号>]

[-F <监别列数>]

[-g <控制数值>]

[-i <修补文件>]

[-o <输出文件>]

[-p <剥离层级>]

[-r <拒绝文件>]

[-V <备份方式>]

[-Y <备份字首字符串>]

[-z <备份字尾字符串>]

[--backup-if   -mismatch]

[--binary]

[--help]

[--nobackup-if-mismatch]

[--verbose]

[原始文件 <修补文件>] 或 path 

[-p <剥离层级>] < [修补文件]

  

   patch指令是让用户利用设置修补文件的方式,修改,更新原始文件。

   倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行

   如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。

  
 参  数:

-b或--backup  备份每一个原始文件。 

-B<备份字首字符串>或--prefix=<备份字首字符串>  设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。 

-c或--context  把修补数据解译成关联性的差异。

-d<工作目录>或--directory=<工作目录>  设置工作目录。 

-D<标示符号>或--ifdef=<标示符号>  用指定的符号把改变的地方标示出来。 

-e或--ed  把修补数据解译成ed指令可用的叙述文件。

-E或--remove-empty-files  若修补过后输出的文件其内容是一片空白,则移除该文件。

-f或--force  此参数的效果和指定-t参数类似,但会假设修补数据的版本为新 版本。 

-F<监别列数>或--fuzz<监别列数>  设置监别列数的最大值。

-g<控制数值>或--get=<控制数值>  设置以RSC或SCCS控制修补作业。

-i<修补文件>或--input=<修补文件>  读取指定的修补问家你。

-l或--ignore-whitespace  忽略修补数据与输入数据的跳格,空格字符。

-n或--normal  把修补数据解译成一般性的差异。

-N或--forward  忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。

-o<输出文件>或--output=<输出文件>  设置输出文件的名称,修补过的文件会以该名称存放。

-p<剥离层级>或--strip=<剥离层级>  设置欲剥离几层路径名称。

-f<拒绝文件>或--reject-file=<拒绝文件>  设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。

-R或--reverse  假设修补数据是由新旧文件交换位置而产生。

-s或--quiet或--silent  不显示指令执行过程,除非发生错误。

-t或--batch  自动略过错误,不询问任何问题。

-T或--set-time  此参数的效果和指定-Z参数类似,但以本地时间为主。

-u或--unified  把修补数据解译成一致化的差异。

-v或--version  显示版本信息。 

-V<备份方式>或--version-control=<备份方式>  用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用-z参数变更,当使用-V参数指定不同备份方式时,也会产生不同字尾的备份字符串。

-Y<备份字首字符串>或--basename-prefix=--<备份字首字符串>  设置文件备份时,附加在文件基本名称开头的字首字符串。

-z<备份字尾字符串>或--suffix=<备份字尾字符串>  此参数的效果和指定-B参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上backup/字符串后,文件super.c会备份于/src/linux/fs/backup目录里。

-Z或--set-utc  把修补过的文件更改,存取时间设为UTC。

 

--backup-if-mismatch  在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。 
--binary  以二进制模式读写数据,而不通过标准输出设备。 
--help  在线帮助。 
--nobackup-if-mismatch  在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。 
--verbose  详细显示指令的执行过程。
  

 patch帮助#man patch

 -p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,

  patch -p0       (“p”指的是路径,后面的 数字表示去掉路径的第几部分0,表示不去掉,为全路径)
  patch -p1       (“p”后面的数字1,表示 去掉前第一个路径第一个"/"以前的目录,依此类推。
 如 /usr /src /linux-2.6.11/Makefile这样的文件名,在提供-p 3参数时将使用 linux-2.6.11/Makefile作为所要patch的文件。
 
 对于刚才举的Linux内核源码LCD升级包的例子,假定源码目录位于/home/zhenwx/sourcecode/kernel中,
 则在当前目录为/home/zhenwx /sourcecode时使用"patch -p 0<../zwx-lcd.patch"可以工作,
 在当前目录为/home/zhenwx/sourcecode /kernel时,使用"patch -p 1<../zwx-lcd.patch"也可以正常工作。
 
如果 patch文件里面描述的第一级目录自己的第一级目录名字不一样,要 将第一级的目录去掉
 
比如拿到的 patch描述的目录和自己的不一样,patch第一行描述的目录信息
 
diff --git a/arch/arm/mach-msm/acpuclock-8064.c b/arch/arm/mach-msm/acpuclock-8064.c
 
但是自己的目录既不是a,也不是b,那么就要 将目录的第一层去掉到kernel的路径下打patch,用-p 1参数,去掉 第一个"/"以前的目录

你可能感兴趣的:(linux驱动)