环境:Ubuntu 2404 Server, OpenWRT-23.05
quilt
首先安装 :sudo apt install quilt
为 Quilt - Summary [Savannah] 生成配置文件,使其适用于 OpenWRT。
~/.quiltrc 针对当前用户,/etc/quilt.quiltrc 针对所有用户。这里选择 ~/.quiltrc
cat << EOF > ~/.quiltrc
QUILT_DIFF_ARGS="--no-timestamps --no-index -p ab --color=auto"
QUILT_REFRESH_ARGS="--no-timestamps --no-index -p ab"
QUILT_SERIES_ARGS="--color=auto"
QUILT_PATCH_OPTS="--unified"
QUILT_DIFF_OPTS="-p"
EDITOR="vim"
EOF
EDITOR 用来指定 quilt 用来编辑文件的编辑器,你可以选择别的编辑器,例如 nano。
创建软件包 patch
1 准备代码环境
make package/example/{clean,prepare} V=s QUILT=1
如果是主机端代码,使用:
make package/example/host/{clean,prepare} V=s QUILT=1
2 进入代码目录
cd build_dir/target-*/example-*
3 应用已有 patch
quilt push -a
4 创建新的 patch
quilt new 010-main_code_fix.patch
5 编辑需要修改的文件
quilt edit main.c // 此步可多次进行,修改多个文件
6 查看所有修改
quilt diff
7 确认修改无误,生成 patch
quilt refresh
8 将 patch 更新到 packages 目录
make package/example/update V=s
9 验证 patch 是否正确。编译通过即可。
make package/example/{clean,compile} package/index V=s
下面以开源软件 llibjson-c 为例。可以看到其已经存在 2 个 patch
ubuntu:~/Code/openwrt-23.05$ tree package/libs/libjson-c/
package/libs/libjson-c/
├── Makefile
└── patches
├── 001-dont-build-docs.patch
└── 010-fix-build-with-clang-15.patch
2 directories, 3 files
1、make package/libjson-c/{clean,prepare} V=s QUILT=1
带上 QUILT=1 是告诉编译系统我们是在制作 patch 而不是编译代码。
2、然后进去源码目录 openwrt-23.05/build_dir/target-aarch64_cortex-a53_musl/json-c-0.16。此时源码目录也会有一个 patches 目录,里面存放着已有的 patch。
3、quilt push -a // 先应用现有的所有 patch
4、quilt series // 查看已有 patch,可以看到有以下 patch
001-dont-build-docs.patch
010-fix-build-with-clang-15.patch
5、quilt new 011-test.patch // 新建一个 patch
6、quilt edit debug.c // 编辑要修改的文件
7、quilt diff // 查看修改
8、quilt refresh // 生成 patch
9、make package/libjson-c/update V=s // 更新 patch,此时 package/libs/libjson-c 就有了我们刚才的 patch
10、make package/libjson-c/{clean,compile} package/index V=s // 验证 patch,如果此步编译未报错,则 patch 无问题。
创建或编辑内核 patch
1 准备内核代码
make target/linux/{clean,prepare} V=s QUILT=1
2 进入内核代码
cd build_dir/target-*/linux-*/linux-*
3 创建 patch,需要确认 patch 的归属
quilt new generic/999-test.patch // 针对 target/linux/generic/ 目录
quilt new platform/999-test.patch // 针对 target/linux/<arch_name>/ 目录
内核 patch 的命名遵循以下规则:
0xx - upstream backports
1xx - code awaiting upstream merge
2xx - kernel build / config / header patches
3xx - architecture specific patches
4xx - mtd related patches (subsystem and drivers)
5xx - filesystem related patches
6xx - generic network patches
7xx - network / phy driver patches
8xx - other drivers
9xx - uncategorized other patches
4 修改代码
quilt edit <filename>
5 生成 patch
quilt refresh
6 拷贝 patch
make target/linux/update package/index V=s // 将生成的 patch 从 patches/platform 或者 patches/generic 目录拷贝到 target/linux/<arch_name>/patches-* 或者 target/linux/generic/pending-* 目录
编辑已有 patch
1 准备代码环境
make package/example/{clean,prepare} V=s QUILT=1
如果是主机端代码,使用:
make package/example/host/{clean,prepare} V=s QUILT=1
2 进入代码目录
cd build_dir/target-*/example-*
3 应用要修改的 patch
quilt push 010-main_code_fix.patch
5 编辑需要修改的文件
quilt edit main.c // 此步可多次进行,修改多个文件
6 查看所有修改
quilt diff
7 确认修改无误,生成 patch
quilt refresh
8 将 patch 更新到 packages 目录
make package/example/update V=s
9 验证 patch 是否正确。编译通过即可。
make package/example/{clean,compile} package/index V=s