【问题标题】:Does CMake's add_custom_command delete its first output sometimes?CMake 的 add_custom_command 有时会删除它的第一个输出吗?
【发布时间】:2018-06-13 23:35:31
【问题描述】:

在我的 CMake 文件中,我有一个自定义命令,它调用一些外部代码生成。生成的文件是用户将他/她自己的代码放入其中的存根。因此,代码生成确保不会覆盖已经存在的文件。我的自定义命令如下所示:

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
add_custom_command(
    OUTPUT ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})

现在我注意到至少有时${generatedOnceSrc}(在本例中为foo.h)的第一个元素会被删除并重新生成。当然,一旦用户开始编辑生成的foo.h,那会带来麻烦。

add_custom_command 的文档没有提到这种行为,但也不否认。所以我的问题是:

我的观察是否正确?

请注意,我已经找到了这样的解决方法

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
set_source_files_properties(generatorOutput PROPERTIES SYMBOLIC true)
add_custom_command(
    OUTPUT generatorOutput
    BYPRODUCTS ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_custom_target(generatorTarget DEPENDS generatorOutput)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})
add_dependencies(myProg generatorTarget)

不幸的是,这会在每次构建时调用 ${generateCmd},因为符号文件 generatorOutput 总是被认为是过时的,并且 CMake 不再检查 ${generatedOnceSrc} 的存在。

版本

  • 生成器:Unix Makefiles
  • CMake 3.5.1
  • Ubuntu 16.04

编辑

忘了提到我使用 Unix Makefiles 生成器观察到了这种行为,该生成器默认用于我的 Ubuntu 16.04 系统。

【问题讨论】:

  • CMake 绝对不会在 配置阶段 删除文件(当 cmake 运行时)。在构建阶段,事物由构建系统控制,而不是由 CMake 本身控制。您使用哪个构建系统?制作?忍者?
  • 哎呀,忘了提到构建系统,虽然我已经记住了。请参阅上面的编辑。

标签: cmake cmake-custom-command


【解决方案1】:

一般来说,编辑自动生成的文件是个坏主意。

如果您只想生成一次文件,请考虑在配置步骤中使用execute_process 来生成它们,而不是构建步骤。

否则,如果您确实需要在构建期间生成它们,您最好安排这样的方式,即无需编辑这些文件即可插入用户代码。

【讨论】:

  • 谢谢,你是对的。但我还不能改变它,因为它是一个复杂的软件,而我目前的任务是通过转换为 CMake 来使构建系统现代化。我已经在 CMake 配置期间发现并应用了 execute_process 进行初始生成,但在某些情况下,我还需要在以后的构建中重新生成。
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多