【问题标题】:How to redirect the output of a CMake custom command to a file?如何将 CMake 自定义命令的输出重定向到文件?
【发布时间】:2015-10-13 11:06:02
【问题描述】:

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    (请注意,由于 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 的替代解决方案

    【讨论】:

    • 我认为 CMake 对自定义命令的实现可能与平台有关。您可以添加一个自定义命令不使用中间外壳的示例吗?我已经成功地将 stdout/stderr 重定向与 Ninja 和 Visual Studio 生成器一起使用。这些生成器为 Windows 上的自定义命令添加前缀 cmd.exe /c。并且管道命令在 CMake 的custom command unit test 中进行了测试。
    • 我在 CMake 开发者论坛上找到了该主题:cmake.3232098.n2.nabble.com/…。他们写道,add_custom_target() 中的重定向在某些情况下可能不起作用。另一方面,add_custom_command()add_custom_target() 都接受VERBATIM 选项,直到涉及shell 才有意义。相反,execute_process() 不接受该选项,并且对重定向有明确的评论。那么,真相在哪里?
    • 嗯,对我来说VERBATIM 不会阻止重定向。例如,请参阅该答案:stackoverflow.com/a/31558761/3440745
    • @Tsyvarev 似乎这个重定向问题在平台和生成器之间变化很大。对我来说:mingw 或 window-cmd 提示 + msvc 生成器 VERBATIM 确实会破坏重定向。
    • 问题是这些引文的来源。请尝试在> 之后添加一个空格,因为我认为管道命令是以特殊方式处理的。见BUG: Do not escape shell operators when generating command linesCMAKE add_custom_command: How to use my raw commands
    【解决方案2】:
    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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2018-06-27
      • 2013-12-21
      • 1970-01-01
      • 2022-01-24
      • 2015-10-30
      • 1970-01-01
      相关资源
      最近更新 更多