【发布时间】:2015-10-13 11:06:02
【问题描述】:
我需要用add_custom_command 执行一个命令来捕获它的标准输出。到文件> 的shell 重定向不起作用,add_custom_command 没有任何相关选项。我该怎么做?
【问题讨论】:
标签: cmake
我需要用add_custom_command 执行一个命令来捕获它的标准输出。到文件> 的shell 重定向不起作用,add_custom_command 没有任何相关选项。我该怎么做?
【问题讨论】:
标签: cmake
(请注意,由于 Florian 的评论,我在调查问题后更改了答案。有关以下编辑的更多信息)
execute_process 的文档明确指出它不使用中间 shell,因此重定向运算符在那里不起作用。
但add_custom_command 并非如此。重定向应该按预期在那里工作。 [编辑] 有时它似乎不起作用的原因是 CMake 生成器、VERBATIM 说明符以及> 和文件名之间的(缺失)空格的一些不幸组合。 p>
如果你确保> 和它在大多数情况下使用的文件名之间有一个空格,即使VERBATIM 也是如此:
add_custom_command(OUTPUT ${some-file}
COMMAND cmake --version > ${some-file}
VERBATIM # optional
)
关于替代解决方案的说明:以前我认为add_custom_command,就像execute_process 不使用中间外壳,所以我建议调用一个包含execute_process 命令的CMake 脚本,它运行实际命令,使用OUTPUT_FILE 选项重定向其输出。
如果由于某种原因上述解决方案对您来说仍然失败,请尝试使用 ExecuteProcessWrapper.cmake 的替代解决方案
【讨论】:
cmd.exe /c。并且管道命令在 CMake 的custom command unit test 中进行了测试。
add_custom_target() 中的重定向在某些情况下可能不起作用。另一方面,add_custom_command() 和add_custom_target() 都接受VERBATIM 选项,直到涉及shell 才有意义。相反,execute_process() 不接受该选项,并且对重定向有明确的评论。那么,真相在哪里?
VERBATIM 不会阻止重定向。例如,请参阅该答案:stackoverflow.com/a/31558761/3440745。
> 之后添加一个空格,因为我认为管道命令是以特殊方式处理的。见BUG: Do not escape shell operators when generating command lines 和CMAKE add_custom_command: How to use my raw commands
find_program(BASH bash HINTS /bin)
...
add_custom_command(
OUTPUT
${some-file}
COMMAND
${CMAKE_COMMAND} -E env ${BASH} -c "cmake --version > ${some-file} 2>&1"
VERBATIM
)
【讨论】: