【CMake】CMake从入门到实战系列(十二)——CMake中如何执行shell命令(1)

前言

在CMake中执行shell命令主要涉及三个指令:execute_process、add_custom_command、add_custom_target。我们将分别对每个指令做一下总结,并用示例代码加深理解。

本章对指令execute_process进行一下总结,下一篇文章对add_custom_command和add_custom_target进行总结。

execute_process

一、基本语法
execute_process(COMMAND <cmd1> [<arguments>]
                [COMMAND <cmd2> [<arguments>]]...
                [WORKING_DIRECTORY <directory>]
                [TIMEOUT <seconds>]
                [RESULT_VARIABLE <variable>]
                [RESULTS_VARIABLE <variable>]
                [OUTPUT_VARIABLE <variable>]
                [ERROR_VARIABLE <variable>]
                [INPUT_FILE <file>]
                [OUTPUT_FILE <file>]
                [ERROR_FILE <file>]
                [OUTPUT_QUIET]
                [ERROR_QUIET]
                [COMMAND_ECHO <where>]
                [OUTPUT_STRIP_TRAILING_WHITESPACE]
                [ERROR_STRIP_TRAILING_WHITESPACE]
                [ENCODING <name>]
                [ECHO_OUTPUT_VARIABLE]
                [ECHO_ERROR_VARIABLE]
                [COMMAND_ERROR_IS_FATAL <ANY|LAST>])
二、参数含义

各选项说明如下:

COMMAND:待执行的命令,可以指定多个。

WORKING_DIRECTORY:将指定的目录作为命令执行的当前工作目录。

TIMEOUT:设置命令执行的超时时间,单位是秒,可以不是整数。过了设置的超时时间,所有命令会被终止,RESULT_VARIABLE会被设置为“timeout”

RESULT_VARIABLE:包含命令的执行结果,该变量会被设置为最后一个命令执行的返回码,或执行出错时候的描述字符串。

RESULTS_VARIABLE:3.10版本引入。将所有的命令执行结果存入该变量中,命令的执行结果以分号连接,存储的顺序按照COMMAND命令的顺序。

OUTPUT_VARIABLE:对应于标准输出的内容,存储最后一个命令的运行结果。

ERROR_VARIABLE:对应于标准错误的内容,存储所有命令错误。

INPUT_FILE:指定文件作为第一个命令的标准输入。

OUTPUT_FILE:指定文件作为最后一个命令的标准输出。

ERROR_FILE:所有命令运行错误结果存储的文件

OUTPUT_QUIET/ERROR_QUIET:忽略标准输出和标准错误。

COMMAND_ECHO:重显命令到指定的标准设备,如STDERR、STDOUT、NONE。使用CMAKE_EXECUTE_PROCESS_COMMAND_ECHO变量来修改它的行为

OUTPUT_STRIP_TRAILING_WHITESPACE/ERROR_STRIP_TRAILING_WHITESPACE:删除空白字符

ENCODING:在windows系统上指定命令输出时的解码方式,默认是utf-8,其他平台会忽略该参数

ECHO_OUTPUT_VARIABLE/ECHO_ERROR_VARIABLE:输出将被复制,它将被发送到配置的变量中,也会在标准输出或标准错误中,3.18版本支持

COMMAND_ERROR_IS_FATAL:触发致命错误并终止命令执行,方式取决于参数ANY和LAST。ANY表示任意命令执行失败都触发,LAST表示最后一个命令执行失败才触发,3.19版本支持

三、示例

示例源码下载地址:CMake从入门到实战系列(十二)-CMake中如何执行shell命令(1)

1、COMMAND 、WORKING_DIRECTORY

示例源码 demo0

execute_process(COMMAND pwd
				WORKING_DIRECTORY "/home")

编译结果
在这里插入图片描述

2、TIMEOUT

示例源码 demo1

execute_process(COMMAND sleep 5
				COMMAND sleep 5
				TIMEOUT 1
				RESULT_VARIABLE msg)
message("1 commands execute result: ${msg}")

编译结果
在这里插入图片描述

3、RESULT_VARIABLE 、RESULTS_VARIABLE

示例源码 demo2

execute_process(COMMAND rm test.txt
				RESULT_VARIABLE msg)
message("2 command execute result: ${msg}")

execute_process(COMMAND ls -al
				COMMAND rm test.txt
				RESULTS_VARIABLE msg_all)
message("3 command execute result: ${msg_all}")

编译结果
在这里插入图片描述

4、OUTPUT_VARIABLE 、ERROR_VARIABLE

示例源码 demo3

execute_process(COMMAND echo "start"
		 		COMMAND rm "test1.txt"
		 		COMMAND pwd
		 		COMMAND rm "test2.txt"
		 		COMMAND pwd
		 		WORKING_DIRECTORY "/home"
		 		RESULTS_VARIABLE msg_result
		 		OUTPUT_VARIABLE msg_out
		 		ERROR_VARIABLE msg_err)
MESSAGE("4 Commands execute results: ${msg_result}")
MESSAGE("Commands output: ${msg_out}")
MESSAGE("Commands error: ${msg_err}")

编译结果
在这里插入图片描述

5、INPUT_FILE、OUTPUT_FILE、ERROR_FILE

示例源码 demo4
在demo4目录中创建文件text.txt,内容是[test.txt]
在这里插入图片描述

execute_process(COMMAND cat
                INPUT_FILE ${CMAKE_SOURCE_DIR}/test.txt
                OUTPUT_VARIABLE CAT_OUTPUT)
message(STATUS "The output of cat command was: ${CAT_OUTPUT}")

execute_process(COMMAND rm "test1.txt"
                COMMAND rm "test2.txt"
                COMMAND echo "write message to output"
                OUTPUT_FILE output
                ERROR_FILE error)

编译结果
在这里插入图片描述

6、OUTPUT_QUIET 、ERROR_QUIET

示例源码 demo5

execute_process(COMMAND pwd
		OUTPUT_VARIABLE msg_out)
MESSAGE("5 Commands execute results: ${msg_out}")
execute_process(COMMAND pwd
		OUTPUT_VARIABLE msg_out
		OUTPUT_QUIET)
MESSAGE("6 Commands execute results: ${msg_out}")

编译结果
在这里插入图片描述

7、COMMAND_ECHO

示例源码 demo6

execute_process(COMMAND echo "execute commad"
 		COMMAND ls "CMakeFiles"
 		COMMAND_ECHO STDERR)

编译结果
在这里插入图片描述

8、ECHO_OUTPUT_VARIABLE 、ECHO_ERROR_VARIABLE

示例源码 demo7

execute_process(COMMAND echo "hello world"
 		OUTPUT_VARIABLE var_output)
MESSAGE("-------------------")
execute_process(COMMAND echo "hello world"
 		OUTPUT_VARIABLE var_output
 		ECHO_OUTPUT_VARIABLE)
MESSAGE("-------------------")

编译结果
在这里插入图片描述

9、COMMAND_ERROR_IS_FATAL

示例源码 demo8

execute_process(COMMAND pwd
 		COMMAND rm "test.txt"
 		COMMAND echo "hello world"
 		COMMAND_ERROR_IS_FATAL LAST)

编译结果
在这里插入图片描述

execute_process(COMMAND pwd
		COMMAND rm "test.txt"
		COMMAND echo "hello world"
		COMMAND_ERROR_IS_FATAL ANY)

编译结果
在这里插入图片描述

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值