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會重復整個連通分支。例如,代碼:
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命令使用相同的邏輯。