CMake';s add_custom_命令有时删除其第一个输出?

CMake';s add_custom_命令有时删除其第一个输出?,cmake,add-custom-command,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(myP

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

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
add_custom_command(
    OUTPUT ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})
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)
现在我注意到,至少有时候
${generatedOnceSrc}
foo.h
)的第一个元素会被删除并重新生成。当然,一旦用户开始编辑生成的
foo.h
,就会出现问题

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

我的观察正确吗?

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

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
add_custom_command(
    OUTPUT ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})
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生成文件
  • CMake 3.5.1
  • Ubuntu 16.04

编辑
忘了提到我在Unix Makefiles generator中观察到了这种行为,它在我的Ubuntu 16.04系统上默认使用。

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

如果您想只生成一次文件,那么考虑在配置步骤中使用<代码> ExcUTETyPrime<代码>生成它们,而不是生成步骤。


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

谢谢,您是对的。但我还不能改变这一点,因为这是一个复杂的软件,我当前的任务是通过转换到CMake使构建系统现代化。在CMake配置期间,我已经发现并应用了初始生成的
execute\u进程
,但在某些情况下,我还需要在以后的构建中重新生成。CMake在配置阶段(当运行
CMake
时)绝对不会删除文件。在构建阶段,事情由构建系统控制,而不是由CMake本身控制。您使用哪种构建系统?制作忍者?哦,忘了提到构建系统,尽管我已经想到了。请参见上面的编辑。