为什么CMake的configure_file生成的文件未设置GENERATED属性?
CMake
configure_file 生成文件未标记 GENERATED 属性的设计考量 GENERATED 属性的核心作用是标记构建阶段才会生成的文件,告知CMake这类文件在配置阶段结束后仍不存在,无需在配置阶段校验文件存在性,对应的生成逻辑会在执行make/ninja等构建命令时运行。而configure_file的执行时机是CMake的配置阶段,也就是cmake命令运行结束时,目标文件就已经实际写入磁盘,和GENERATED属性的定位完全不匹配,背后的具体设计考量如下:
- 职责边界清晰:
GENERATED属性从设计之初就明确区分「配置阶段产物」和「构建阶段产物」,如果将配置阶段生成的文件也标记为GENERATED,会混淆文件生成时机的判断,提升问题排查成本。 - 避免冗余构建逻辑:如果给
configure_file的产物加GENERATED标记,CMake会自动为其附加构建阶段的生成规则,但这类文件在配置阶段就已经生成完成,额外的构建规则只会增加不必要的构建开销。 - 兼容临时调试场景:实际开发中存在开发者临时修改
configure_file生成的文件做调试的场景,如果标记为GENERATED,CMake会默认该文件完全由构建流程管控,可能在构建时覆盖开发者的手动修改,不符合实际使用需求。 - 行为逻辑统一:
configure_file的行为和file(WRITE)等其他配置阶段写文件的命令对齐,这类命令生成的文件都不会标记GENERATED属性,统一的规则降低了开发者的学习成本。
内容的提问来源于stack exchange,提问作者Delgan
相关产品推荐
相关产品推荐

