CMake的execute_process
命令似乎只能让你执行进程,而不能执行你可以传递给命令行shell的任意行。问题是,我想使用管道、文件描述符重定向等等,但似乎这是不可能的。另一个选择对我来说将非常痛苦(我想)...
我该怎么办?
PS-CMake 2.8和3.x版本的答案都很有趣。
CMake的execute_process
命令似乎只能让你执行进程,而不能执行你可以传递给命令行shell的任意行。问题是,我想使用管道、文件描述符重定向等等,但似乎这是不可能的。另一个选择对我来说将非常痛苦(我想)...
我该怎么办?
PS-CMake 2.8和3.x版本的答案都很有趣。
execute_process(
COMMAND bash "-c" "echo -n hello | sed 's/hello/world/;'"
OUTPUT_VARIABLE FOO
)
这将导致FOO
包含world
。
当然,您需要小心地转义引号和反斜杠。还要记住,运行bash只会在具有bash的平台上运行,即它在Windows上不起作用。
execute_process
命令似乎只允许您执行进程,而不是可以提供给命令shell的任意行。是的,确实在该命令的文档中写明了这一点:
所有参数都会逐字传递给子进程。不使用中间 shell,因此 shell 操作符(如 >)将被视为常规参数。
我想使用管道
在同一次execute_process
调用中,不同的COMMAND
实际上是通过管道连接起来的:
运行给定的一个或多个命令,每个进程的标准输出都会被输送到下一个进程的标准输入中。
文件描述符重定向等复杂操作似乎不可能。
对于复杂的操作,请准备一个单独的 shell 脚本,并使用execute_process
运行它。您可以使用其参数或通过预先进行的configure_file
将变量从 CMake 传递到此脚本。
我需要将两个命令依次传递,实际上我了解到execute_process
的每个COMMAND
已经被管道化了。因此,只需将命令依次添加即可解决这个问题:
execute_process(
COMMAND echo "Hello"
COMMAND sed -e 's/H/h/'
OUTPUT_VARIABLE GREETINGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
现在变量GREETINGS
被设置为hello
。
如果您确实需要大量的文件重定向(正如您所述),您可能希望编写一个外部脚本,然后从CMakeLists.txt
执行该脚本。在CMake中正确转义所有内容真的很困难。
如果您可以简化脚本为一个命令生成一个文件,另一个处理该文件等,则始终可以使用INPUT_FILE
和OUTPUT_FILE
选项。或者将文件名传递给您的命令以进行输入。
一次处理一个文件通常更加清晰。虽然我理解有些命令可能需要多个源和目标。
INPUT_FILE
的文件描述符,你可以将/dev/null
作为文件名放入其中。 - Sandburg