.全量编译(Full / Clean Build)
- 定义:从头开始重新编译整个项目,包括所有源文件、头文件、配置文件等。
- 触发方式:
- 手动执行
rm -rf build/(或等效清理命令)后再重新配置和构建。 - 修改了影响全局的配置(如 Kconfig 选项变更导致
.config或autoconf.h发生变化)。 - 执行了类似
west build -p always(Zephyr)或hb clean && hb build(鸿蒙)的命令。
- 手动执行
- 特点:
- 编译时间长。
- 确保构建结果完全基于当前代码和配置,避免因缓存或依赖错误导致的问题。
- 适用于配置大幅变更、怀疑构建缓存污染、或发布前的最终构建。
2.增量编译(Incremental Build)
- 定义:仅重新编译自上次构建以来发生变更的源文件及其依赖项。
- 触发方式:
- 直接再次运行构建命令(如
cmake --build build/或ninja -C build)。 - 修改了某个
.c或.h文件,但未改变全局配置。
- 直接再次运行构建命令(如
- 依赖机制:
- CMake 会根据文件时间戳或哈希值判断是否需要重新编译。
- 若 Kconfig 配置未变,生成的
autoconf.h不变,则大部分模块不会重新编译。
- 特点:
- 编译速度快,提升开发效率。
- 依赖 CMake 的依赖追踪机制是否完善(通常很可靠)。
- 若构建系统未能正确识别依赖变化(如宏定义影响未被追踪),可能导致行为异常,此时需全量编译。
3.Kconfig 的特殊影响
- Kconfig 用于生成配置头文件(如
autoconf.h或generated_dts_board.h)。 - 一旦 Kconfig 选项被修改并重新配置(
menuconfig后保存),CMake 通常会检测到配置文件变更,并触发受影响模块的重新编译(部分增量),但有时为保险起见,开发者会选择全量编译。 - 在鸿蒙或类似系统中,执行
hb build默认是增量的;若修改了Kconfig并重新生成.config,系统会自动重新生成相关头文件,并仅重新编译依赖这些配置的模块。 总结对比
项目
增量编译
全量编译
编译范围
仅变更文件及其依赖
所有文件
速度
快
慢
适用场景
日常开发、小改动
配置大改、构建异常、发布构建
是否受 Kconfig 影响
是(若配置变,相关模块重编)
是(总是基于最新配置)
- 日常开发优先使用增量编译以提升效率。
- 若修改了 Kconfig 选项、设备树、或遇到“代码改了但行为没变”等诡异问题,尝试全量编译排除缓存干扰。
总结:
- 全量编译:就像你把已经搭好的整个积木城堡全部拆掉,然后从第一块开始重新搭一遍。不管有没有改过,全都重来。
👉优点:保证搭得绝对正确。
👉缺点:太费时间! - 增量编译:你只改了城堡的一个小塔楼,那下次就只拆掉那个小塔楼,重新搭这部分,其他地方不动。
👉优点:快!省时间!
👉缺点:如果系统没发现“其他部分其实也受影响了”,可能会搭歪(不过大多数时候没问题)。
🛠️ 在 CMake + Kconfig 项目里:
- 你只改了一个 .c 文件?
→ 下次编译,只重新编译这个文件和它相关的部分(增量编译)。 - 你改了 Kconfig 配置(比如打开了某个功能)?
→ 系统会重新生成配置文件,然后只重新编译那些受这个配置影响的代码(通常也是增量,但范围可能变大)。 - 你不确定为啥代码没生效?或者改了配置后行为奇怪?
→ 这时候就“全拆重搭”:删掉 build 文件夹(或执行 clean),重新编译全部(全量编译),确保干净。