执行一个或多个子进程(cmake:使用execute_process调用shell命令或脚本)。

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:

    • 一个子进程命令行。
    • CMake直接使用操作系统api执行子进程。所有参数都被逐字传递给子进程。没有使用中间shell,所以像>这样的shell操作符被视为普通参数。(使用INPUT_*、OUTPUT_*和ERROR_*选项重定向stdin、stdout和stderr。)
    • 如果需要连续执行多个命令,请使用多个execute_process()调用,并使用单个COMMAND参数。
  • WORKING_DIRECTORY:

    • 命名目录将被设置为子进程的当前工作目录。
  • TIMEOUT:

    • 在指定的秒数(允许分数)之后,所有未完成的子进程将被终止,RESULT_VARIABLE将被设置为一个提到“超时”的字符串。
  • RESULT_VARIABLE:

    • 该变量将被设置为包含最后一个子进程的结果。这将是来自最后一个子节点的整数返回代码或描述错误条件的字符串。
  • RESULTS_VARIABLE < variable>

    • 3.10新版功能。
    • 该变量将按照给定的COMMAND参数的顺序,以分号分隔的列表的形式包含所有进程的结果。每个条目将是来自相应子条目的一个整数返回代码或描述错误条件的字符串。
  • OUTPUT_VARIABLE, ERROR_VARIABLE

    • 变量名将分别用标准输出管道和标准错误管道的内容设置。如果为两个管道命名相同的变量,它们的输出将按生成的顺序合并。
  • INPUT_FILE、OUTPUT_FILE ERROR_FILE

    • 命名的文件将分别附加到第一个进程的标准输入、最后一个进程的标准输出或所有进程的标准错误
    • 3.3新版功能:如果同一个文件同时被输出和错误命名,那么它将同时被使用。
  • OUTPUT_QUIET, ERROR_QUIET:标准输出或标准错误结果将被悄悄地忽略。

  • COMMAND_ECHO < where>

    • 正在运行的命令将回显到< where>,而< where>设置为STDERR、STDOUT或NONE之一。
    • 请参阅CMAKE_EXECUTE_PROCESS_COMMAND_ECHO变量,了解当此选项不存在时控制默认行为的方法。
  • ENCODING < name>

    • 3.8新版功能。
    • 在Windows上,用于解码进程输出的编码。在其他平台上被忽视。有效的编码名称是:
      • NONE:执行没有解码。这假设过程输出的编码方式与CMake的内部编码(UTF-8)相同。这是默认值。
      • AUTO:使用当前活动控制台的代码页,如果不可用,则使用ANSI。
      • ANSI:使用ANSI代码页。
      • OEM:使用原始设备制造商(OEM)代码页。
      • UTF8 or UTF-8:使用UTF-8代码页。
  • ECHO_OUTPUT_VARIABLE, ECHO_ERROR_VARIABLE

    • 3.18新版功能。
    • 标准输出或标准错误不会被专门重定向到已配置的变量。
    • 输出将被重复,它将被发送到配置的变量中,也在标准输出或标准错误上。
    • 这类似于tee Unix命令。
  • COMMAND_ERROR_IS_FATAL < ANY|LAST >:

    • COMMAND_ERROR_IS_FATAL后面的选项决定遇到错误时的行为:
      • ANY:如果命令列表中的任何一个命令失败,execute_process()命令将停止并报错。
      • LAST:如果命令列表中的最后一个命令失败,execute_process()命令将停止并报错。列表中前面的命令不会导致致命错误。

如果同一个管道有多个OUTPUT_*或ERROR_*选项,则不指定优先级。如果没有给出OUTPUT_*或ERROR_*选项,输出将与CMake进程本身的相应管道共享。

例子:

  • 执行shell命令
execute_process(COMMAND <一句shell命令> WORKING_DIRECTORY <这句shell命令执行的工作目录>)
  • 执行shell脚本
execute_process(COMMAND sh test.sh WORKING_DIRECTORY <test.sh所在目录>)

注:在调用一个execute_process时可以顺序执行多条COMMAND命令。

扩展:

  • 在cmake中也可以通过add_custom_comand 和 add_custom_target执行shell命令,但是他们是一般执行命令跟target的生成有关;
  • 而execute_process只是简单地在cmake执行编译之前调用shell命令,具体使用需要结合需求来选择!

execute_process()命令是exec_program()的一个更强大的新版本,但是为了兼容性,保留了旧的命令。当CMake在生成系统之前处理项目时,这两个命令都在运行。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐