首页 > 解决方案 > 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生成器观察到了这种行为,它在我的 Ubuntu 16.04 系统上默认使用。

标签: cmakecmake-custom-command

解决方案


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

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

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


推荐阅读