如何将CMake自定义命令的输出重定向到文件?

tam*_*nez 13 cmake

我需要执行add_custom_command一个捕获其标准输出的命令.shell重定向到文件>不起作用,add_custom_command并且没有任何相关选项.我该怎么做?

tam*_*nez 7

(请注意,由于Florian的评论,我在调查问题后改变了我的答案.有关下面编辑的更多信息)

execute_process明确说明它不使用中间shell 的文档,因此重定向操作符不能在那里工作.

但事实并非如此add_custom_command.重定向应按预期在那里工作.[编辑]有时它看起来不起作用的原因是CMake生成器,说明VERBATIM符和>文件名之间的(缺失)空间的一些不幸的组合.

事实证明,如果确保>在大多数情况下它与之间存在空间和文件名,即使是VERBATIM:

add_custom_command(OUTPUT ${some-file}
    COMMAND cmake --version > ${some-file}
    VERBATIM # optional
)
Run Code Online (Sandbox Code Playgroud)

关于替代解决方案的说明:之前我认为add_custom_command,就像execute_process不使用中间shell一样,所以我建议调用一个CMake脚本,其中包含一个execute_process运行实际命令的命令,使用该OUTPUT_FILE选项重定向其输出.

如果由于某种原因上面的解决方案仍然失败,请尝试使用ExecuteProcessWrapper.cmake替代解决方案

  • 我认为CMake的自定义命令的实现可能与平台有关.你能添加一个自定义命令没有使用中间shell的例子吗?我已经成功地使用了Ninja和Visual Studio生成器的stdout/stderr重定向.这些生成器在Windows上为自定义命令添加前缀`cmd.exe/c`.管道命令在CMake的[自定义命令单元测试](https://github.com/Kitware/CMake/blob/master/Tests/CustomCommand/CMakeLists.txt#L231)中进行测试. (3认同)
  • 我在 CMake 开发者论坛上找到了这个帖子:http://cmake.3232098.n2.nabble.com/Redirect-output-from-add-custom-target-td7583901.html。他们写道,在某些情况下,`add_custom_target()` 中的重定向可能不起作用。另一方面,`add_custom_command()` 和`add_custom_target()` 都接受`VERBATIM` 选项,在涉及shell 之前该选项没有任何意义。相反,`execute_process()` 不接受该选项,并且对重定向有明确的说明。那么,真相在哪里呢? (3认同)