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|NONE>])

執行給定的一個或多個命令序列。

命令以管線方式並行執行,每個程序的標準輸出會導向到下一個程序的標準輸入。所有程序都使用單一標準錯誤管線。

execute_process 在 CMake 配置專案時執行命令,先於建置系統生成之前。使用 add_custom_target()add_custom_command() 命令來建立在建置時執行的自訂命令。

選項

COMMAND

子程序命令列。

CMake 直接使用作業系統 API 執行子程序

  • 在 POSIX 平台上,命令列以 argv[] 樣式陣列傳遞給子程序。不會執行中介 shell,因此 shell 運算子(例如 >)會被視為一般引數。

  • 在 Windows 平台上,命令列編碼為字串,以便使用 CommandLineToArgvW 的子程序將解碼原始引數。

    如果命令執行 .exe.com 或其他可執行檔,則不會執行中介命令直譯器,因此 shell 運算子(例如 >)會被視為一般引數。

    如果命令執行 .bat.cmd 腳本,則會透過 cmd 命令直譯器執行。命令直譯器不使用 CommandLineToArgvW,因此腳本接收到的一些引數可能會帶有多餘的引號。

    在 4.0 版本變更:.bat.cmd 腳本現在明確地透過命令直譯器執行,方法是在命令列前面加上 cmd /c call。 以前,它們是透過 cmd /c 隱含執行的,沒有 call,這是 CreateProcessW 的未公開行為。

使用 INPUT_*OUTPUT_*ERROR_* 選項來重新導向 stdin、stdout 和 stderr。

對於多個命令的**循序執行**,請使用多個各自帶有單一 COMMAND 引數的 execute_process 呼叫。

WORKING_DIRECTORY

指定的目錄將設定為子程序的目前工作目錄。

TIMEOUT

在指定的秒數(允許小數)之後,所有未完成的子程序將被終止,並且 RESULT_VARIABLE 將設定為一個字串,提及 "timeout"。

RESULT_VARIABLE

變數將被設定為包含最後一個子程序的結果。這將是最後一個子程序的整數傳回碼,或描述錯誤狀況的字串。

RESULTS_VARIABLE <variable>

在 3.10 版本加入。

變數將被設定為包含所有程序的結果,作為一個 分號分隔的列表,按照給定的 COMMAND 引數順序排列。每個條目將是相應子程序的整數傳回碼,或描述錯誤狀況的字串。

INPUT_FILE <file>

<file> 附加到 *第一個* COMMAND 程序的標準輸入管線。

OUTPUT_FILE <file>

<file> 附加到 *最後一個* COMMAND 程序的標準輸出管線。

ERROR_FILE <file>

<file> 附加到 *所有* COMMAND 程序的標準錯誤管線。

在 3.3 版本加入:如果為 OUTPUT_FILEERROR_FILE 指定相同的 <file>,則它將用於標準輸出和標準錯誤管線。

OUTPUT_QUIETERROR_QUIET

OUTPUT_VARIABLE 上的標準輸出或 ERROR_VARIABLE 上的標準錯誤未連接(沒有變數內容)。 *_FILEECHO_*_VARIABLE 選項不受影響。

OUTPUT_VARIABLEERROR_VARIABLE

指定的變數將設定為標準輸出和標準錯誤管線的內容。如果為兩個管線指定相同的變數,它們的輸出將按照產生的順序合併。

ECHO_OUTPUT_VARIABLEECHO_ERROR_VARIABLE

在 3.18 版本加入。

標準輸出或標準錯誤將不會獨佔地重新導向到指定的變數。

輸出將複製到指定的變數,並且也複製到標準輸出或標準錯誤,類似於 Unix tee 命令。

注意

如果為同一個管線指定多個 OUTPUT_*ERROR_* 選項,則優先順序*未指定*。 如果未指定 OUTPUT_*ERROR_* 選項,則輸出將與 CMake 程序本身的相應管線共享。

COMMAND_ECHO <where>

在 3.15 版本加入。

正在執行的命令將會 echo 到 <where>,其中 <where> 設定為 STDERRSTDOUTNONE 之一。 請參閱 CMAKE_EXECUTE_PROCESS_COMMAND_ECHO 變數,以了解在未出現此選項時控制預設行為的方式。

ENCODING <name>

在 3.8 版本加入。

在 Windows 上,用於解碼程序輸出的編碼。 在其他平台上忽略。 有效的編碼名稱為

NONE

不執行解碼。 這假定程序輸出以與 CMake 內部編碼 (UTF-8) 相同的方式編碼。

這是 CMake 3.14 及更早版本中的預設值。

AUTO

使用當前活動控制台的代碼頁,如果該代碼頁不可用,則使用 ANSI。

這是 CMake 3.15 到 3.30 中的預設值。

ANSI

使用 ANSI 代碼頁。

OEM

使用原始設備製造商 (OEM) 代碼頁。

UTF-8

在 3.11 版本加入。

使用 UTF-8 代碼頁。

這是自 CMake 3.31 以來的預設值。 請參閱政策 CMP0176

UTF8

使用 UTF-8 代碼頁。 不建議使用此名稱,而建議使用 UTF-8,以符合 UTF-8 RFC 命名慣例。

COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>

在 3.19 版本加入。

COMMAND_ERROR_IS_FATAL 後面的選項決定了遇到錯誤時的行為

ANY

如果命令列表中的任何命令失敗,則 execute_process() 命令將停止並顯示錯誤。

LAST

如果命令列表中的最後一個命令失敗,則 execute_process() 命令將停止並顯示錯誤。 列表前面較早的命令不會導致嚴重錯誤。

NONE

在 4.0 版本加入。

無論任何命令是否失敗,execute_process() 命令都不會停止並顯示錯誤。

在 4.0 版本加入:如果未提供,則會檢查 CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL 變數。 如果未設定該變數,則預設值為 NONE。 如果提供了 RESULT_VARIABLERESULTS_VARIABLE,則會忽略 CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL