cmake - 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
- CMake 3.5.1
- Ubuntu 16.04
编辑
忘了提到我使用Unix Makefiles生成器观察到了这种行为,它在我的 Ubuntu 16.04 系统上默认使用。
解决方案
一般来说,编辑自动生成的文件是个坏主意。
如果您只想生成一次文件,请考虑execute_process
在配置步骤中使用来生成它们,而不是在构建步骤中生成它们。
否则,如果您真的需要在构建期间生成它们,您最好安排这样的方式,即无需编辑这些文件即可插入用户代码。
推荐阅读
- postgresql - 使用单列计算排名而不使用 rank 或 rownums 函数
- html - Angular Kendo DatePicker:选择没有年份的月份和日期
- node.js - Lambda S3 getObject(从 ajax 调用触发)抛出 403 denied
- reactjs - 使用 next.js (react) 加载外部 scss 文件
- dask - 嵌套模块的 client.upload_file()
- c# - 使用 WCF 服务时出现异常
- unix - 尝试使用 echo 命令显示文件(带或不带引号)
- c# - Header 属性在 UWP CustomTextBox 中不起作用
- json - 如何解析这样的 JSON 文件?
- javascript - 继续获取错误对象 REGEXP 不是函数