【发布时间】: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