【问题标题】:Why doesn't CMake add the "GENERATED" property to file created by "configure_file"?为什么 CMake 不将“GENERATED”属性添加到“configure_file”创建的文件中?
【发布时间】:2022-01-09 05:06:38
【问题描述】:

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

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

我错过的这种行为背后的原因是什么?

【问题讨论】:

  • GENERATED 是在构建阶段创建的文件,但configure_file配置阶段立即创建一个文件。您也可以将 GENERATED 文件视为无需重新配置项目即可删除的文件。但是删除configure_file的结果后,如果不重新配置,项目将无法构建。
  • @Tsyvarev GENERATED 文档指出“此源文件是作为构建或 CMake 过程的一部分生成的”,configure_file() 不是 CMake 过程/配置阶段的一部分吗?
  • 不确定“CMake 过程”是什么意思。在另一段中,他们说“Makefile 生成器将在 make clean 期间删除 GENERATED 文件。”但我认为没有理由在make clean 上删除configure_file 的结果。
  • @Tsyvarev 是的,这有点奇怪。他们还提到 file(GENERATE) 被标记为 GENERATED 但它是在配置期间创建的,而不是构建阶段。
  • 至少,当您在CMakeLists.txt 中查看使用file(GENERATE) 创建的文件时,它是尚未创建:该文件仅在配置过程结束时创建.但是configure_file立即创建文件。

标签: c++ cmake


【解决方案1】:

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

然后使用此信息使文件免于任何存在或有效性检查。

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

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

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


房产文档的第一段

此源文件是作为构建或 CMake 过程的一部分生成的吗?

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

很可能,通过注意“CMake 过程”,他们想要适应 file(GENERATE) 实际上设置了该属性。但是configure_filefile(GENERATE) 在文件生成时间方面存在根本区别:

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

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2015-06-15
    • 2021-12-22
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多