CMD#2 :add_custom_target
添加一個目標,它沒有輸出;這樣它就老是會被構建。
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
用Name選項給定的名字添加一個目標,這個目標會引起給定的那些命令。這個目標沒有輸出文件,而且老是被認爲是過期的,即便那些命令試圖去建立一個與該目標同名的文件。使用ADD_CUSTOM_COMMAND命令能夠生成一個帶有依賴性的文件。默認狀況下,沒有目標會依賴於自定義目標。使用ADD_DEPENDENCIES命令能夠添加依賴於該目標或者被該目標依賴的目標。若是指定了ALL選項,這代表這個目標應該被添加到默認的構建目標中,這樣它每次都會被構建(命令的名字不能是ALL)。命令和選項是可選的;若是它們沒有被指定,將會產生一個空目標。若是設定了WORKING_DIRECTORY參數,該命令會在它指定的路徑下執行。若是指定了COMMENT選項,後跟的參數將會在構件的時候,在命令執行以前,被顯示出來。DEPENDS選項後面列出來的依賴目標能夠引用add_custom_command命令在相同路徑下(CMakeLists.txt)生成的輸出和文件。
若是指定了VERBATIM選項,全部傳遞到該命令的選項將會被合適地轉義;這樣,該命令調用的構建工具會接收到未經改變的參數。注意,CMake語言處理器會在add_custom_target命令在看到這些參數以前對它們進行一層轉義。推薦使用該參數,由於它保證了正確的行爲。當未指定該參數時,轉義的行爲依賴於平臺,由於CMake沒有針對於特定工具中特殊字符的保護措施。
SOURCES選項指定了會被包含到自定義目標中的附加的源文件。指定的源文件將會被添加到IDE的工程文件中,方便在沒有構建規則的狀況下可以編輯。
CMD#3 :add_definitions
爲源文件的編譯添加由-D引入的define flag。
add_definitions(-DFOO -DBAR ...)
在編譯器的命令行上,爲當前路徑以及下層路徑的源文件加入一些define flag。這個命令能夠用來引入任何flag,可是它的原意是用來引入預處理器的定義。那些以-D或/D開頭的、看起來像預處理器定義的flag,會被自動加到當前路徑的COMPILE_DEFINITIONS屬性中。爲了後向兼容,非簡單值(non-trival,指的是什麼?——譯註)的定義會被留在flags組(flags set)裏,而不會被轉換。關於在特定的域以及配置中增長預處理器的定義,參考路徑、目標以及源文件的COMPILE_DEFINITIONS屬性來獲取更多的細節。
CMD#4
爲頂層目標引入一個依賴關係。 :
add_dependencies
add_dependencies(target-name depend-target1
depend-target2 ...)
讓一個頂層目標依賴於其餘的頂層目標。一個頂層目標是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET產生的目標。爲這些命令的輸出引入依賴性能夠保證某個目標在其餘的目標以前被構建。查看ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS選項,能夠了解如何根據自定義規則引入文件級的依賴性。查看SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS選項,能夠了解如何爲目標文件引入文件級的依賴性。
CMD#5
使用給定的源文件,爲工程引入一個可執行文件。 :
add_executable
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
引入一個名爲<name>的可執行目標,該目標會由調用該命令時在源文件列表中指定的源文件來構建。<name>對應於邏輯目標名字,而且在工程範圍內必須是全局惟一的。被構建的可執行目標的實際文件名將根據具體的本地平臺建立出來(好比<name>.exe或者僅僅是<name>)。
默認狀況下,可執行文件將會在構建樹的路徑下被建立,對應於該命令被調用的源文件樹的路徑。若是要改變這個位置,查看RUNTIME_OUTPUT_DIRECTORY目標屬性的相關文檔。若是要改變最終文件名的<name>部分,查看OUTPUT_NAME目標屬性的相關文檔。
若是指定了MACOSX_BUNDLE選項,對應的屬性會附加在建立的目標上。查看MACOSX_BUNDLE目標屬性的文檔能夠找到更多的細節。
若是指定了EXCLUDE_FROM_ALL選項,對應的屬性將會設置在被建立的目標上。查看EXCLUDE_FROM_ALL目標屬性的文檔能夠找到更多的細節。
使用下述格式,add_executable命令也能夠用來建立導入的(IMPORTED)可執行目標:
add_executable(<name> IMPORTED)
一個導入的可執行目標引用了一個位於工程以外的可執行文件。該格式不會生成構建這個目標的規則。該目標名字的做用域在它被建立的路徑以及底層路徑有效。它能夠像在該工程內的其餘任意目標同樣被引用。導入可執行文件爲相似於add_custom_command之類的命令引用它提供了便利。
關於導入的可執行文件的細節能夠經過設置以IMPORTED_開頭的屬性來指定。這類屬性中最重要的是IMPORTED_LOCATION(以及它對應於具體配置的版本IMPORTED_LOCATION_<CONFIG>);該屬性指定了執行文件主文件在磁盤上的位置。查看IMPORTED_*屬性的文檔來得到更多信息。
CMD#6
使用指定的源文件向工程中添加一個庫。 :
add_library
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
添加一個名爲<name>的庫文件,該庫文件將會根據調用的命令裏列出的源文件來建立。<name>對應於邏輯目標名稱,並且在一個工程的全局域內必須是惟一的。待構建的庫文件的實際文件名根據對應平臺的命名約定來構造(好比lib<name>.a或者<name>.lib)。指定STATIC,SHARED,或者MODULE參數用來指定要建立的庫的類型。STATIC庫是目標文件的歸檔文件,在連接其它目標的時候使用。SHARED庫會被動態連接,在運行時被加載。MODULE庫是不會被連接到其它目標中的插件,可是可能會在運行時使用dlopen-系列的函數動態連接。若是沒有類型被顯式指定,這個選項將會根據變量BUILD_SHARED_LIBS的當前值是否爲真決定是STATIC仍是SHARED。
默認狀態下,庫文件將會在於源文件目錄樹的構建目錄樹的位置被建立,該命令也會在這裏被調用。查閱ARCHIVE_OUTPUT_DIRECTORY,LIBRARY_OUTPUT_DIRECTORY,和RUNTIME_OUTPUT_DIRECTORY這三個目標屬性的文檔來改變這一位置。查閱OUTPUT_NAME目標屬性的文檔來改變最終文件名的<name>部分。
若是指定了EXCLUDE_FROM_ALL屬性,對應的一些屬性會在目標被建立時被設置。查閱EXCLUDE_FROM_ALL的文檔來獲取該屬性的細節。
使用下述格式,add_library命令也能夠用來建立導入的庫目標:
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)
導入的庫目標是引用了在工程外的一個庫文件的目標。沒有生成構建這個庫的規則。這個目標名字的做用域在它被建立的路徑及如下有效。他能夠向任何在該工程內構建的目標同樣被引用。導入庫爲相似於target_link_libraries命令中引用它提供了便利。關於導入庫細節能夠經過指定那些以IMPORTED_的屬性設置來指定。其中最重要的屬性是IMPORTED_LOCATION(以及它的具體配置版本,IMPORTED_LOCATION_<CONFIG>),它指定了主庫文件在磁盤上的位置。查閱IMPORTED_*屬性的文檔獲取更多的信息。
CMD#7
爲構建添加一個子路徑。 :
add_subdirectory
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
這條命令的做用是爲構建添加一個子路徑,告訴cmake去子目錄尋找新的CMakeList.txt 子文件。source_dir選項指定了CMakeLists.txt源文件和代碼文件的位置。若是source_dir是一個相對路徑,那麼source_dir選項會被解釋爲相對於當前的目錄,可是它也能夠是一個絕對路徑。binary_dir選項指定了輸出文件的路徑。若是binary_dir是相對路徑,它將會被解釋爲相對於當前輸出路徑,可是它也能夠是一個絕對路徑。若是沒有指定binary_dir,binary_dir的值將會是沒有作任何相對路徑展開的source_dir,這也是一般的用法。在source_dir指定路徑下的CMakeLists.txt將會在當前輸入文件的處理過程執行到該命令以前,當即被CMake處理。
若是指定了EXCLUDE_FROM_ALL選項,在子路徑下的目標默認不會被包含到父路徑的ALL目標裏,而且也會被排除在IDE工程文件以外。用戶必須顯式構建在子路徑下的目標,好比一些示範性的例子工程就是這樣。典型地,子路徑應該包含它本身的project()命令調用,這樣會在子路徑下產生一份完整的構建系統(好比VS IDE的solution文件)。注意,目標間的依賴性要高於這種排除行爲。若是一個被父工程構建的目標依賴於在這個子路徑下的目標,被依賴的目標會被包含到父工程的構建系統中,以知足依賴性的要求。
以指定的參數爲工程添加一個測試。CMD#8
add_test :
add_test(testname Exename arg1 arg2 ... )
若是已經運行過了ENABLE_TESTING命令,這個命令將爲當前路徑添加一個測試目標。若是ENABLE_TESTING尚未運行過,該命令啥事都不作。測試是由測試子系統運行的,它會以指定的參數執行Exename文件。Exename或者是由該工程構建的可執行文件,也能夠是系統上自帶的任意可執行文件(好比tclsh)。該測試會在CMakeList.txt文件的當前工做路徑下運行,這個路徑與二進制樹上的路相對應。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
COMMAND <command> [arg1 [arg2 ...]])
若是COMMAND選項指定了一個可執行目標(用add_executable建立),它會自動被在構建時建立的可執行文件所替換。若是指定了CONFIGURATIONS選項,那麼該測試只有在列出的某一個配置下才會運行。
在COMMAND選項後的參數可使用「生成器表達式」,它的語法是"$<...>"。這些表達式會在構建系統生成期間,以及構建配置的專有信息的產生期間被評估。合法的表達式是:
$<CONFIGURATION> = 配置名稱
$<TARGET_FILE:tgt> = 主要的二進制文件(.exe, .so.1.2, .a)
$<TARGET_LINKER_FILE:tgt> = 用於連接的文件(.a, .lib, .so)
$<TARGET_SONAME_FILE:tgt> = 帶有.so.的文件(.so.3)
其中,"tgt"是目標的名稱。目標文件表達式TARGET_FILE生成了一個完整的路徑,可是它的_DIR和_NAME版本能夠生成目錄以及文件名部分:
$<TARGET_FILE_DIR:tgt>/$<TARGET_FILE_NAME:tgt>
$<TARGET_LINKER_FILE_DIR:tgt>/$<TARGET_LINKER_FILE_NAME:tgt>
$<TARGET_SONAME_FILE_DIR:tgt>/$<TARGET_SONAME_FILE_NAME:tgt>
用例:
1 add_test(NAME mytest 2 COMMAND testDriver --config $<CONFIGURATION> 3 --exe $<TARGET_FILE:myexe>)
這段代碼建立了一個名爲mytest的測試,它執行的命令是testDriver工具,傳遞的參數包括配置名,以及由目標生成的可執行文件myexe的完整路徑。
CMD#9
查找在某個路徑下的全部源文件。 :
aux_source_directory
aux_source_directory(<dir> <variable>)
蒐集全部在指定路徑下的源文件的文件名,將輸出結果列表儲存在指定的<variable>變量中。該命令主要用在那些使用顯式模板實例化的工程上。模板實例化文件能夠存儲在Templates子目錄下,而後可使用這條命令自動收集起來;這樣能夠避免手工羅列全部的實例。
使用該命令來避免爲一個庫或可執行目標寫源文件的清單,是很是具備吸引力的。可是若是該命令貌似能夠發揮做用,那麼CMake就不須要生成一個感知新的源文件什麼時候被加進來的構建系統了(也就是說,新文件的加入,並不會致使CMakeLists.txt過期,從而不能引發CMake從新運行。——譯註)。正常狀況下,生成的構建系統可以感知它什麼時候須要從新運行CMake,由於須要修改CMakeLists.txt來引入一個新的源文件。當源文件僅僅是加到了該路徑下,可是沒有修改這個CMakeLists.txt文件,使用者只能手動從新運行CMake來產生一個包含這個新文件的構建系統。
CMD#10
從一個包圍該命令的foreach或while循環中跳出。 :
break
break()
從包圍它的foreach循環或while循環中跳出。
CMD#11
獲取構建該工程的命令行。 :
build_command
build_command(<variable>
[CONFIGURATION <config>]
[PROJECT_NAME <projname>]
[TARGET <target>])
把給定的變量<variable>設置成一個字符串,其中包含使用由變量CMAKE_GENERATOR肯定的項目構建工具,去構建某一個工程的某一個目標配置的命令行。
對於多配置生成器,若是忽略CONFIGURATION選項,CMake將會選擇一個合理的默認值;而對於單配置生成器,該選項會被忽略。
若是PROJECT_NAME選項被忽略,獲得的命令行用來構建當前構建樹上的頂層工程。
若是TARGET選項被忽略,獲得的命令行能夠用來構建全部目標,比較高效的用法是構建目標all或者ALL_BUILD。
build_command(<cachevariable> <makecommand>)
不推薦使用以上的這種格式,但對於後相兼容仍是有用的。只要能夠,就要使用第一種格式。
這種格式將變量<cachevariable>設置爲一個字符串,其中包含從構建樹的根目錄,用<makecommand>指定的構建工具構建這個工程的命令。<makecommand>應該是指向msdev,devenv,nmake,make或者是一種最終用戶指定的構建工具的完整路徑。
CMD#12
設置一個工程所須要的最低CMake版本。 :
cmake_minimum_required
cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]]
[FATAL_ERROR])
若是CMake的當前版本低於指定的版本,它會中止處理工程文件,並報告錯誤。當指定的版本高於2.4時,它會隱含調用:
cmake_policy(VERSION major[.minor[.patch[.tweak]]])
從而將cmale的策略版本級別設置爲指定的版本。當指定的版本是2.4或更低時,這條命令隱含調用:
cmake_policy(VERSION 2.4)
這將會啓用對於CMake 2.4及更低版本的兼容性。
FATAL_ERROR選項是能夠接受的,可是CMake 2.6及更高的版本會忽略它。若是它被指定,那麼CMake 2.4及更低版本將會以錯誤了結而非僅僅給出個警告。
CMD#13
管理CMake的策略設置。 :
cmake_policy
隨着CMake的演變,有時爲了搞定bug或改善現有特點的實現方法,改變現有的行爲是必須的。CMake的策略機制是在新的CMake版本帶來行爲上的改變時,用來幫助保持現有項目的構建的一種設計。每一個新的策略(行爲改變)被賦予一個"CMP<NNNN>"格式的識別符,其中"<NNNN>"是一個整數索引。每一個策略相關的文檔都會描述「舊行爲」和「新行爲」,以及引入該策略的緣由。工程能夠設置各類策略來選擇指望的行爲。當CMake須要瞭解要用哪一種行爲的時候,它會檢查由工程指定的一種設置。若是沒有可用的設置,工程假定使用「舊行爲」,而且會給出警告要求你設置工程的策略。
cmake_policy是用來設置「新行爲」或「舊行爲」的命令。若是支持單獨設置策略,咱們鼓勵各項目根據CMake的版原本設置策略。
cmake_policy(VERSION major.minor[.patch[.tweak]])
上述命令指定當前的CMakeLists.txt是爲給定版本的CMake書寫的。全部在指定的版本或更早的版本中引入的策略會被設置爲使用「新行爲」。全部在指定的版本以後引入的策略將會變爲無效(unset)。該命令有效地爲一個指定的CMake版本請求優先採用的行爲,而且告知更新的CMake版本給出關於它們新策略的警告。命令中指定的策略版本必須至少是2.4,不然命令會報告一個錯誤。爲了獲得支持早於2.4版本的兼容性特性,查閱策略CMP0001的相關文檔。
cmake_policy(SET CMP<NNNN> NEW)
cmake_policy(SET CMP<NNNN> OLD)
對於某種給定的策略,該命令要求CMake使用新的或者舊的行爲。對於一個指定的策略,那些依賴於舊行爲的工程,經過設置策略的狀態爲OLD,能夠禁止策略的警告。或者,用戶可讓工程採用新行爲,而且設置策略的狀態爲NEW。
cmake_policy(GET CMP<NNNN> <variable>)
該命令檢查一個給定的策略是否設置爲舊行爲或新行爲。若是策略被設置,輸出的變量值會是「OLD」或「NEW」,不然爲空。
CMake將策略設置保存在一個棧結構中,所以,cmake_policy命令產生的改變僅僅影響在棧頂端的元素。在策略棧中的一個新條目由各子路徑自動管理,以此保護它的父路徑及同層路徑的策略設置。CMake也管理經過include()和find_package()命令加載的腳本中新加入的條目,除非調用時指定了NO_POLICY_SCOPE選項(另外可參考CMP0011)。cmake_policy命令提供了一種管理策略棧中自定義條目的接口:
cmake_policy(PUSH)
cmake_policy(POP)
每一個PUSH必須有一個配對的POP來去掉撤銷改變。這對於臨時改變策略設置比較有用。
函數和宏會在它們被建立的時候記錄策略設置,而且在它們被調用的時候使用記錄前的策略。若是函數或者宏實現設置了策略,這個變化會經過調用者(caller)一直上傳,自動傳遞到嵌套的最近的策略棧條目。
CMD#14
將一份文件拷貝到另外一個位置並修改它的內容。 :
configure_file
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
將文件<input>拷貝到<output>而後替換文件內容中引用到的變量值。若是<input>是相對路徑,它被評估的基礎路徑是當前源碼路徑。<input>必須是一個文件,而不是個路徑。若是<output>是一個相對路徑,它被評估的基礎路徑是當前二進制文件路徑。若是<output>是一個已有的路徑,那麼輸入文件將會以它原來的名字放到那個路徑下。
該命令替換掉在輸入文件中,以${VAR}格式或@VAR@格式引用的任意變量,如同它們的值是由CMake肯定的同樣。 若是一個變量還未定義,它會被替換爲空。若是指定了COPYONLY選項,那麼變量就不會展開。若是指定了ESCAPE_QUOTES選項,那麼全部被替換的變量將會按照C語言的規則被轉義。該文件將會以CMake變量的當前值被配置。若是指定了@ONLY選項,只有@VAR@格式的變量會被替換而${VAR}格式的變量則會被忽略。這對於配置使用${VAR}格式的腳本文件比較有用。任何相似於#cmakedefine VAR的定義語句將會被替換爲#define VAR或者/* #undef VAR */,視CMake中對VAR變量的設置而定。任何相似於#cmakedefine01 VAR的定義語句將會被替換爲#define VAR 1或#define VAR 0,視VAR被評估爲TRUE或FALSE而定。
(configure_file的做用是讓普通文件也能使用CMake中的變量。——譯註)
CMD#15
爲構建測試程序建立一個測試驅動器和源碼列表。 :
create_test_sourcelist
create_test_sourcelist(sourceListName driverName
test1 test2 test3
EXTRA_INCLUDE include.h
FUNCTION function)
測試驅動器是一個將不少小的測試代碼鏈接爲一個單一的可執行文件的程序。這在爲了縮減總的需用空間而用不少大的庫文件去構建靜態可執行文件的時候,特別有用。構建測試驅動所須要的源文件列表會在變量sourceListName中。DriverName變量是測試驅動器的名字。其它的參數還包括一個測試源代碼文件的清單,中間能夠用分號隔開。每一個測試源碼文件中應該有一個與去掉擴展名的文件名同名的函數(好比foo.cxx 文件裏應該有int foo(int, char*[]);)(和main的函數簽名同樣——譯註)。DriverName能夠在命令行中按名字調用這些測試中的每個。若是指定了EXTRA_INCLUDE,那麼它後面的參數(即include.h——譯註)會被包含到生成的文件裏。若是指定了FUNCTION選項,那麼它後面的參數(即function——譯註)會被認爲是一個函數名,傳遞給它的參數是一個指向argc的指針和argv。這個選項能夠用來爲每一個測試函數添加額外的命令行參數處理過程。CMake變量CMAKE_TESTDRIVER_BEFORE_TESTMAIN用來設置在調用測試的main函數以前調用的代碼。
CMD#16 :
define_property
定義並描述(Document)自定義屬性。
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
BRIEF_DOCS <brief-doc> [docs...]
FULL_DOCS <full-doc> [docs...])
在一個域(scope)中定義一個能夠用set_property和get_property命令訪問的屬性。這個命令對於把文檔和能夠經過get_property命令獲得的屬性名稱關聯起來很是有用。第一個參數肯定了這個屬性可使用的範圍。它必須是下列值中的一個:
GLOBAL = 與全局命名空間相關聯
DIRECTORY = 與某一個目錄相關聯
TARGET = 與一個目標相關聯
SOURCE = 與一個源文件相關聯
TEST = 與一個以add_test命名的測試相關聯
VARIABLE = 描述(document)一個CMake語言變量
CACHED_VARIABLE = 描述(document)一個CMake語言緩存變量
注意,與set_property和get_property不相同,不須要給出實際的做用域;只有做用域的類型纔是重要的。PROPERTY選項必須有,它後面緊跟要定義的屬性名。若是指定了INHERITED選項,那麼若是get_property命令所請求的屬性在該做用域中未設置,它會沿着鏈條向更高的做用域去搜索。DIRECTORY域向上是GLOBAL。TARGET,SOURCE和TEST向上是DIRECTORY。
BRIEF_DOCS和FULL_DOCS選項後面的參數是和屬性相關聯的字符串,分別做爲變量的簡單描述和完整描述。在使用get_property命令時,對應的選項能夠獲取這些描述信息。
CMD#17
:
else 開始一個if語句塊的else部分。
else(expression)
參見if命令。
CMD#18
if 塊的 elseif 部分。 :
elseif 開始
elseif(expression)
參見if命令。
CMD#19
(CXX/C/Fortran/等) :
enable_language 支持某種語言
enable_language(languageName [OPTIONAL] )
該命令打開了CMake對參數中指定的語言的支持。這與project命令相同,可是不會建立任何project命令會產生的額外變量。能夠選用的語言的類型有CXX,C,Fortran等。若是指定了OPTIONAL選項,用CMAKE_<languageName>_COMPILER_WORKS變量來判斷該語言是否被成功支持。
CMD#20 :
enable_testing
打開當前及如下目錄中的測試功能。
enable_testing()
爲當前及其下級目錄打開測試功能。也可參見add_test命令。注意,ctest須要在構建跟目錄下找到一個測試文件。所以,這個命令應該在源文件目錄的根目錄下。
CMD#21
結束foreach語句塊中的一系列命令。 :
endforeach
endforeach(expression)
參見FOREACH命令。
CMD#22
結束一個function語句塊中的一系列命令。 :
endfunction
endfunction(expression)
參見function命令。
CMD#23
結束一個if語句塊中的一系列命令。 :
endif
endif(expression)
參見if命令。
CMD#24
結束一個macro語句塊中的一系列命令。 :
endmacro
endmacro(expression)
參見macro命令。
CMD#25
結束一個while語句塊中的一系列命令。 :
endwhile
endwhile(expression)
參見while命令。
CMD#26
執行一個或更多個子進程。 :
execute_process
execute_process(COMMAND <cmd1> [args1...]]
[COMMAND <cmd2> [args2...] [...]]
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE])
運行一條或多條命令,使得前一條命令的標準輸出以管道的方式成爲下一條命令的標準輸入。全部進程公用一個單獨的標準錯誤管道。若是指定了WORKING_DIRECTORY選項,後面的路徑選項將會設置爲子進程的當前工做路徑。若是指定了TIMEOUT選項,若是子進程沒有在指定的秒數(容許分數)裏完成,子進程會自動終止。若是指定了RESULT_VARIABLE選項,該變量將保存爲正在運行的進程的結果;它能夠是最後一個子進程的整數返回代碼,也能夠是一個描述錯誤狀態的字符串。若是指定了OUTPUT_VARIABLE或者ERROR_VARIABLE,後面的變量將會被分別設置爲標準輸出和標準錯誤管道的值。若是兩個管道都是用了相同的變量,它們的輸出將會按產生的順序被合併。若是指定了INPUT_FILE,OUTPUT_FILE 或 ERROR_FILE選項,其後的文件將會分別被附加到第一個進程的標準輸入、最後一個進程的標準輸出,或者全部進程的標準錯誤管道上。若是指定了OUTPUT_QUIET後者ERROR_QUIET選項,那麼標準輸出或標準錯誤的結果將會被靜靜的忽略掉。若是爲同一個管道指定了多於一個的OUTPUT_*或ERROR_* 選項,優先級是沒有指定的。若是沒有指定OUTPUT_*或者ERROR_*選項,輸出將會與CMake進程自身對應的管道共享。
execute_process命令是exec_program命令的一個較新的功能更增強大的版本。可是爲了兼容性的緣由,舊的exec_program命令還會繼續保留。
CMD#27
從構建樹中導出目標供外部使用。 :
export
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
[APPEND] FILE <filename>)
建立一個名爲<filename>的文件,它能夠被外部工程包含進去,從而外部工程能夠從當前工程的構建樹中導入目標。這對於交叉編譯那些能夠運行在宿主平臺的的utility可執行文件,而後將它們導入到另一個編譯成目標平臺代碼的工程中的情形,特別有用。若是指定了NAMESPACE選項,<namespace>字符串將會被擴展到輸出文件中的全部目標的名字中。若是指定了APPEND選項,生成的代碼將會續接在文件以後,而不是覆蓋它。若是一個庫目標被包含在export中,可是鏈接成它的目標沒有被包含,行爲沒有指定。
由該命令建立的文件是與指定的構建樹一致的,而且絕對不該該被安裝。要從一個安裝樹上導出目標,參見install(EXPORT)命令。
export(PACKAGE <name>)
在CMake的用戶包註冊表中,爲<name>包(package)存儲當前的構建目錄。這將有助於依賴於它的工程從當前工程的構建樹中查找並使用包而不須要用戶的介入。注意,該命令在包註冊表中建立的條目,僅僅在與跟構建樹一塊兒運行的包配置文件(<name>Config.cmake)一塊兒使用時纔會起做用。
CMD#28 :
file
文件操做命令
file(WRITE filename "message to write"... )
file(APPEND filename "message to write"... )
file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
file(STRINGS filename variable [LIMIT_COUNT num]
[LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]
[LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]
[NEWLINE_CONSUME] [REGEX regex]
[NO_HEX_CONVERSION])
file(GLOB variable [RELATIVE path] [globbing expressions]...)
file(GLOB_RECURSE variable [RELATIVE path]
[FOLLOW_SYMLINKS] [globbing expressions]...)
file(RENAME <oldname> <newname>)
file(REMOVE [file1 ...])
file(REMOVE_RECURSE [file1 ...])
file(MAKE_DIRECTORY [directory1 directory2 ...])
file(RELATIVE_PATH variable directory file)
file(TO_CMAKE_PATH path result)
file(TO_NATIVE_PATH path result)
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log]
[EXPECTED_MD5 sum] [SHOW_PROGRESS])
WRITE選項將會寫一條消息到名爲filename的文件中。若是文件已經存在,該命令會覆蓋已有的文件;若是文件不存在,它將建立該文件。
APPEND選項和WRITE選項同樣,將會寫一條消息到名爲filename的文件中,只是該消息會附加到文件末尾。
READ選項將會讀一個文件中的內容並將其存儲在變量裏。讀文件的位置從offset開始,最多讀numBytes個字節。若是指定了HEX參數,二進制代碼將會轉換爲十六進制表達方式,並存儲在變量裏。
STRINGS將會從一個文件中將一個ASCII字符串的list解析出來,而後存儲在variable變量中。文件中的二進制數據會被忽略。回車換行符會被忽略。它也能夠用在Intel的Hex和Motorola的S-記錄文件;讀取它們時,它們會被自動轉換爲二進制格式。可使用NO_HEX_CONVERSION選項禁止這項功能。LIMIT_COUNT選項設定了返回的字符串的最大數量。LIMIT_INPUT設置了從輸入文件中讀取的最大字節數。LIMIT_OUTPUT設置了在輸出變量中存儲的最大字節數。LENGTH_MINIMUM設置了要返回的字符串的最小長度;小於該長度的字符串會被忽略。LENGTH_MAXIMUM設置了返回字符串的最大長度;更長的字符串會被分割成不長於最大長度的字符串。NEWLINE_CONSUME選項容許新行被包含到字符串中,而不是終止它們。REGEX選項指定了一個待返回的字符串必須知足的正則表達式。典型的使用方式是:
file(STRINGS myfile.txt myfile)
該命令在變量myfile中存儲了一個list,該list中每一個項是輸入文件中的一行文本。
GLOB選項將會爲全部匹配查詢表達式的文件生成一個文件list,並將該list存儲進變量variable裏。文件名查詢表達式與正則表達式相似,只不過更加簡單。若是爲一個表達式指定了RELATIVE標誌,返回的結果將會是相對於給定路徑的相對路徑。文件名查詢表達式的例子有:
*.cxx - 匹配全部擴展名爲cxx的文件。
*.vt? - 匹配全部擴展名是vta,...,vtz的文件。
f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。
GLOB_RECURSE選項將會生成一個相似於一般的GLOB選項的list,只是它會尋訪全部那些匹配目錄的子路徑並同時匹配查詢表達式的文件。做爲符號連接的子路徑只有在給定FOLLOW_SYMLINKS選項或者cmake策略CMP0009被設置爲NEW時,纔會被尋訪到。參見cmake --help-policy CMP0009 查詢跟多有用的信息。
使用遞歸查詢的例子有:
/dir/*.py - 匹配全部在/dir及其子目錄下的python文件。
MAKE_DIRECTORY選項將會建立指定的目錄,若是它們的父目錄不存在時,一樣也會建立。(相似於mkdir命令——譯註)
RENAME選項對同一個文件系統下的一個文件或目錄重命名。(相似於mv命令——譯註)
REMOVE選項將會刪除指定的文件,包括在子路徑下的文件。(相似於rm命令——譯註)
REMOVE_RECURSE選項會刪除給定的文件以及目錄,包括非空目錄。(相似於rm -r 命令——譯註)
RELATIVE_PATH選項會肯定從direcroty參數到指定文件的相對路徑。
TO_CMAKE_PATH選項會把path轉換爲一個以unix的 / 開頭的cmake風格的路徑。輸入能夠是一個單一的路徑,也能夠是一個系統路徑,好比"$ENV{PATH}"。注意,在調用TO_CMAKE_PATH的ENV周圍的雙引號只能有一個參數(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。quotes和後面的takes讓人後糾結,這句話翻譯可能有誤。歡迎指正——譯註)。
TO_NATIVE_PATH選項與TO_CMAKE_PATH選項很類似,可是它會把cmake風格的路徑轉換爲本地路徑風格:windows下用\,而unix下用/。
DOWNLOAD 將給定的URL下載到指定的文件中。若是指定了LOG var選項,下載日誌將會被輸出到var中。若是指定了STATUS var選項,下載操做的狀態會被輸出到var中。該狀態返回值是一個長度爲2的list。list的第一個元素是操做的數字返回值,第二個返回值是錯誤的字符串值。錯誤信息若是是數字0,操做中沒有發生錯誤。若是指定了TIMEOUT time選項,在time秒以後,操做會超時退出;time應該是整數。若是指定了EXPECTED_MD5 sum選項,下載操做會認證下載的文件的實際MD5和是否與指望值匹配。若是不匹配,操做將返回一個錯誤。若是指定了SHOW_PROGRESS選項,進度信息會以狀態信息的形式被打印出來,直到操做完成。
file命令還提供了COPY和INSTALL兩種格式:
file(<COPY|INSTALL> files... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
COPY版本把文件、目錄以及符號鏈接拷貝到一個目標文件夾。相對輸入路徑的評估是基於當前的源代碼目錄進行的,相對目標路徑的評估是基於當前的構建目錄進行的。複製過程將保留輸入文件的時間戳;而且若是目標路徑處存在同名同時間戳的文件,複製命令會把它優化掉。賦值過程將保留輸入文件的訪問權限,除非顯式指定權限或指定NO_SOURCE_PERMISSIONS選項(默認是USE_SOURCE_PERMISSIONS)。參見install(DIRECTORY)命令中關於權限(permissions),PATTERN,REGEX和EXCLUDE選項的文檔。
INSTALL版本與COPY版本只有十分微小的差異:它會打印狀態信息,而且默認使用NO_SOURCE_PERMISSIONS選項。install命令生成的安裝腳本使用這個版本(它會使用一些沒有在文檔中涉及的內部使用的選項。)
CMD#29
查找一個文件的完整路徑。 :
find_file
find_file(<VAR> name1 [path1 path2 ...])
這是該命令的精簡格式,對於大多數場合它都足夠了。它與命令find_file(<VAR> name1 [PATHS path1 path2 ...])是等價的。
find_file(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
這條命令用來查找指定文件的完整路徑。一個名字是<VAR>的緩存條目(參見CMakeCache.txt的介紹——譯註)變量會被建立,用來存儲該命令的結果。若是發現了文件的一個完整路徑,該結果會被存儲到該變量裏而且搜索過程不會再重複,除非該變量被清除。若是什麼都沒發現,搜索的結果將會是<VAR>-NOTFOUND;而且在下一次以相同的變量調用find_file時,該搜索會從新嘗試。被搜索的文件的文件名由NAMES選項後的名字列表指定。附加的其餘搜索位置能夠在PATHS選項以後指定。若是ENV var在HINTS或PATHS段中出現,環境變量var將會被讀取而後被轉換爲一個系統級環境變量,並存儲在一個cmake風格的路徑list中。好比,使用ENV PATH將會將系統的path變量列出來。在DOC以後的變量將會用於cache中的文檔字符串(documentation string)。PATH_SUFFIXES指定了在每一個搜索路徑下的須要搜索的子路徑。
若是指定了NO_DEFAULT_PATH選項,那麼在搜索時不會附加其它路徑。若是沒有指定NO_DEFAULT_PATH選項,搜索過程以下:
一、在cmake特有的cache變量中指定的搜索路徑搜索。這些路徑用於在命令行裏用-DVAR=value被設置。若是使用了NO_CMAKE_PATH選項,該路徑會被跳過。(此句翻譯可能有誤——譯註。)搜索路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變量:CMAKE_INCLUDE_PATH
變量:CMAKE_FRAMEWORK_PATH
二、在cmake特定的環境變量中指定的搜索路徑搜索。該路徑會在用戶的shell配置中被設置。若是指定了NO_CMAKE_ENVIRONMENT_PATH選項,該路徑會被跳過。搜索路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變量:CMAKE_INCLUDE_PATH
變量:CMAKE_FRAMEWORK_PATH
三、由HINTS選項指定的搜索路徑。這些路徑是由系統內省(introspection)時計算出來的路徑,好比已經發現的其餘項的位置所提供的痕跡。硬編碼的參考路徑應該使用PATHS選項指定。(HINTS與PATHS有何不一樣?比後者的優先級高?有疑問。——譯註)
四、搜索標準的系統環境變量。若是指定NO_SYSTEM_ENVIRONMENT_PATH選項,搜索路徑將跳過其後的參數。搜索路徑包括環境變量PATH個INCLUDE。
五、查找在當前系統的平臺文件中定義的cmake變量。若是指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。其餘的搜索路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變量:CMAKE_SYSTEM_INCLUDE_PATH
變量:CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索由PATHS選項指定的路徑或者在命令的簡寫版本中指定的路徑。這通常是一些硬編碼的參考路徑。在Darwin後者支持OS X框架的系統上,cmake變量CMAKE_FIND_FRAMWORK能夠設置爲空或者下述值之一:
"FIRST" - 在標準庫或者頭文件以前先查找框架。對於Darwin系統,這是默認的。
"LAST" - 在標準庫或頭文件以後再查找框架。
"ONLY" - 只查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統上,cmake變量CMAKE_FIND_APPBUNDLE能夠被設置爲空,或者下列值之一:
"FIRST" - 在標準程序以前查找application bundles,這也是Darwin系統的默認選項。
"LAST" - 在標準程序以後查找application bundlesTry。
"ONLY" - 只查找application bundles。
"NEVER" - 從不查找application bundles。
CMake的變量CMAKE_FIND_ROOT_PATH指定了一個或多個在全部其它搜索路徑以前的搜索路徑。該選項頗有效地將給定位置下的整個搜索路徑的最優先路徑進行了從新指定。默認狀況下,它是空的。當交叉編譯一個指向目標環境下的根目錄中的目標時,CMake也會搜索那些路徑;該變量這時顯得很是有用。默認狀況下,首先會搜索在CMAKE_FIND_ROOT_PATH變量中列出的路徑,而後纔是非根路徑。設置CMAKE_FIND_ROOT_PATH_MODE_INCLUDE變量能夠調整該默認行爲。該行爲能夠在每次調用時被手動覆蓋。經過使用CMAKE_FIND_ROOT_PATH_BOTH變量,搜索順序將會是上述的那樣。若是使用了NO_CMAKE_FIND_ROOT_PATH變量,那麼CMAKE_FIND_ROOT_PATH將不會被用到。若是使用了ONLY_CMAKE_FIND_ROOT_PATH變量,那麼只有CMAKE_FIND_ROOT_PATH中的路徑(即re-rooted目錄——譯註)會被搜索。
通常狀況下,默認的搜索順序是從最具體的路徑到最不具體的路徑。只要用NO_*選項屢次調用該命令,工程就能夠覆蓋該順序。
find_file(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_file(<VAR> NAMES name)
只要這些調用中的一個成功了,返回變量就會被設置並存儲在cache中;而後該命令就不會再繼續查找了。
CMD#30
查找一個庫文件 :
find_library
find_library(<VAR> name1 [path1 path2 ...])
這是該命令的簡寫版本,在大多數場合下都已經夠用了。它與命令find_library(<VAR> name1 [PATHS path1 path2 ...])等價。
find_library(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
該命令用來查找一個庫文件。一個名爲<VAR>的cache條目會被建立來存儲該命令的結果。若是找到了該庫文件,那麼結果會存儲在該變量裏,而且搜索過程將再也不重複,除非該變量被清空。若是沒有找到,結果變量將會是<VAR>-NOTFOUND,而且在下次使用相同變量調用find_library命令時,搜索過程會再次嘗試。在NAMES參數後列出的文件名是要被搜索的庫名。附加的搜索位置在PATHS參數後指定。若是再HINTS或者PATHS字段中設置了ENV變量var,環境變量var將會被讀取並從系統環境變量轉換爲一個cmake風格的路徑list。例如,指定ENV PATH是獲取系統path變量並將其轉換爲cmake的list的一種方式。在DOC以後的參數用來做爲cache中的註釋字符串。PATH_SUFFIXES選項指定了每一個搜索路徑下待搜索的子路徑。
若是指定了NO_DEFAULT_PATH選項,那麼搜索的過程當中不會有其餘的附加路徑。若是沒有指定該選項,搜索過程以下:
一、搜索cmake特有的cache變量指定的路徑。這些變量是在用cmake命令行時,經過-DVAR=value指定的變量。若是指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
二、搜索cmake特有的環境變量指定的路徑。這些變量是用戶的shell配置中設置的變量。若是指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
三、搜索由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,好比由另外一個已經發現的庫文件的地址提供的參考信息。硬編碼的推薦路徑應該經過PATHS選項指定。
四、查找標準的系統環境變量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
PATH
LIB
五、查找在爲當前系統的平臺文件中定義的cmake變量。若是指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索PATHS選項或者精簡版命令指定的路徑。這些一般是硬編碼的推薦搜索路徑。
在Darwin或者支持OS X 框架的系統上,cmake變量CMAKE_FIND_FRAMEWORK能夠用來設置爲空,或者下述值之一:
"FIRST" - 在標準庫或頭文件以前查找框架。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找框架。
"ONLY" - 僅僅查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統,cmake變量CMAKE_FIND_APPBUNDLE能夠被設置爲空或者下面這些值中的一個:
"FIRST" - 在標準庫或頭文件以前查找application bundles。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找application bundles。
"ONLY" - 僅僅查找application bundles。
"NEVER" - 從不查找application bundles。
CMake變量CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其餘搜索路徑的搜索路徑。該變量可以有效地從新定位在給定位置下進行搜索的根路徑。該變量默認爲空。當使用交叉編譯時,該變量十分有用:用該變量指向目標環境的根目錄,而後CMake將會在那裏查找。默認狀況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜索,而後是「非根」路徑。該默認規則能夠經過設置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出調整。在每次調用該命令以前,均可以經過設置這個變量來手動覆蓋默認行爲。若是使用了NO_CMAKE_FIND_ROOT_PATH變量,那麼只有重定位的路徑會被搜索。
默認的搜索順序的設計邏輯是按照使用時從最具體到最不具體。經過屢次調用find_library命令以及NO_*選項,能夠覆蓋工程的這個默認順序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要這些調用中的一個成功返回,結果變量就會被設置而且被存儲到cache中;這樣隨後的調用都不會再行搜索。若是那找到的庫是一個框架,VAR將會被設置爲指向框架「<完整路徑>/A.framework」 的完整路徑。當一個指向框架的完整路徑被用做一個庫文件,CMake將使用-framework A,以及-F<完整路徑>這兩個選項將框架鏈接到目標上。
CMD#31
:
find_package 爲外部工程加載設置。
find_package(<package> [version] [EXACT] [QUIET]
[[REQUIRED|COMPONENTS] [components...]]
[NO_POLICY_SCOPE])
查找並加載外來工程的設置。該命令會設置<package>_FOUND變量,用來指示要找的包是否被找到了。若是這個包被找到了,與它相關的信息能夠經過包自身記載的變量中獲得。QUIET選項將會禁掉包沒有被發現時的警告信息。REQUIRED選項表示若是報沒有找到的話,cmake的過程會終止,並輸出警告信息。在REQUIRED選項以後,或者若是沒有指定REQUIRED選項可是指定了COMPONENTS選項,在它們的後面能夠列出一些與包相關的部件清單(components list)。[version]參數須要一個版本號,它是正在查找的包應該兼容的版本號(格式是major[.minor[.patch[.tweak]]])。EXACT選項要求該版本號必須精確匹配。若是在find-module內部對該命令的遞歸調用沒有給定[version]參數,那麼[version]和EXACT選項會自動地從外部調用前向繼承。對版本的支持目前只存在於包和包之間(詳見下文)。
用戶代碼整體上應該使用上述的簡單調用格式查詢須要的包。本命令文檔的剩餘部分則詳述了find_package的完整命令格式以及具體的查詢過程。指望經過該命令查找並提供包的項目維護人員,咱們鼓勵你能繼續讀下去。
該命令在搜索包時有兩種模式:「模塊」模式和「配置」模式。當該命令是經過上述的精簡格式調用的時候,合用的就是模塊模式。在該模式下,CMake搜索全部名爲Find<package>.cmake的文件,這些文件的路徑由變量由安裝CMake時指定的CMAKE_MODULE_PATH變量指定。若是查找到了該文件,它會被CMake讀取並被處理。該模式對查找包,檢查版本以及生成任何別的必須信息負責。許多查找模塊(find-module)僅僅提供了有限的,甚至根本就沒有對版本化的支持;具體信息查看該模塊的文檔。若是沒有找到任何模塊,該命令會進入配置模式繼續執行。
完整的配置模式下的命令格式是:
find_package(<package> [version] [EXACT] [QUIET]
[[REQUIRED|COMPONENTS] [components...]] [NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
NO_MODULE能夠用來明確地跳過模塊模式。它也隱含指定了不使用在精簡格式中使用的那些選項。
配置模式試圖查找一個由待查找的包提供的配置文件的位置。包含該文件的路徑會被存儲在一個名爲<package>_DIR的cache條目裏。默認狀況下,該命令搜索名爲<package>的包。若是指定了NAMES選項,那麼其後的names參數會取代<package>的角色。該命令會爲每一個在names中的name搜索名爲<name>Config.cmake或者<name全小寫>-config.cmake的文件。經過使用CONFIGS選項能夠改變可能的配置文件的名字。如下描述搜索的過程。若是找到了配置文件,它將會被CMake讀取並處理。因爲該文件是由包自身提供的,它已經知道包中內容的位置。配置文件的完整地址存儲在cmake的變量<package>_CONFIG中。
全部CMake要處理的配置文件將會搜索該包的安裝信息,而且將該安裝匹配的適當版本號(appropriate version)存儲在cmake變量<package>_CONSIDERED_CONFIGS中,與之相關的版本號(associated version)將被存儲在<package>_CONSIDERED_VERSIONS中。
若是沒有找到包配置文件,CMake將會生成一個錯誤描述文件,用來描述該問題——除非指定了QUIET選項。若是指定了REQUIRED選項,而且沒有找到該包,將會報致命錯誤,而後配置步驟終止執行。若是設置了<package>_DIR變量被設置了,可是它沒有包含配置文件信息,那麼CMake將會直接無視它,而後從新開始查找。
若是給定了[version]參數,那麼配置模式僅僅會查找那些在命令中請求的版本(格式是major[.minor[.patch[.tweak]]])與包請求的版本互相兼容的那些版本的包。若是指定了EXACT選項,一個包只有在它請求的版本與[version]提供的版本精確匹配時才能被找到。CMake不會對版本數的含義作任何的轉換。包版本號由包自帶的版本文件來檢查。對於一個備選的包配置文件<config-file>.cmake,對應的版本文件的位置緊挨着它,而且名字或者是<config-file>-version.cmake或者是<config-file>Version.cmake。若是沒有這個版本文件,那麼配置文件就會認爲不兼容任何請求的版本。當找到一個版本文件以後,它會被加載而後用來檢查(find_package)請求的版本號。版本文件在一個下述變量被定義的嵌套域中被加載:
PACKAGE_FIND_NAME = <package>名字。
PACKAGE_FIND_VERSION = 請求的完整版本字符串
PACKAGE_FIND_VERSION_MAJOR = 若是被請求了,那麼它是major版本號,不然是0。
PACKAGE_FIND_VERSION_MINOR = 若是被請求了,那麼它是minor版本號,不然是0。
PACKAGE_FIND_VERSION_PATCH = 若是被請求了,那麼它是patch版本號,不然是0。
PACKAGE_FIND_VERSION_TWEAK = 若是被請求了,那麼它是tweak版本號,不然是0。
PACKAGE_FIND_VERSION_COUNT = 版本號包含幾部分,0到4。
版本文件會檢查自身是否知足請求的版本號,而後設置了下面這些變量:
PACKAGE_VERSION = 提供的完整的版本字符串。
PACKAGE_VERSION_EXACT = 若是版本號精確匹配,返回true。
PACKAGE_VERSION_COMPATIBLE = 若是版本號相兼容,返回true。
PACKAGE_VERSION_UNSUITABLE = 若是不適合任何版本,返回true。
下面這些變量將會被find_package命令檢查,用以肯定配置文件是否提供了可接受的版本。在find_package命令返回後,這些變量就不可用了。若是版本可接受,下述的變量會被設置:
<package>_VERSION = 提供的完整的版本字符串。
<package>_VERSION_MAJOR = 若是被請求了,那麼它是major版本號,不然是0。
<package>_VERSION_MINOR = 若是被請求了,那麼它是minor版本號,不然是0。
<package>_VERSION_PATCH = 若是被請求了,那麼它是patch版本號,不然是0。
<package>_VERSION_TWEAK = 若是被請求了,那麼它是tweak版本號,不然是0。
<package>_VERSION_COUNT = 版本號包含幾部分,0到4。
而後,對應的包配置文件纔會被加載。當多個包配置文件均可用時,而且這些包的版本文件都與請求的版本兼容,選擇哪一個包將會是不肯定的。不該該假設cmake會選擇最高版本或者是最低版本。(以上的若干段是對find_package中版本匹配步驟的描述,並不須要用戶干預——譯註。)
配置模式提供了一種高級接口和搜索步驟的接口。這些被提供的接口的大部分是爲了完整性的要求,以及在模塊模式下,包被find-module加載時供內部使用。大多數用戶僅僅應該調用:
find_package(<package> [major[.minor]] [EXACT] [REQUIRED|QUIET])
來查找包。鼓勵那些須要提供CMake包配置文件的包維護人員應該命名這些文件並安裝它們,這樣下述的整個過程將會找到它們而不須要使用附加的選項。
CMake爲包構造了一組可能的安裝前綴。在每一個前綴下,若干個目錄會被搜索,用來查找配置文件。下述的表格展現了待搜索的路徑。每一個條目都是專門爲Windows(W),UNIX(U)或者Apple(A)約定的安裝樹指定的。
<prefix>/ (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(share|lib)/cmake/<name>*/ (U)
<prefix>/(share|lib)/<name>*/ (U)
<prefix>/(share|lib)/<name>*/(cmake|CMake)/ (U)
在支持OS X平臺和Application Bundles的系統上,包含配置文件的框架或者bundles會在下述的路徑中被搜索:
<prefix>/<name>.framework/Resources/ (A)
<prefix>/<name>.framework/Resources/CMake/ (A)
<prefix>/<name>.framework/Versions/*/Resources/ (A)
<prefix>/<name>.framework/Versions/*/Resources/CMake/ (A)
<prefix>/<name>.app/Contents/Resources/ (A)
<prefix>/<name>.app/Contents/Resources/CMake/ (A)
在全部上述狀況下,<name>是區分大小寫的,而且對應於在<package>或者由NAMES給定的任何一個名字。
這些路徑集用來與那些在各自的安裝樹上提供了配置文件的工程協做。上述路徑中被標記爲(W)的是專門爲Windows上的安裝設置的,其中的<prefix>部分多是一個應用程序的頂層安裝路徑。那些被標記爲(U)的是專門爲UNIX平臺上的安裝設置的,其中的<prefix>被多個包共用。這僅僅是個約定,所以,全部(W)和(U)路徑在全部平臺上都仍然會被搜索。那些被標記爲(A)的路徑是專門爲Apple平臺上的安裝設置的。CMake變量CMAKE_FIND_FRAMEWORK和CMAKE_FIND_APPBUNDLE肯定了偏好的順序,以下所示:
安裝前綴是經過如下步驟被構建出來的。若是指定了NO_DEFAULT_PATH選項,全部NO_*選項都會被激活。
一、搜索在cmake特有的cache變量中指定的搜索路徑。這些變量是爲了在命令行中用-DVAR=value選項指定而設計的。經過指定NO_CMAKE_PATH選項能夠跳過該搜索路徑。搜索路徑還包括:
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
二、搜索cmake特有的環境變量。這些變量是爲了在用戶的shell配置中進行配置而設計的。經過指定NO_CMAKE_ENVIRONMENT_PATH選項能夠跳過該路徑。搜索的路徑包括:
<package>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
三、搜索HINTS選項指定的路徑。這些路徑應該是由操做系統內省時計算產生的,好比由其它已經找到的項的位置而提供的線索。硬編碼的參考路徑應該在PATHS選項中指定。
四、搜索標準的系統環境變量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。以"/bin"或"/sbin"結尾的路徑條目會被自動轉換爲它們的父路徑。搜索的路徑包括:
PATH
五、搜索在CMake GUI中最新配置過的工程的構建樹。能夠經過設置NO_CMAKE_BUILDS_PATH選項來跳過這些路徑。這是爲了在用戶正在依次構建多個相互依賴的工程時而準備的。
六、搜索存儲在CMake用戶包註冊表中的路徑。經過設置NO_CMAKE_PACKAGE_REGISTRY選項能夠跳過這些路徑。當CMake嗲用export(PACKAGE<name>)配置一個工程時,這些路徑會被存儲在註冊表中。參見export(PACKAGE)命令的文檔閱讀更多細節。
七、搜索在當前系統的平臺文件中定義的cmake變量。能夠用NO_CMAKE_SYSTEM_PATH選項跳過這些路徑。
CMAKE_SYSTEM_PREFIX_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
八、搜索由PATHS選項指定的路徑。這些路徑通常是硬編碼的參考路徑。
在Darwin或者支持OS X 框架的系統上,cmake變量CMAKE_FIND_FRAMEWORK能夠用來設置爲空,或者下述值之一:
"FIRST" - 在標準庫或頭文件以前查找框架。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找框架。
"ONLY" - 僅僅查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統,cmake變量CMAKE_FIND_APPBUNDLE能夠被設置爲空或者下面這些值中的一個:
"FIRST" - 在標準庫或頭文件以前查找application bundles。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找application bundles。
"ONLY" - 僅僅查找application bundles。
"NEVER" - 從不查找application bundles。
CMake變量CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其餘搜索路徑的搜索路徑。該變量可以有效地從新定位在給定位置下進行搜索的根路徑。該變量默認爲空。當使用交叉編譯時,該變量十分有用:用該變量指向目標環境的根目錄,而後CMake將會在那裏查找。默認狀況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜索,而後是「非根」路徑。該默認規則能夠經過設置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出調整。在每次調用該命令以前,均可以經過設置這個變量來手動覆蓋默認行爲。若是使用了NO_CMAKE_FIND_ROOT_PATH變量,那麼只有重定位的路徑會被搜索。
默認的搜索順序的設計邏輯是按照使用時從最具體到最不具體。經過屢次調用find_library命令以及NO_*選項,能夠覆蓋工程的這個默認順序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要這些調用中的一個成功返回,結果變量就會被設置而且被存儲到cache中;這樣隨後的調用都不會再行搜索。若是那找到的庫是一個框架,VAR將會被設置爲指向框架「<完整路徑>/A.framework」 的完整路徑。當一個指向框架的完整路徑被用做一個庫文件,CMake將使用-framework A,以及-F<完整路徑>這兩個選項將框架鏈接到目標上。
參見cmake_policy()命令的文檔中關於NO_POLICY_SCOPE選項討論。
CMD#32
搜索包含某個文件的路徑 :
find_path
find_path(<VAR> name1 [path1 path2 ...])
在多數狀況下,使用上述的精簡命令格式就足夠了。它與命令find_path(<VAR> name1 [PATHS path1 path2 ...])等價。
find_path(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
該命令用於給定名字文件所在的路徑。一條名爲<VAR>的cache條目會被建立,並存儲該命令的執行結果。若是在某個路徑下發現了該文件,該結果會被存儲到該變量中;除非該變量被清除,該次搜索不會繼續進行。若是沒有找到,存儲的結果將會是<VAR>-NOTFOUND,而且當下一次以相同的變量名調用find_path命令時,該命令會再一次嘗試搜索該文件。須要搜索的文件名經過在NAMES選項後面的列出來的參數來肯定。附加的搜索位置能夠在PATHS選項以後指定。若是在PATHS或者HINTS命令中還指定了ENV var選項,環境變量var將會被讀取並從一個系統環境變量轉換爲一個cmake風格的路徑list。好比,ENV PATH是列出系統path變量的一種方法。參數DOC將用來做爲該變量在cache中的註釋。PATH_SUFFIXES指定了在每一個搜索路徑下的附加子路徑。
若是指定了NO_DEFAULT_PATH選項,那麼沒有其它附加的路徑會被加到搜索過程當中。若是並未指定NO_DEFAULT_PATH選項,搜索的過程以下:
一、搜索cmake專有的cache變量中的路徑。這種用法是爲了在命令行中用選項-DVAR=value指定搜索路徑。若是指定了NO_CMAKE_PATH選項,該路徑會被跳過。搜索路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>/,路徑<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
二、搜索cmake專有的環境變量中指定的路徑。這種用法是爲了在用戶的shell配置中設置指定的搜索路徑。若是指定了NO_CMAKE_ENVIRONMENT_PATH選項,該路徑會被跳過。搜索路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>/,路徑<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
三、搜索由HINTS選項指定的路徑。這些路徑應該是由系統內省時計算得出的路徑,好比由其它已經發現的項目提供的線索。硬編碼的參考路徑應該在PATHS選項中指定。
四、搜索標準的系統環境變量。經過指定選項NO_SYSTEM_ENVIRONMENT_PATH能夠跳過搜索環境變量。搜索的路徑還包括:
PATH
INCLUDE
五、查找在爲當前系統的平臺文件中定義的cmake變量。若是指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/include
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索PATHS選項或者精簡版命令指定的路徑。這些一般是硬編碼的推薦搜索路徑。
在Darwin或者支持OS X 框架的系統上,cmake變量CMAKE_FIND_FRAMEWORK能夠用來設置爲空,或者下述值之一:
"FIRST" - 在標準庫或頭文件以前查找框架。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找框架。
"ONLY" - 僅僅查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統,cmake變量CMAKE_FIND_APPBUNDLE能夠被設置爲空或者下面這些值中的一個:
"FIRST" - 在標準庫或頭文件以前查找application bundles。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找application bundles。
"ONLY" - 僅僅查找application bundles。
"NEVER" - 從不查找application bundles。
CMake變量CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其餘搜索路徑的搜索路徑。該變量可以有效地從新定位在給定位置下進行搜索的根路徑。該變量默認爲空。當使用交叉編譯時,該變量十分有用:用該變量指向目標環境的根目錄,而後CMake將會在那裏查找。默認狀況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜索,而後是「非根」路徑。該默認規則能夠經過設置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出調整。在每次調用該命令以前,均可以經過設置這個變量來手動覆蓋默認行爲。若是使用了NO_CMAKE_FIND_ROOT_PATH變量,那麼只有重定位的路徑會被搜索。
默認的搜索順序的設計邏輯是按照使用時從最具體到最不具體的路徑。經過屢次調用find_path命令以及NO_*選項,能夠覆蓋工程的這個默認順序:
find_path(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_path(<VAR> NAMES name)
只要這些調用中的一個成功返回,結果變量就會被設置而且被存儲到cache中;這樣隨後的調用都不會再行搜索。在搜索框架時,若是以A/b.h的格式指定文件,那麼該框架搜索過程會搜索A.framework/Headers/b.h。若是找到了該路徑,它將會被設置爲框架的路徑。CMake將把它轉換爲正確的-F選項來包含該文件。
CMD#33
查找可執行程序 :
find_program
find_program(<VAR> name1 [path1 path2 ...])
這是該命令的精簡格式,它在大多數場合下都夠用了。命令find_program(<VAR> name1 [PATHS path1 path2 ...])是它的等價形式。
find_program(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
該命令用於查找程序。一個名爲<VAR>的cache條目會被建立用來存儲該命令的結果。若是該程序被找到了,結果會存儲在該變量中,搜索過程將不會再重複,除非該變量被清除。若是沒有找到,結果將會是<VAR>-NOTFOUND,而且下次以相同的變量調用該命令時,還會作搜索的嘗試。被搜索的程序的名字由NAMES選項後列出的參數指定。附加的搜索位置能夠在PATHS參數後指定。若是在HINTS或者PATHS選項後有ENV var參數,環境變量var將會被讀取並從系統環境變量轉換爲cmake風格的路徑list。好比ENV PATH是一種列出全部系統path變量的方法。DOC後的參數將會被用做cache中的註釋字符串。PATH_SUFFIXES指定了在每一個搜索路徑下要檢查的附加子路徑。
若是指定了NO_DEFAULT_PATH選項,那麼搜索的過程當中不會有其餘的附加路徑。若是沒有指定該選項,搜索過程以下:
一、搜索cmake特有的cache變量指定的路徑。這些變量是在用cmake命令行時,經過-DVAR=value指定的變量。若是指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
二、搜索cmake特有的環境變量指定的路徑。這些變量是用戶的shell配置中設置的變量。若是指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
三、搜索由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,好比由另外一個已經發現的程序的地址提供的參考信息。硬編碼的推薦路徑應該經過PATHS選項指定。
四、查找標準的系統環境變量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜索的路徑還包括:
PATH
五、查找在爲當前系統的平臺文件中定義的cmake變量。若是指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜索的路徑還包括:
對於每一個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_SYSTEM_PROGRAM_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
六、搜索PATHS選項或者精簡版命令指定的路徑。這些一般是硬編碼的推薦搜索路徑。
在Darwin或者支持OS X 框架的系統上,cmake變量CMAKE_FIND_FRAMEWORK能夠設置爲空,或者下述值之一:
"FIRST" - 在標準庫或頭文件以前查找框架。在Darwin系統上這是默認選項。
"LAST" - 在標準庫或頭文件以後查找框架。
"ONLY" - 僅僅查找框架。
"NEVER" - 從不查找框架。
在Darwin或者支持OS X Application Bundles的系統,cmake變量CMAKE_FIND_APPBUNDLE能夠被設置爲空或者下面這些值中的一個:
"FIRST" - 在標準程序以前查找application bundles。在Darwin系統上這是默認選項。
"LAST" - 在標準程序以後查找application bundles。
"ONLY" - 僅僅查找application bundles。
"NEVER" - 從不查找application bundles。
CMake變量CMAKE_FIND_ROOT_PATH指定了一個或者多個優先於其餘搜索路徑的搜索路徑。該變量可以有效地從新定位在給定位置下進行搜索的根路徑。該變量默認爲空。當使用交叉編譯時,該變量十分有用:用該變量指向目標環境的根目錄,而後CMake將會在那裏查找。默認狀況下,在CMAKE_FIND_ROOT_PATH中列出的路徑會首先被搜索,而後是「非根」路徑。該默認規則能夠經過設置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出調整。在每次調用該命令以前,均可以經過設置這個變量來手動覆蓋默認行爲。若是使用了NO_CMAKE_FIND_ROOT_PATH變量,那麼只有重定位的路徑會被搜索。
默認的搜索順序的設計邏輯是按照使用時從最具體到最不具體。經過屢次以NO_*選項調用find_program命令,能夠覆蓋工程的這個默認順序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要這些調用中的一個成功返回,結果變量就會被設置而且被存儲到cache中;這樣隨後的調用都不會再行搜索。
CMD#34
建立FLTK用戶界面包裝器。 :
fltk_wrap_ui
fltk_wrap_ui(resultingLibraryName source1
source2 ... sourceN )
爲全部列出的.fl和.fld文件生成.h和.cxx文件。這些生成的.h和.cxx文件將會加到變量resultingLibraryName_FLTK_UI_SRCS中,它也會加到你的庫中。
CMD#35
對一個list中的每個變量執行一組命令。 :
foreach
foreach(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endforeach(loop_var)
全部的foreach和與之匹配的endforeach命令之間的命令會被記錄下來而不會被調用。等到遇到endforeach命令時,先前被記錄下來的命令列表中的每條命令都會爲list中的每一個變量調用一遍。在每次迭代中,循環變量${loop_var}將會被設置爲list中的當前變量值。
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
foreach命令也能夠遍歷一我的爲生成的數據區間。遍歷的方式有三種:
*若是指定了一個數字,區間是[0, total]。
*若是指定了兩個數字,區間將會是第一個數字到第二個數字。
*第三個數字是從第一個數字遍歷到第二個數字時的步長。
foreach(loop_var IN [LISTS [list1 [...]]]
[ITEMS [item1 [...]]])
該命令的含義是:精確遍歷一個項組成的list。LISTS選項後面是須要被遍歷的list變量的名字,包括空元素(一個空字符串是一個零長度list)。ITEMS選項結束了list參數的解析,而後在迭代中引入全部在其後出現的項。(猜想是用list1中的項item1,依次類推,爲循環變量賦值。——譯註)
CMD#36
開始記錄一個函數,爲之後以命令的方式調用它作準備。 :
function
function(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endfunction(<name>)
定義一個名爲<name>的函數,它以arg1 arg2 arg3 (...)爲參數。在function以後,對應的endfunction以前列出的命令,在函數被調用以前,是不會被調用的。當函數被調用時,在函數中記錄的那些命令首先會用傳進去的參數替換掉形參(${arg1});而後跟正常命令同樣去調用這些命令。除了形參,你還能夠引用這些變量:ARGC爲傳遞給函數的變量個數,ARGV0 ARGV1 ARGV2 ...表示傳到函數中的實參值。這些變量爲編寫可選參數函數提供了便利。此外,ARGV保留了一個該函數全部實參的list,ARGN保留了函數形參列表之後的全部參數列表。
參見cmake_policy()命令文檔中function內部策略行爲的相關行爲。
CMD#37
獲取一個CMake實例的屬性。 :
get_cmake_property
get_cmake_property(VAR property)
從指定的CMake實例中獲取屬性。屬性的值存儲在變量VAR中。若是屬性不存在,CMake會報錯。一些會被支持的屬性包括:VATIABLES,COMMANDS,MACROS以及COMPONENTS。
CMD#38
獲取DIRECTORY域中的某種屬性。 :
get_directory_property
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
在指定的變量中存儲路徑(directory)域中的某種屬性。若是該屬性沒有被定義,將會返回空字符串。DIRECTORY參數指定了要取出的屬性值的另外一個路徑。指定的路徑必須已經被CMake遍歷過了。
get_directory_property(<variable> [DIRECTORY <dir>]
DEFINITION <var-name>)
該命令從一個路徑中獲取一個變量的定義。這種格式在從另外一個路徑中獲取變量的定義時比較有用。
CMD#39
獲得一個完整文件名中的特定部分。 :
get_filename_component
get_filename_component(<VAR> FileName
PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
[CACHE])
將變量<VAR>設置爲路徑(PATH),文件名(NAME),文件擴展名(EXT),去掉擴展名的文件名(NAME_WE),完整路徑(ABSOLUTE),或者全部符號連接被解析出的完整路徑(REALPATH)。注意,路徑會被轉換爲Unix的反斜槓(/),而且沒有結尾的反斜槓。該命令已經考慮了最長的文件擴展名。若是指定了CACHE選項,獲得的變量會被加到cache中。
get_filename_component(<VAR> FileName
PROGRAM [PROGRAM_ARGS <ARG_VAR>]
[CACHE])
在FileName中的程序將會在系統搜索路徑中被查找,或者是一個完整路徑。若是與PRPGRAM一塊兒給定了PROGRAM_ARGS選項,那麼任何在Filename字符串中出現的命令行中選項將會從程序名中分割出來並存儲在變量<ARG_VAR>中。這能夠用來從一個命令行字符串中分離程序名及其選項。
CMD#40
:
get_property 獲取一個屬性值
get_property(<variable>
<GLOBAL |
DIRECTORY [dir] |
TARGET <target> |
SOURCE <source> |
TEST <test> |
CACHE <entry> |
VARIABLE>
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
獲取在某個域中一個對象的某種屬性值。第一個參數指定了存儲屬性值的變量。第二個參數肯定了獲取該屬性的域。域的選項僅限於:
- GLOBAL 域是惟一的,它不接受域名字。
- DIRECTORY域默認爲當前目錄,可是其餘的路徑(已經被CMake處理過)能夠以相對路徑或完整路徑的方式跟在該域後面。
- TARGET域後面必須跟有一個已有的目標名。
- SOURCE域後面必須跟有一個源文件名。
- TEST域後面必須跟有一個已有的測試。
- CACHE域後面必須跟有一個cache條目。
- VARIABLE域是惟一的,它不接受域名字。
PROPERTY選項是必須的,它後面緊跟要獲取的屬性名。若是該屬性沒有被設置,該命令將返回空值。若是給定了SET選項,那麼返回值會被設置爲一個布爾值,用來指示該屬性是否被設置過。若是給定了DEFINED選項,那麼返回值會被設置爲一個布爾值,用來指示該屬性是否被相似於define_property的命令定義過。若是指定了BRIEF_DOCS或者FULL_DOCS選項,那麼該變量將會被設置爲被查詢屬性的文檔的字符串。若是被請求的屬性的文檔沒有被定義,將返回NOTFOUND。
CMD#41
爲一個源文件獲取一種屬性值。 :
get_source_file_property
get_source_file_property(VAR file property)
從一個源文件中獲取某種屬性值。這個屬性值存儲在變量VAR中。若是該屬性沒有被找到,VAR會被設置爲NOTFOUND。使用set_source_files_proterties命令來設置屬性值。源文件屬性一般用來控制文件如何被構建。一個一定存在的屬性是LOCATION。
CMD#42
:
get_target_property 從一個目標中獲取一個屬性值。
get_target_property(VAR target property)
從一個目標中獲取屬性值。屬性的值會被存儲在變量VAR中。若是該屬性沒有被發現,VAR會被設置爲NOTFOUND。使用set_target_properties命令來設置屬性值。屬性值通常用於控制如何去構建一個目標,可是有些屬性用來查詢目標的信息。該命令能夠獲取當前已經被構建好的任意目標的屬性。該目標不必定存在於當前的CMakeLists.txt文件中。
CMD#43
獲取一個測試的屬性。 :
get_test_property
get_test_property(test VAR property)
從指定的測試中獲取某種屬性。屬性值會被存儲到變量VAR中。若是沒有找到該屬性,CMake將會報錯。你可使用命令cmake --help-property-list來獲取標準屬性的清單。
CMD#44
條件執行一組命令。 :
if
if(expression)
# then section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
elseif(expression2)
# elseif section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
else(expression)
# else section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endif(expression)
評估給定的表達式。若是結果是true,在THEN段的命令就會被調用。不然,在ELSE區段的命令會被調用。ELSEIF和ELSE區段是可選的 。能夠有多個ELSEIF子句。注意,在else和elseif子句中的表達式也是可選的。判斷條件能夠用長表達式,而且表達式有約定的優先級順序。括號中的表達式會首先被調用;而後是一元運算符,好比EXISTS,COMMAND以及DEFINED;而後是EQUAL,LESS,GREATER,STRLESS,STRGREATER,STREQUAL,MATCHES;而後是NOT運算符,最後是AND,OR運算符。幾種可能的表達式是:
if(<常量>)
若是<常量>是1,ON,YES,TRUE,Y或者非0數值,那麼表達式爲真;若是<常量>是0,OFF,NO,FALSE,N,IGNORE,"",或者以'-NOTFOUND'爲後綴,那麼表達式爲假。這些布爾常量值是大小寫無關的。
if(<變量>)
若是<變量>的值不是一個false常量,表達式爲真。
if(NOT <表達式>)
若是<表達式>的值是false的話,真個表達式爲真。
if(<表達式1> AND <表達式2>)
若是兩個表達式都爲真,整個表達式爲真。
if(<表達式1> OR <表達式2>)
只要有一個表達式爲真,整個表達式爲真。
if(COMMAND command-name)
若是給出的名字是一個能夠被調用的命令,宏,或者函數的話,整個表達式的值爲真。
if(POLICY policy-id)
若是給出的名字是一個已有的策略(格式是CMP<NNNN>),表達式爲真。
if(TARGET 目標名)
若是給出的名字是一個已有的構建目標或導入目標的話,表達式爲真。
if(EXISTS 文件名)
if(EXISTS 路徑名)
若是給出的文件名或路徑名存在,表達式爲真。該命令只對完整路徑有效。
if(file1 IS_NEWER_THAN file2)
若是file1比file2更新或者其中的一個文件不存在,那麼表達式爲真。該命令只對完整路徑有效。
if(IS_DIRECTORY directory-name)
若是給定的名字是一個路徑,表達式返回真。該命令只對完整路徑有效。
if(IS_SYMLINK file-name)
若是給定的名字十一個符號連接的話,表達式返回真。該命令只對完整路徑有效。
if(IS_ABSOLUTE path)
若是給定的路徑是一個絕對路徑的話,表達式返回真。
if(variable MATCHES regex)
if(string MATCHES regex)
若是給定的字串或變量值域給定的正則表達式匹配的話,表達式返回真。
if(variable LESS number)
if(string LESS number)
if(variable GREATER number)
if(string GREATER number)
if(variable EQUAL number)
if(string EQUAL number)
若是給定的字串或變量值是一個有效的數字而且不等號或等號知足的話,表達式返回真。
if(variable STRLESS string)
if(string STRLESS string)
if(variable STRGREATER string)
if(string STRGREATER string)
if(variable STREQUAL string)
if(string STREQUAL string)
若是給定的字串或變量值依字典序小於(或者大於,或者等於)右邊給出的字串或變量值的話,表達式返回真。
if(version1 VERSION_LESS version2)
if(version1 VERSION_EQUAL version2)
if(version1 VERSION_GREATER version2)
對版本號的各部分依次比較(版本號格式是major[.minor[.patch[.tweak]]])version1和version2的大小。
if(DEFINED variable)
若是給定的變量被定義了的話,該表達式爲真。若是變量被設置了,它的值是真是假都無所謂。
if((expression) AND (expression OR (expression)))
在小括號內的表達式會首先被計算,而後才按照先前介紹的運算來計算。有內嵌的括號時,最裏的括號會做爲包含它們的表達式的計算過程的一部分。IF語句在CMake的歷史上出現的至關早,它擁有一些須要特殊介紹的便捷特性。IF表達式只有在其中有一個單一的保留值的時候,纔會精簡操做(即不作變量展開——譯註);這些保留值包括:若是是大小寫無關的 ON,1, YES,TRUE,Y,它返回真;若是是OFF,0,NO,FALSE,N,NOTFOUND,*-NOTFOUND,IGNORE,它返回假。這種特性很是合理,它爲新做者提供了一種不須要精確匹配true或者false的便利性。這些值會被當作變量處理,即便它們沒有使用${}語法的時候,也會被解引用。這意味着,若是你寫下了這樣的語句:
if (boobah)
CMake將會把它當作你寫了
if (${boobah})
來處理。相似地,若是你寫了
if (fubar AND sol)
CMake將會便捷地把它解釋爲
if ("${fubar}" AND "${sol}")
上述兩例的後者確實是正確的書寫方式,可是前者也是可行的。if語句中只有某些操做有這種特殊的變量處理方式。這些特殊的語句包括:
- 對於MATCHES運算符,待匹配的左邊的參數首先被檢查,用來確認它是不是一個已經定義的變量;若是是,該變量的值會被使用,不然就會用它的原始值。
- 若是MATCHES運算符沒有左邊的參數,它返回false,但不產生錯誤。
- LESS,GREATER,EQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是不是被定義的變量;若是是,使用它們被定義的值,不然使用它們的原始值。
- STRLESS,STRGREATER,STREQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是不是被定義的變量;若是是,使用它們被定義的值,不然使用它們的原始值。
- VERSIONLESS,VERSIONGREATER,VERSIONEQUAL運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是不是被定義的變量;若是是,使用它們被定義的值,不然使用它們的原始值。
- NOT運算符右邊的參數會被測試用來肯定它是不是布爾常量,若是是,就用這個常量;不然它會被當作一個變量而後被解引用。
- AND和OR運算符的左邊的參數和右邊的參數會被獨立測試,用來確認它們是不是布爾常量;若是是,就用這個常量,不然它們會被當作變量而後被解引用