Bigtop 如何插入补丁
在 Bigtop 的组件构建中,我们经常需要修改上游源码。这些修改往往以 .diff
补丁的形式存在。
但手动维护 .spec
文件里的 patch 声明与命令,不仅繁琐,还容易遗漏。为此,Bigtop 实现了一套自动化 patch 注入机制 —— 只需放置
patch 文件,其余全部交给构建框架完成。
# 🧩 Patch 注入机制概览
Bigtop 通过 占位符 + 脚本替换 的方式完成补丁自动注入:
类型 | 占位符 | 注入内容 |
---|---|---|
补丁声明 | #BIGTOP_PATCH_FILES | 会替换为 Patch0: xxx.diff |
补丁执行 | #BIGTOP_PATCH_COMMANDS | 会替换为 %patch0 -p1 |
这些写法看似特殊,其实只是被 Groovy 脚本在构建过程中替换掉的钩子点。
# ⚙️ 注入逻辑代码解析 + 效果图展示
# ① 注入 patch 文件声明
if (line.startsWith("#BIGTOP_PATCH_FILES")) {
def patchNum = 0
patches.each { p ->
specWriter << "Patch$patchNum: $p\n"
patchNum++
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
这一段会将所有 patch*.diff
文件写入 .spec
中的 patch 声明位置。
# 🔍 结果前后对比
构建前:
构建后:
可以看到,系统自动插入了从 patch0 到 patch4 的声明,无需手动添加,路径也都是来自 rpm/SOURCES/
。
# ② 注入 patch 执行命令
if (line.startsWith("#BIGTOP_PATCH_COMMANDS")) {
def patchNum = 0
patches.each { p ->
specWriter << "%patch$patchNum -p1\n"
patchNum++
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
这段代码则负责生成 %patchN
的执行命令,并插入到 %prep
阶段。
# 🔍 对应位置效果图
构建前:
构建后:
这正是 RPM 标准方式应用 patch 的写法,只不过由 Bigtop 自动替你完成了。
# 📦 这些补丁从哪来?
你只需要将 patch 文件放到以下路径中即可:
bigtop-packages/src/extensions/
1
系统会自动将其复制到:
build/<component>/rpm/SOURCES/
1
并完成注入流程。
提示
命名规则必须符合 patch*.diff
才能被识别和注入。例如 patch0-RANGER.diff
、patch1-feature-fix.diff
# 🧠 总结:Bigtop 如何实现补丁自动插入
步骤 | 动作 |
---|---|
Step 1 | .spec 文件中插入注释占位符:#BIGTOP_PATCH_FILES 和 #BIGTOP_PATCH_COMMANDS |
Step 2 | 把补丁放入 src/extensions ,命名形如 patch0-xxx.diff |
Step 3 | 构建时 Groovy 脚本扫描补丁文件并写入 .spec |
Step 4 | .spec 文件更新后即可由 rpmbuild 自动执行所有 patch 操作 |
# 📎 附:完整处理逻辑源码
如果你希望自定义 patch 注入逻辑,也可以在 packages.gradle
中找到如下片段做修改:
def patches = new File("${PKG_BUILD_DIR}/rpm/SOURCES").list({ d, f -> f ==~ /patch.*diff/ }).sort()
specFile.eachLine { line ->
if (line.startsWith("#BIGTOP_PATCH_FILES")) {
patches.eachWithIndex { p, i -> specWriter << "Patch$i: $p\n" }
} else if (line.startsWith("#BIGTOP_PATCH_COMMANDS")) {
patches.eachWithIndex { p, i -> specWriter << "%patch$i -p1\n" }
} else {
specWriter << "$line\n"
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10