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_FILE
和 ERROR_FILE
指定相同的 <file>
,則它將用於標準輸出和標準錯誤管線。
OUTPUT_QUIET
、ERROR_QUIET
OUTPUT_VARIABLE
上的標準輸出或ERROR_VARIABLE
上的標準錯誤未連接(沒有變數內容)。*_FILE
和ECHO_*_VARIABLE
選項不受影響。OUTPUT_VARIABLE
、ERROR_VARIABLE
指定的變數將設定為標準輸出和標準錯誤管線的內容。如果為兩個管線指定相同的變數,它們的輸出將按照產生的順序合併。
ECHO_OUTPUT_VARIABLE
、ECHO_ERROR_VARIABLE
在 3.18 版本加入。
標準輸出或標準錯誤將不會獨佔地重新導向到指定的變數。
輸出將複製到指定的變數,並且也複製到標準輸出或標準錯誤,類似於 Unix
tee
命令。
注意
如果為同一個管線指定多個 OUTPUT_*
或 ERROR_*
選項,則優先順序*未指定*。 如果未指定 OUTPUT_*
或 ERROR_*
選項,則輸出將與 CMake 程序本身的相應管線共享。
COMMAND_ECHO <where>
在 3.15 版本加入。
正在執行的命令將會 echo 到
<where>
,其中<where>
設定為STDERR
、STDOUT
或NONE
之一。 請參閱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_VARIABLE
或RESULTS_VARIABLE
,則會忽略CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL
。