CMake 手冊詳解(21-23)
CMD#65: separate_arguments
將空格分隔的引數解析為一個分號分隔的list。
separate_arguments(<var> <UNIX|WINDOWS>_COMMAND "<args>")
解析一個unix或者windows風格的命令列字串"<args>",並將結果以分號分隔的list的形式儲存到<var>中。整個命令列都必須從這個"<args>"引數中給出。
UNIX_COMMAND模式以沒有被括起來的白字元為引數的分隔符。它可以識別單引號和雙引號的引號對。反斜槓可以對下一個字元的字面值轉義(\",就是");沒有其他特殊的轉義字元(例如\n就是n)。
WINDOWS_COMMAND模式按照與執行時庫相同的語法解析一個windows命令列,在啟動(starrtup)時構造argv。它使用沒有被雙引號括起來的白字元來分隔引數。反斜槓維持其字面含義,除非它們在雙引號之前。更多細節,參見MSDN的文章:"Parsing C Command-Line Arguments"。
separate_arguments(VARIABLE)
將VARIABLE的值轉換為一個分號分隔的list。所有的空格會被替換為';'。該命令可以用來輔助生成命令列。
CMD#66: set
將一個CMAKE變數設定為給定值。
set(<variable> <value>[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
將變數<variable>的值設定為<value>。在<variable>被設定之前,<value>會被展開。如果有CACHE選項,那麼<variable>就會新增到cache中;這時<type>和<docstring>是必需的。<type>被CMake GUI用來選擇一個視窗,讓使用者設定值。<type>可以是下述值中的一個:
FILEPATH = 檔案選擇對話方塊。PATH = 路徑選擇對話方塊。 STRING = 任意的字串。 BOOL = 布林值選擇複選框。 INTERNAL = 不需要GUI輸入端。(適用於永久儲存的變數)。
如果<type>是內部的(INTERNAL),那麼<value>總是會被寫入到cache中,並替換任何已經存在於cache中的值。如果它不是一個cache變數,那麼這個變數總是會寫入到當前的makefile中。FORCE選項將覆蓋cache值,從而去掉任何使用者帶來的改變。
如果指定了PARENT_SCOPE選項,變數<variable>將會被設定為當前作用域之上的作用域中。每一個新的路徑或者函式都可以建立一個新作用域。該命令將會把一個變數的值設定到父路徑或者呼叫函式中(或者任何類似的可用的情形中。)
如果沒有指定<value>,那麼這個變數就會被撤銷而不是被設定。另見:unset()命令。
set(<variable> <value1> ... <valueN>)
在這種情形下,<variable>被設定為一個各個值之間由分號分隔的list。
<variable>可以是環境變數,比如:
set( ENV{PATH} /home/martink )
在這種情形下,環境變數將會被設定。
CMD#67: set_directory_properties
設定某個路徑的一種屬性。
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
為當前的路徑及其子路徑設定一種屬性。如果該屬性不存在,CMake將會報告一個錯誤。屬性包括:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, INCLUDE_REGULAR_EXPRESSION, 以及ADDITIONAL_MAKE_CLEAN_FILES共四種。ADDITIONAL_MAKE_CLEAN_FILES是一個檔名的list,其中包含有"make clean"階段會被清除掉的檔案。
CMD#68: set_property
在給定的作用域內設定一個命名的屬性。
set_property(<GLOBAL | DIRECTORY [dir] | TARGET [target1 [target2 ...]] | SOURCE [src1 [src2 ...]] | TEST [test1 [test2 ...]] | CACHE [entry1 [entry2 ...]]> [APPEND] PROPERTY <name> [value1 [value2 ...]])
為作用域裡的0個或多個物件設定一種屬性。第一個引數決定了屬性可以影響到的作用域。他必須是下述值之一:GLOBAL,全域性作用域,唯一,並且不接受名字。DIRECTORY,路徑作用域,預設為當前路徑,但是也可以用全路徑或相對路徑指定其他值。TARGET,目標作用域,可以命名0個或多個已有的目標。SOURCE,源作用域,可以命名0個或多個原始檔。注意,原始檔屬性只對加到相同路徑(CMakeLists.txt)中的目標是可見的。TEST 測試作用域可以命名0個或多個已有的測試。CACHE作用域必須指定0個或多個cache中已有的條目。
PROPERTY選項是必須的,並且要緊跟在待設定的屬性的後面。剩餘的引數用來組成屬性值,該屬性值是一個以分號分隔的list。如果指定了APPEND選項,該list將會附加在已有的屬性值之後。
CMD#69: set_source_files_properties
原始檔有一些屬性來可以改變它們構建的方式。
set_source_files_properties([file1 [file2 [...]]] PROPERTIES prop1 value1 [prop2 value2 [...]])
以鍵/值對的方式設定與原始檔相關的那些屬性值。那些CMake中的原始檔屬性,參見關於屬性的相關文件。不能被識別的屬性將會被忽略。原始檔屬性只對同一路徑(CMakeLists.txt)中新增的目標可見。
CMD#70: set_target_properties
設定目標的一些屬性來改變它們構建的方式。
set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)
為一個目標設定屬性。該命令的語法是列出所有你想要變更的檔案,然後提供你想要設定的值。你能夠使用任何你想要的屬性/值對,並且在隨後的程式碼中呼叫GET_TARGET_PROPERTY命令取出屬性的值。
影響一個目標輸出檔案的名字的屬性詳述如下。PREFIX和SUFFIX屬性覆蓋了預設的目標名字首(比如lib)和字尾(比如.so)。IMPORT_PREFIX和IMPORT_SUFFIX是與之等價的屬性,不過針對的是DLL(共享庫目標)的匯入庫。在構建目標時,OUTPUT_NAME屬性設定目標的真實名字,並且可以用來輔助建立兩個具有相同名字的目標,即使CMake需要唯一的邏輯目標名。<CONFIG>_OUTPUT_NAME可以為不同的配置設定輸出的目標名字。當目標在指定的配置名<CONFIG>(全部大寫,例如DEBUG_POSTFIX)下被構建時,<CONFIG>_POSTFIX為目標的真實名字設定一個字尾。該屬性的值在目標建立時被初始化為CMAKE_<CONFIG>_POSTFIX的值(可執行目標除外,因為較早的CMake版本不會為可執行檔案使用這個屬性。)
LINK_FLAGS屬性可以用來為一個目標的連結階段新增額外的標誌。LINK_FLAGS_<CONFIG>將為配置<CONFIG>新增連結標誌,例如DEBUG,RELEASE,MINSIZEREL,RELWITHDEBINFO。DEFINE_SYMBOL屬性設定了編譯一個共享庫中的原始檔時才會被定義的前處理器符號名。如果這個值沒有被設定的話,那麼它會被設定為預設值target_EXPORTS(如果目標不是一個合法的C標示符的話可以用一些替代標誌)。這對於檢測標頭檔案是包含在它們的庫以內還是以外很有幫助,從而可以合理設定dllexport/dllimport修飾符(注意,只有在編譯到的時候,這個符號才會被定義;因此猜測在程式碼中,判斷預處理符號是否被定義可以知道依賴庫是匯入的還是匯出的——譯註)。COMPILE_FLAGS屬性可以設定附加的編譯器標誌,它們會在構建目標內的原始檔時被用到。它也可以用來傳遞附加的前處理器定義。
LINKER_LANGUAGE屬性用來改變連結可執行檔案或共享庫的工具。預設的值是設定與庫中的檔案相匹配的語言。CXX和C是這個屬性的公共值。
對於共享庫,VERSION和SOVERSION屬性分別可以用來指定構建的版本號以及API版本號。當構建或者安裝時,如果平臺支援符號連結並且連結器支援so名字,那麼恰當的符號連結會被建立。如果只指定兩者中的一個,缺失的另一個假定為具有相同的版本號。對於可執行檔案,VERSION可以被用來指定構建版本號。當構建或者安裝時,如果該平臺支援符號連結,那麼合適的符號連結會被建立。對於在Windows系統而言,共享庫和可執行檔案的VERSION屬性被解析成為一個"major.minor"的版本號。這些版本號被用做該二進位制檔案的映象版本。
還有一些屬性用來指定RPATH規則。INSTALL_RPATH是一個分號分隔的list,它指定了在安裝目標時使用的rpath(針對支援rpath的平臺而言)(-rpath在gcc中用於在編譯時指定載入動態庫的路徑;優先順序較系統庫路徑要高。詳情參見http://www.cmake.org/Wiki/CMake_RPATH_handling#What_is_RPATH_.3F——譯註)。INSTALL_RPATH_USE_LINK_PATH是一個布林值屬性,如果它被設定為真,那麼在連結器的搜尋路徑中以及工程之外的目錄會被附加到INSTALL_RPATH之後。SKIP_BUILD_RPATH是一個布林值屬性,它指定了是否跳過一個rpath的自動生成過程,從而可以從構建樹開始執行。BUILD_WITH_INSTALL_RPATH是一個布林值屬性,它指定了是否將在構建樹上的目標與INSTALL_RPATH連結。該屬性要優先於SKIP_BUILD_RPATH,因此避免了安裝之前的重新連結。INSTALL_NAME_DIR是一個字串屬性,它用於在Mac OSX系統上,指定了被安裝的目標中使用的共享庫的"install_name"域的目錄部分。如果目標已經被建立,變數CMAKE_INSTALL_RPATH, CMAKE_INSTALL_RPATH_USE_LINK_PATH, CMAKE_SKIP_BUILD_RPATH, CMAKE_BUILD_WITH_INSTALL_RPATH和CMAKE_INSTALL_NAME_DIR的值會被用來初始化這個屬性。
PROJECT_LABEL屬性可以用來在IDE環境,比如visual studio,中改變目標的名字。 VS_KEYWORD可以用來改變visual studio的關鍵字,例如如果該選項被設定為Qt4VSv1.0的話,QT整合將會執行得更好。
VS_SCC_PROJECTNAME, VS_SCC_LOCALPATH, VS_SCC_PROVIDER可以被設定,從而增加在一個VS工程檔案中對原始碼控制繫結的支援。
PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT屬性是在安裝一個目標之前及之後指定執行CMake指令碼的舊格式。只有當使用舊式的INSTALL_TARGETS來安裝目標時,才能使用這兩個屬性。使用INSTALL命令代替這種用法。
EXCLUDE_FROM_DEFAULT_BUILD屬性被visual studio生成器使用。如果屬性值設定為1,那麼當你選擇"構建解決方案"時,目標將不會成為預設構建的一部分。
CMD#71: set_tests_properties
設定若干個測試的屬性值。
set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)
為若干個測試設定一組屬性。若屬性未被發現,CMake將會報告一個錯誤。這組屬性包括:WILL_FAIL, 如果設定它為true,那將會把這個測試的“通過測試/測試失敗”標誌反轉。PASS_REGULAR_EXPRESSION,如果它被設定,這個測試的輸出將會被檢測是否違背指定的正則表示式,並且至少要有一個正則表示式要匹配;否則測試將會失敗。
例子: PASS_REGULAR_EXPRESSION "TestPassed;All ok"
FAIL_REGULAR_EXPRESSION: 如果該屬性被設定,那麼只要輸出匹配給定的正則表示式中的一個,那麼測試失敗。
例子: PASS_REGULAR_EXPRESSION "[^a-z]Error;ERROR;Failed"
PASS_REGULAR_EXPRESSION和FAIL_REGULAR_EXPRESSION屬性都期望一個正則表示式列表(list)作為其引數。
TIMEOUT: 設定該屬性將會限制測試的執行時長不超過指定的秒數。
CMD#72: site_name
將給定的變數設定為計算機名。
site_name(variable)
為Makefile中的原始檔定義一個分組。CMD#73:
source_group
source_group(name [REGULAR_EXPRESSION regex] [FILES src1 src2 ...])
為工程中的原始檔中定義一個分組。這主要用來在Visual Studio中建立檔案組按鈕(file tabs)。所有列出來的檔案或者匹配正則表示式的檔案都會被放到這個檔案組中。如果一個檔案匹配多個組,那麼最後明確地列出這個檔案的組將會包含這個檔案,如果有這樣的組的話。如果沒有任何組明確地列出這個檔案,那麼最後那個其正則表示式與該檔名匹配的組,將會成為最終候選者。
組名中可以包含反斜槓,以指定子檔案組:source_group(outer\\inner ...)
為了保持後向相容性,這個命令也支援這種格式:source_group(name regex)
CMD#74: string
字串操作函式。
string(REGEX MATCH <regular_expression> <output variable> <input> [<input>...]) string(REGEX MATCHALL <regular_expression> <output variable> <input> [<input>...]) string(REGEX REPLACE <regular_expression> <replace_expression> <output variable> <input> [<input>...]) string(REPLACE <match_string> <replace_string> <output variable> <input> [<input>...]) string(COMPARE EQUAL <string1> <string2> <output variable>) string(COMPARE NOTEQUAL <string1> <string2> <output variable>) string(COMPARE LESS <string1> <string2> <output variable>) string(COMPARE GREATER <string1> <string2> <output variable>) string(ASCII <number> [<number> ...] <output variable>) string(CONFIGURE <string1> <output variable> [@ONLY] [ESCAPE_QUOTES]) string(TOUPPER <string1> <output variable>) string(TOLOWER <string1> <output variable>) string(LENGTH <string> <output variable>) string(SUBSTRING <string> <begin> <length> <output variable>) string(STRIP <string> <output variable>) string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output variable>)
REGEX MATCH : 匹配正則表示式一次,然後將匹配的值儲存到輸出變數中。
REGEX MATCHALL : 儘可能多次地匹配正則表示式,然後將匹配的值以list的形勢儲存到輸出變數中。
REGEX REPLACE : 儘可能多次地匹配正則表示式,並且將匹配的值用replacement expression 替換掉,然後儲存到輸出變數中。這個replace expression 可以引用包含匹配字串的子表示式,這些匹配的字串用圓括號隔開的\1,\2,...,\9等加以引用。注意:在CMake程式碼裡,如果要使用一個反斜槓,必須要用兩個反斜槓(\\1)轉義,才能通過引數解析。
REPLACE : 將輸入字串內所有出現match_string的地方都用replace_string代替,然後將結果儲存到輸出變數中。
COMPARE EQUAL/NOTEQUAL/LESS/GREATER : 將會比較兩個字串,然後將比較的結果(true/false)儲存到輸出變數中。
ASCII : 將會把所有數字轉換為對應的ASCII字元。
CONFIGURE : 將一個字串進行變換,這種變換與將一個FILE變換為CONFIGURE_FILE相似。
TOUPPER/TOLOWER : 將字串轉換為大寫/小寫字元。
LENGTH : 返回給定字串的長度。
SUBSTRING : 返回給定字串的子串。
STRIP : 返回一個給定字串的子串,它會去掉原先字串開始和結尾的空格。
RANDOM : 將會返回一個給定長度的隨機字串,它由給定的字母表中的字母組成。預設的長度是5個字元,預設的字母表是全部的大小寫字母以及數字。如果指定了一個整數RANDOM_SEED,它的值將會被用做隨機數發生器的種子。
在正則表示式中,下述字元有特殊含義:
^ 在行首匹配。 $ 在行尾匹配。 . 匹配任意單個字元。 [ ] 匹配在中括號中的任意字元。 [^ ] 匹配不在中括號中的任意字元。 - 匹配任意在短橫線兩端字元閉區間中間的任意一個字元。 * 匹配先前模式零次或多次。 + 匹配先前模式一次或多次。 ? 匹配先前模式零次或一次。 | 匹配|兩側的任意一種模式。 () 儲存一個匹配的子表示式,這個子表示式後續可以在REGEX REPLACE操作中以\n的方式引用。 它也會被所有正則表示式相關的命令所儲存;包括,比如, 如果用到if( MATCHES )命令的話,這些匹配的值被儲存在變數CMAKE_MATCH_(0..9)中。
CMD#75: target_link_libraries
將給定的庫連結到一個目標上。
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)
為給定的目標設定連線時使用的庫或者標誌(flags)。如果一個庫名字與工程中的另外一個目標相匹配,一個依賴關係會自動新增到構建系統中來,這樣就可以在連結目標之前,保證正在被連結的庫是最新的。以“-”開始,但不是“-l”或“-framework”的那些項,將會被當作連結器標誌來處理。
關鍵字“debug”,“optimized”或者“general” 表示緊隨關鍵字之後的庫僅僅會被用到相應的構建配置上。“debug”關鍵字對應於除錯配置(或者,如果全域性屬性DEBUG_CONFIGURATIONS被設定的話,就是DEBUG_CONFIGURATIONS中的名字所指定的配置)。“optimized”關鍵字對應於所有其他的配置型別。“general”關鍵字對應於所有的配置,並且純粹是可選的(它是預設配置,可以省略)。通過建立並連結到匯入庫目標,可以對每種配置規則進行更細緻的粒度控制。更多內容參見add_library命令的IMPORTED模式。
預設時,庫之間的依賴性是可傳遞的。當這個目標被連結到其他目標上時,那麼連結到這個目標上的庫也會出現在其他目標的連結依賴上。參見LINK_INTERFACE_LIBRARIES屬性的相關文件,其中有關於如何覆蓋一個目標的連結依賴性傳遞設定的介紹。
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES [[debug|optimized|general] <lib>] ...)
對於LINK_INTERFACE_LIBRARIES模式,它將會把庫附加在LINK_INTERFACE_LIBRARIES以及LINK_INTERFACE_LIBRARIES在不同配置下的等價目標屬性,而不是用這些庫去連結。指定為“debug”的庫將會被附加到LINK_INTERFACE_LIBRARIES_DEBUG屬性(或者是在DEBUG_CONFIGURATIONS全域性屬性中列出的配置,如果DEBUG_CONFIGURATIONS被設定的話)。指定為“optimized”庫將會被附加到LINK_INTERFACE_LIBRARIES屬性上。指定為“general”的庫(或者沒有任何關鍵字的庫),將會被當做即被指定為“debug”又被指定為“optimized”對待。
庫之間的依賴圖通常是非迴圈圖(DAG),但是如果出現互相依賴的靜態庫,CMake會允許依賴圖中包含迴圈依賴(強連通分支)。當其它目標連結到這些庫中的一個時,CMake會重複整個連通分支。例如,程式碼:
1 2 3 4 5 6 |
add_library(A
STATIC a.c)
add_library(B
STATIC b.c)
target_link_libraries(A
B)
target_link_libraries(B
A)
add_executable(main
main.c)
target_link_libraries(main
A)
|
將“main”連結到了“A B A B”。(雖然通常一次重複就足夠了,但是病態物件檔案以及符號排布可能需要多次重複。你可以通過在上一次target_link_libraries呼叫中手動重複該分支來處理這種情況。不過,如果兩個歸檔檔案確實是如此緊密的相互關聯,它們可能會被合併為一個單一的歸檔檔案。)
CMD#76: try_compile
嘗試編譯一些程式碼。
try_compile(RESULT_VAR bindir srcdir projectName <targetname> [CMAKE_FLAGS <Flags>] [OUTPUT_VARIABLE var])
嘗試編譯一個程式。在這種格式時,srcdir路徑下應該包含一個完整的CMake工程,包括CMakeLists.txt檔案以及所有的原始檔。在該命令執行完之後,路徑bindir和srcdir不會被刪除。如果指定了<target name>,那麼CMake將只構建那個目標;否則,目標all或ALL_BUILD將會被構建。
try_compile(RESULT_VAR bindir srcfile [CMAKE_FLAGS <Flags>] [COMPILE_DEFINITIONS <flags> ...] [OUTPUT_VARIABLE var] [COPY_FILE <filename> )
嘗試編譯一個srcfile。在這種情況下,使用者僅僅需要提供原始檔。CMake會建立合適的CMakeLists.txt檔案來構建原始檔。如果使用了COPY_FILE選項,編譯出的檔案將會被拷貝到給定的檔案那裡。
在這個版本里,所有在bindir/CMakeFiles/CMakeTmp資料夾下的檔案,將會被自動清除;通過向CMake傳遞除錯選項--debug-trycompile可以避免這個清除步驟。另外一些可以包含的額外標誌有:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, 和LINK_LIBRARIES。COMPILE_DEFINITIONS是通過-Ddefinations選項設定的預定義符號,這會傳遞到編譯器命令列。try_compile命令在構建過程中伴隨創建出的CMakeLists.txt看起來像這樣:
add_definitions( <expanded COMPILE_DEFINITIONS from calling cmake>) include_directories(${INCLUDE_DIRECTORIES}) link_directories(${LINK_DIRECTORIES}) add_executable(cmTryCompileExec sources) target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})
在該命令的這兩種版本里,如果指定了OUTPUT_VARIABLE,那麼構建過程的輸出會儲存到給定的變數裡。編譯成功或失敗的結果,會通過RESULT_VAR返回。CMAKE_FLAGS可以用來向正在構建的CMake傳遞-DVAR:TYPE = VALUE 符號。
CMD#77: try_run
嘗試編譯並執行某些程式碼。
try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR bindir srcfile [CMAKE_FLAGS <Flags>] [COMPILE_DEFINITIONS <flags>] [COMPILE_OUTPUT_VARIABLE comp] [RUN_OUTPUT_VARIABLE run] [OUTPUT_VARIABLE var] [ARGS <arg1> <arg2>...])
嘗試編譯一個原始檔srcfile。通過變數COMPILE_RESULT_VAR返回TRUE或者FALSE來反應編譯是否失敗。如果構建出了可執行檔案,但是不能執行,那麼RUN_RESULT_VAR會被設定為FAILED_TO_RUN。COMPILE_OUTPUT_VARIABLE變數指定了一個變數,這個變數儲存了構建步驟輸出的資訊。RUN_OUTPUT_VARIABLE指定了一個變數,這個變數儲存了執行可執行檔案時的輸出。出於相容性的考慮,OUTPUT_VARIABLE還會被支援,它包含了包含編譯和執行階段的輸出資訊。
交叉編譯相關問題
當執行交叉編譯時,第一步中編譯出的可執行檔案通常不能在編譯宿主機上直接執行。try_run()函式會檢查CMAKE_CROSSCOMPILING變數來檢測CMake是否是交叉編譯模式。如果是的話,CMake還是會嘗試編譯可執行檔案,但是它不會嘗試執行可執行檔案。相反,他會建立一些cache變數,這些變數必須由使用者填充,或者在某個CMake指令碼中預先設定為那些在真實目標機平臺上執行的結果。這些變數有:RUN_RESULT_VAR (解釋參見上文),以及如果使用了RUN_OUTPUT_VARIABLE (或者OUTPUT_VARIABLE) ,還有一個附加的cache變數RUN_RESULT_VAR__COMPILE_RESULT_VAR__TRYRUN_OUTPUT。該變數是為了儲存執行過程中stdout和stderr的輸出。
為了讓交叉編譯更加容易些,必要時再使用try_run命令。如果你使用了try_run命令,那麼只有必要時才使用RUN_OUTPUT_VARIABLE(或者OUTPUT_VARIABLE)變數。在交叉編譯時,使用這些變數需要cache變數必須被手動設定為可執行檔案的輸出。你也可以用if(CMAKE_CROSSCOMPILING)將try_run的呼叫“保護”起來,同時還要為這種情形給定一個易於預先設定的備選方案。
CMD#78 unset
撤銷對一個變數,cache變數或者環境變數的設定。
unset(<variable> [CACHE])
刪除一個指定的變數,讓它變成未定義的。如果指定了CACHE選項,那麼這個變數將會從cache中刪除而不是當前作用域。<variable>可以是一個環境變數,比如:
unset(ENV{LD_LIBRARY_PATH})
在這個例子中,這個變數將會從當前的環境中被刪除。
CMD#79 : variable_watch
監視CMake變數的改變。
variable_watch(<variable name> [<command to execute>])
如果給定的變數發生了變化,關於正在被改寫的變臉的訊息會被打印出來。如果指定了command選項,這條命令會被執行。這條命令會接受這樣的引數:COMMAND(<variable> <access> <value> <current list file> <stack>)
CMD#80: while
當條件為真時,評估(執行)一組命令。
while(condition) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... endwhile(condition)
所有在while和與之配對的endwhile之間的命令將會被記錄,但並不會執行。只有當endwhile被評估,並且條件為真時,這個命令列表的記錄才會被呼叫。條件值的評估與if命令使用相同的邏輯。