在我的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系统上使用它。
答案 0 :(得分:0)
通常,编辑自动生成的文件是一个坏主意。
如果您只想生成一次文件,请考虑在配置步骤中使用execute_process
生成文件,而不是构建文件。
否则,如果你真的需要在构建期间生成它们,你最好安排一些东西,即插入用户代码而不编辑这些文件。