我需要使用add_custom_command
执行一个命令并捕获它的标准输出,但将 shell 重定向到文件>
无法工作,并且add_custom_command
没有任何相关选项。我怎么能做到呢?
我需要使用add_custom_command
执行一个命令并捕获它的标准输出,但将 shell 重定向到文件>
无法工作,并且add_custom_command
没有任何相关选项。我怎么能做到呢?
>
与文件名之间的空格的不幸组合。>
与文件名之间有一个空格,在大多数情况下,即使使用VERBATIM,它也可以正常工作。add_custom_command(OUTPUT ${some-file}
COMMAND cmake --version > ${some-file}
VERBATIM # optional
)
关于另一种解决方案的说明: 之前我认为add_custom_command
和execute_process
一样不使用中间 shell,所以建议调用包含一个execute_process
命令并使用OUTPUT_FILE
选项重定向其输出的CMake脚本来运行实际命令。
如果由于某种原因上述解决方案仍然无法解决问题,请尝试使用ExecuteProcessWrapper.cmake进行替代解决。
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
)
.sh
文件中并运行该文件。这样,您就不必费心思考如何在cmake
中编写这样的脚本。它还使得维护和其他程序员帮助脚本变得更加容易。对于一行命令可能不那么重要,但它经常从一行开始,最终成为一个2,000行的脚本...add_custom_command(
OUTPUT
${some-file}
COMMAND
${CMAKE_SOURCE_DIR}/my-script.sh ${some-file}
WORKING_DIRECTORY
${CMAKE_BINARY_DIR}
)
我也喜欢使用WORKING_DIRECTORY
,以便在执行脚本时清楚地知道我们从哪里开始。
P.S. 脚本需要可执行:
chmod 755 my-script.sh
然而,在您的特定情况下,您也可以考虑执行命令并将结果保存在文件中,如下所示:
execute_process(
COMMAND
cmake --version
OUTPUT_FILE
${some-file}
)
这样做可能会更加清晰。
在这种情况下需要记住的一件事是:执行顺序将会不同。 execute_process()
在语句解析时发生。 add_custom_command()
在其输出被要求时执行,通常是通过 add_custom_target()
实现。
cmd.exe /c
。并且管道命令已在CMake的自定义命令单元测试中进行了测试。 - FlorianVERBATIM
不能防止重定向。例如,可以看看这个答案:https://dev59.com/JY3da4cB1Zd3GeqPxUI1#31558761。 - Tsyvarev>
后尝试添加一个空格,因为我认为管道命令会以特殊方式处理。参见 BUG: Do not escape shell operators when generating command lines 和 CMAKE add_custom_command: How to use my raw commands。 - Florian