一、参考资料

Working with patches

二、使用QUILT工具添加补丁

默认已有quilt工具,环境已配置好,此处不赘述

2.1 添加一个新的补丁

(1)准备源目录

make package/example/{clean,prepare} V=s QUILT=1

(2)切换到准备好源码的目录:

cd build_dir/target-*/example-*

(3)应用所有已存在的补丁文件:

quilt push -a

(4)创建一份新的,空的补丁文件

quilt new 010-main_code_fix.patch

(5)添加修改的文件
上述参考资料是直接使用quilt edit命令来修改文件,但是这种方法无论是用vim 和nano用起来都不太方便,而且此时的patch修改已经是基本确认验证过代码了,基本已经有修改好的代码了。
所以这是直接使用

quilt add file_name(涉及的改动文件,都添加进去)

(6)修改文件
使用任意编辑工具皆可。
(7)查看差异

quilt diff

(8)确认无误后,使得patch生成

quilt refresh

此时可以在当前目录下,patch文件中找到生成的patch文件。可复制出来,当做备份。
注释:(trailing whitespace 尾随空格)可能会与这个警告,就是说那一行行末尾有多余空格和tab,可以手动删除再更新,也可以不管。
(9)patch放到编译目录中,使用以下命令重新清除编译,查看是否修改成功,编译无误

make package/example/{clean,compile} V=s

2.2 编辑一个已存在的补丁

(1)开始准备源目录:

make package/example/{clean,prepare} V=s QUILT=1

(2)切换到准备好的源目录中:

cd build_dir/target-*/example-*

(3)列出有效的补丁文件:

quilt series

(4)转到需要编辑的补丁文件

quilt push 010-main_code_fix.patch

(5)(6)(7)(8)(9)同上

2.3 补丁命名规范

所有的补丁文件应该以“NNN-lowercase_shortname.patch”的形式命名,并分成以下几类:
0xx - 上游补丁
1xx - 代码等待上游合并
2xx - 内核构建、配置、头补丁
3xx - 特定架构的补丁
4xx - mtd相关的补丁(子系统和驱动)
5xx - 文件系统相关的补丁
6xx - 通用网络补丁
7xx - 网络层/物理层驱动补丁
8xx - 其他驱动
9xx - 未分类的其他补丁

2.4 添加或修改内核补丁文件

暂时没有用到,也未验证相关是否正确,后面用到再总结补充。

三、使用diff 打补丁

使用diff打补丁,适合于对补丁流程熟悉,并且补丁文件个数不多及目录结构简单的情况,有时候单个文件补丁内容过多不变一个个手动修改时使用本节介绍方法也可以让工作更高效。

相关操作及命令:
(1)修改目标文件,并将该文件重命名为newfile,旧文件假设为oldfile;
(2)执行命令添加补丁内容:

$diff –Nur oldfile newfile > number-destfile.patch

(3)修改补丁内容,修改文件路径,旧文件为a/xxx/xxx,新文件为b/xxx/xxx,文件路径必须和实际的路径层数相同,a,b代表编译包的名称;
(4)将制作好的number-destfile.patch这个补丁文件放到package/package-name/patches目录中,如果patches目录之前不存在,那么创建一个就可以了;
(5)打补丁工作结束!

四、相关问题及解决方法

题及解决方法

4.1 make package/package-name/update V=s失败

问题原因:目标组件的编译方法Makefile的Prepare节存在问题,缺少“$(call Build/Prepare/Default)”这句。

解决方法: 添加$(call Build/Prepare/Default)这句到Prepare节中,如下:

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
    $(call Build/Prepare/Default)
endef

结果:问题解决