为什么 CMake 不将 "GENERATED" 属性 添加到 "configure_file" 创建的文件中?

Why doesn't CMake add the "GENERATED" property to file created by "configure_file"?

CMake configure_file 命令可用于从模板创建具体文件。调用 configure_file(foo.h.in foo.h) 将生成 foo.h 文件,该文件在 运行 cmake.

之前不存在

然而,它没有标有 GENERATED 属性。调用 get_source_file_property(is_generated foo.h GENERATED) returns NOTFOUND.

我想念的这种行为背后的合理性是什么?

根据文档,源文件 属性 GENERATED 的目的是防止在配置过程中检查文件:

This information is then used to exempt the file from any existence or validity checks.

例如add_executable 如果其源文件之一在配置时不存在,命令可能会发出错误。在尝试构建配置的项目之前,此检查可能会发现问题。

但标有 GENERATED 的文件直到构建阶段才会被检查。

因为configure_file 立即创建文件,所以当此文件用于例如,检查文件是否存在是完全正确的。 add_executable 打电话。 也就是说,没有理由将此文件标记为 GENERATED。


属性 文档中的第一段

Is this source file generated as part of the build or CMake process.

看起来有争议,因为 configure_file 在“CMake 进程”期间创建文件。

可能,通过注释“CMake 过程”,他们想要适应 file(GENERATE) 实际上设置 属性。但是 configure_filefile(GENERATE) 关于文件的生成时间有根本的区别:

  • configure_file 在 CMake 执行 CMakeLists.txt.
  • 中的下一个命令之前 立即 创建文件
  • file(GENERATE) 仅在配置过程结束时 创建文件 ,在所有 CMakeLists.txt 处理完之后。