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