CMake的add_custom_command有时会删除它的第一个输出吗?

时间:2018-06-12 21:19:30

标签: cmake add-custom-command

在我的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系统上使用它。

1 个答案:

答案 0 :(得分:0)

通常,编辑自动生成的文件是一个坏主意。

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

否则,如果你真的需要在构建期间生成它们,你最好安排一些东西,即插入用户代码而不编辑这些文件。