CMake 手冊詳解
來源 http://www.cnblogs.com/coderfenghc/tag/cmake/
公司的一個專案使用CMake作為跨平臺構建工具;業務有需求,當然要好好研讀一下官方的技術手冊。目前的計劃是先把官方手冊翻譯一下,瞭解清楚CMake中的各種命令、屬性和變數的用法。同時在工作中也會閱讀CMake的真實原始碼,後續會基於此陸續寫一些工程中使用CMake的心得。CMake的版本也在不停更新,有些新的命令和變數會隨著版本更新新增進來,這是後事了,暫且不管;現在鎖定CMake 2.8.3作為手冊翻譯的版本。
作為園子裡的新丁,文章在術語和表達等等方面會有欠缺的地方,還請大俠們慷慨指點。另外,羅馬不是一天建成的,長長的手冊翻譯完也不知道要經歷多少日升月落;不過還是希望自己能夠堅持下去:-)。
CMake2.8.3 主索引
- 命令名稱
- 用法
- 描述
- 命令選項
- 生成器
- 命令
- 屬性
- 全域性域屬性
- 目錄屬性
- 目標屬性
- 測試屬性
- 原始碼屬性
- Cache Entries屬性
- 相容性命令
- CMake 標準模組
- CMake策略
- 變數
- 改變行為的變數
- 描述系統的變數
- 語言變數
- 控制構建的變數
- 提供資訊的變數
- 版權
- 其他參考資料
命令名稱
cmake - 跨平臺Makefile生成工具。
用法
cmake [選項] <原始碼路徑>
cmake [選項] <現有構建路徑>
描述
cmake可執行程式是CMake的命令列介面。它可以用指令碼對工程進行配置。工程配置設定可以在命令列中使用-D選項指定。使用-i選項,cmake將通過提示互動式地完成該設定。
CMake是一個跨平臺的構建系統生成工具。它使用平臺無關的CMake清單檔案CMakeLists.txt,指定工程的構建過程;原始碼樹的每個路徑下都有這個檔案。CMake產生一個適用於具體平臺的構建系統,使用者使用這個系統構建自己的工程。
選項
-C
: 預載入一個指令碼填充快取檔案。 當cmake在一個空的構建樹上第一次執行時,它會建立一個CMakeCache.txt檔案,然後向其中寫入可定製的專案設定資料。-C選項可以用來指定一個檔案,在第一次解析這個工程的cmake清單檔案時,從這個檔案載入快取的條目(cache entries)資訊。被載入的快取條目比專案預設的值有更高的優先權。引數中給定的那個檔案應該是一個CMake指令碼,其中包含有使用CACHE選項的SET命令;而不是一個快取格式的檔案。
-D:=
: 建立一個CMake的快取條目。
當cmake第一次運行於一個空的構建數時,它會建立一個CMakeCache.txt檔案,並且使用可定製的工程設定來填充這個檔案。這個選項可以用來指定優先順序高於工程的預設值的工程設定值。這個引數可以被重複多次,用來填充所需要數量的快取條目(cache entries)。
-U<globbing_expr>
: 從CMake的快取檔案中刪除一條匹配的條目。
該選項可以用來刪除CMakeCache.txt檔案中的一或多個變數。檔名匹配表示式(globbing expression)支援萬用字元*和?的使用。該選項可以重複多次以刪除期望數量的快取條目。使用它時要小心,你可能因此讓自己的CMakeCache.txt罷工。
-G
:指定一個makefile生成工具。
在具體的平臺上,CMake可以支援多個原生的構建系統。makefile生成工具的職責是生成特定的構建系統。可能的生成工具的名稱將在生成工具一節給出。
-Wno-dev
: 抑制開發者警告。
抑制那些為CMakeLists.txt檔案的作者準備的警告資訊。
-Wdev
: 使能開發者警告資訊輸出功能。
允許那些為CMakeLists.txt檔案的作者準備的警告資訊。
-E
: CMake命令列模式。
為了真正做到與平臺無關,CMake提供了一系列可以用於所有系統上的的命令。以-E引數執行CMake會幫助你獲得這些命令的用法。可以使用的命令有:chdir, copy, copy_if_different copy_directory, compare_files, echo, echo_append, environment, make_directory, md5sum, remove_directory, remove, tar, time, touch, touch_nocreate, write_regv, delete_regv, comspec, create_symlink。
-i
: 以嚮導模式執行CMake。
嚮導模式是在沒有GUI時,互動式地執行cmake的模式。cmake會彈出一系列的提示,要求使用者回答關於工程配置的一行問題。這些答覆會被用來設定cmake的快取值。
-L[A][H]
: 列出快取的變數中的非高階的變數。
-L
選項會列出快取變數會執行CMake,並列出所有CMake的內有被標記為INTERNAL或者ADVANCED的快取變數。這會顯示當前的CMake配置資訊,然後你可以用-D選項改變這些選項。修改一些變數可能會引起更多的變數被創建出來。如果指定了A選項,那麼命令也會顯示高階變數。如果指定了H選項,那麼命令會顯示每個變數的幫助資訊。
--build <dir>
: 構建由CMake生成的工程的二進位制樹。(這個選項的含義我不是很清楚—譯註)
該選項用以下的選項概括了內建構建工具的命令列介面
<dir> = 待建立的工程二進位制路徑。
--target <tgt> = 構建<tgt>,而不是預設目標。
--config <cfg> = 對於多重配置工具,選擇配置<cfg>。
--clean-first = 首先構建目標的clean偽目標,然後再構建。
(如果僅僅要clean掉,使用--target 'clean'選項。)
-- = 向內建工具(native tools)傳遞剩餘的選項。執行不帶選項的cmake --build來獲取快速幫助資訊。
-N
: 檢視模式。
僅僅載入快取資訊,並不實際執行配置和生成步驟。
-P <file>
: 處理指令碼模式。
將給定的cmake檔案按照CMake語言編寫的指令碼進行處理。不執行配置和生成步驟,不修改快取資訊。如果要使用-D選項定義變數,-D選項必須在-P選項之前。
--graphviz=[file]
: 生成依賴的graphviz圖。
生成一個graphviz軟體的輸入檔案,其中包括了專案中所有庫和可執行檔案之間的依賴關係。
--system-information [file]
: 輸出與該系統相關的資訊。輸出範圍比較廣的、與當前使用的系統有關的資訊。如果在一個CMake工程的二進位制構建樹的頂端執行該命令,它還會列印一些附加資訊,例如快取,日誌檔案等等。
--debug-trycompile
: 不刪除“嘗試編譯”路徑。
不刪除那些為try_compile呼叫生成的路徑。這在除錯失敗的try_compile檔案時比較有用。不過,因為上一次“嘗試編譯”生成的舊的垃圾輸出檔案也許會導致一次不正確通過/不通過,且該結果與上次測試的結果不同,所以該選項可能會改變“嘗試編譯”的結果。對於某一次“嘗試編譯”,該選項最好只用一次;並且僅僅在除錯時使用。
--debug-output
: 將cmake設定為除錯模式。
在cmake執行時,列印額外的資訊;比如使用message(send_error)呼叫得到的棧跟蹤資訊。
--trace
: 將cmake設定為跟蹤模式。
用message(send_error )呼叫,列印所有呼叫生成的跟蹤資訊,以及這些呼叫發生的位置。(這句話含義不是很確定—譯註。)
--help-command cmd [file]
: 列印單個命令cmd的幫助資訊,然後退出。
顯示給定的命令的完整的文件。如果指定了[file]引數,該文件會寫入該檔案,其輸出格式由該檔案的字尾名確定。支援的檔案型別有:man page,HTML,DocBook以及純文字。
--help-command-list [file]
: 列出所有可用命令的清單,然後退出。
該選項列出的資訊含有所有命令的名字;其中,每個命令的幫助資訊可以使用--help-command選項後跟一個命令名字得到。如果指定了[file]引數,幫助資訊會寫到file中,輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-commands [file]
: 列印所有命令的幫助檔案,然後退出。
顯示所有當前版本的命令的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-compatcommands [file]
: 列印相容性命令(過時的命令—譯註)的幫助資訊。
顯示所有關於相容性命令的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-module module [file]
: 列印某單一模組的幫助資訊,然後退出。
列印關於給定模組的完整資訊。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-module-list [file]
: 列出所有可用模組名,然後退出。
列出的清單包括所有模組的名字;其中,每個模組的幫助資訊可以使用--help-module選項,後跟模組名的方式得到。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-modules [file]
: 列印所有模組的幫助資訊,然後退出。顯示關於所有模組的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-custom-modules [file]
: 列印所有自定義模組名,然後退出。
顯示所有自定義模組的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-policy cmp [file]
: 列印單個策略的幫助資訊,然後退出。
顯示給定的策略的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-policies [file]
: 列印所有策略的幫助資訊,然後退出。
顯示所有策略的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-property prop [file]
: 列印單個屬性的幫助資訊,然後退出。
顯示指定屬性的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-property-list [file]
: 列出所有可用的屬性,然後退出。
該命令列出的清單包括所有屬性的名字;其中,每個屬性的幫助資訊都可以通過--help-property選項後跟一個屬性名的方式獲得。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-properties [file]
: 列印所有屬性的幫助資訊,然後退出。
顯示所有屬性的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-variable var [file]
: 列印單個變數的幫助資訊,然後退出。
顯示指定變數的完整文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-variable-list [file]
: 列出文件中有記錄的變數,然後退出。
該命令列出的清單包括所有變數的名字;其中,每個變數的幫助資訊都可以通過--help-variable選項後跟一個變數名的方式獲得。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--help-variables [file]
: 列印所有變數的幫助資訊,然後退出。
顯示所有變數的完整幫助文件。如果指定了[file]引數,幫助資訊會寫到file中,且輸出格式依賴於檔名字尾。支援的檔案格式包括:man page,HTML,DocBook以及純文字。
--copyright [file]
: 列印CMake的版權資訊,然後退出。
如果指定了[file]引數,版權資訊會寫到這個檔案中。
--help
: 列印用法資訊,然後退出。
用法資訊描述了基本的命令列介面及其選項。
--help-full [file]
: 列印完整的幫助資訊,然後退出。
顯示大多數UNIX man page提供的幫助資訊。該選項是為非UNIX平臺提供的;但是如果man手冊頁沒有安裝,它也能提供便利。如果制定了[file]引數,幫助資訊會寫到這個檔案中。
--help-html [file]
: 以HTML格式列印完整的幫助資訊,然後退出。
CMake的作者使用該選來幫助生成web頁面。如果指定了[file]引數,幫助資訊會寫到這個檔案中。
--help-man [file]
: 以UNIX的man手冊頁格式列印完整的幫助資訊,然後退出。
cmake使用該選生成UNIX的man手冊頁。如果指定了[file]引數,幫助資訊會寫到這個檔案中。
--version [file]
: 顯示程式名/版本資訊行,然後退出。
如果指定了[file]引數,版本資訊會寫到這個檔案中。
對於CMake的語言要素,比如命令,屬性和變數,幫助命令選項也是很有規律的,一般是用--help-xxx-list檢視所有值的名字,找出感興趣的項,然後用--help-xxx name檢視該名字的詳細資訊;也可以用--help-xxxs獲得相關語言要素的完整幫助資訊
生成器
在CMake 2.8.3平臺上,CMake支援下列生成器:
Borland Makefiles
: 生成Borland makefile。MSYS Makefiles
: 生成MSYS makefile。
生成的makefile用use /bin/sh作為它的shell。在執行CMake的機器上需要安裝msys。
MinGW Makefiles
: 生成供mingw32-make使用的make file。
生成的makefile使用cmd.exe作為它的shell。生成它們不需要msys或者unix shell。
NMake Makefiles
: 生成NMake makefile。NMake Makefiles JOM
: 生成JOM makefile。Unix Makefiles
: 生成標準的UNIX makefile。
在構建樹上生成分層的UNIX makefile。任何標準的UNIX風格的make程式都可以通過預設的make目標構建工程。生成的makefile也提供了install目標。
Visual Studio 10
: 生成Visual Studio 10工程檔案。Visual Studio 10 Win64
: 生成Visual Studio 10 Win64工程檔案。Visual Studio 6
: 生成Visual Studio 6工程檔案。Visual Studio 7
: 生成Visual Studio .NET 2002工程檔案。Visual Studio 7 .NET 2003
: 生成Visual Studio .NET 2003工程檔案。Visual Studio 8 2005
: 生成Visual Studio .NET 2005工程檔案。Visual Studio 8 2005 Win64
: 生成Visual Studio .NET 2005 Win64工程檔案。Visual Studio 9 2008
: 生成Visual Studio 9 2008工程檔案。Visual Studio 9 2008 Win64
: 生成Visual Studio 9 2008 Win64工程檔案。Watcom WMake
: 生成Watcom WMake makefiles。CodeBlocks - MinGW Makefiles
: 生成CodeBlock工程檔案。
在頂層目錄以及每層子目錄下為CodeBlocks生成工程檔案,生成的CMakeList.txt的特點是都包含一個PROJECT()呼叫。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
CodeBlocks - NMake Makefiles
: 生成CodeBlocks工程檔案。
在頂層目錄以及每層子目錄下為CodeBlocks生成工程檔案,生成的CMakeList.txt的特點是都包含一個PROJECT()呼叫。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
CodeBlocks - Unix Makefiles
: 生成CodeBlocks工程檔案。
在頂層目錄以及每層子目錄下為CodeBlocks生成工程檔案,生成的CMakeList.txt的特點是都包含一個PROJECT()呼叫。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
Eclipse CDT4 - MinGW Makefiles
: 生成Eclipse CDT 4.0 工程檔案。
在頂層目錄下為Eclipse生成工程檔案。在執行原始碼外構建時,一個連線到頂層原始碼路徑的資原始檔會被建立。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
Eclipse CDT4 - NMake Makefiles
: 生成Eclipse CDT 4.0 工程檔案。
在頂層目錄下為Eclipse生成工程檔案。在執行原始碼外構建時,一個連線到頂層原始碼路徑的資原始檔會被建立。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
Eclipse CDT4 - Unix Makefiles
: 生成Eclipse CDT 4.0 工程檔案。
在頂層目錄下為Eclipse生成工程檔案。在執行原始碼外構建時,一個連線到頂層原始碼路徑的資原始檔會被建立。除此之外還會在構建樹上生成一套層次性的makefile。通過預設的make目標,正確的make程式可以構建這個工程。makefile還提供了install目標。
CMD#1:add_custom_command
為生成的構建系統新增一條自定義的構建規則。
add_custom_command命令
有兩種主要的功能;第一種是為了生成輸出檔案,新增一條自定義命令。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[IMPLICIT_DEPENDS <lang1> depend1 ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM] [APPEND])
這種命令格式定義了一條生成指定的檔案(檔案組)的生成命令。在相同路徑下建立的目標(CMakeLists.txt檔案)——任何自定義命令的輸出都作為它的原始檔——被設定了一條規則:在構建的時候,使用指定的命令來生成這些檔案。如果一個輸出檔名是相對路徑,它將被解釋成相對於構建樹路徑的相對路徑,並且與當前原始碼路徑是對應的。注意,MAIN_DEPENDENCY完全是可選的,它用來向visual studio建議在何處停止自定義命令。對於各種型別的makefile而言,這條命令建立了一個格式如下的新目標:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
如果指定了多於一條的命令,它們會按順序執行。ARGS引數是可選的,它的存在是為了保持向後相容,以後會被忽略掉。
第二種格式為一個目標——比如一個庫檔案或者可執行檔案——新增一條自定義命令。這種格式可以用於目標構建前或構建後的一些操作。這條命令會成為目標的一部分,並且只有目標被構建時才會執行。如果目標已經構建了,該目標將不會執行。
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM])
這條命令定義了一個與指定目標的構建過程相關的新命令。新命令在何時執行,由下述的選項決定:
PRE_BUILD - 在所有其它的依賴之前執行;
PRE_LINK - 在所有其它的依賴之後執行;
POST_BUILD - 在目標被構建之後執行;
注意,只有Visual Studio 7或更高的版本才支援PRE_BUILD。對於其他的生成器,PRE_BUILD會被當做PRE_LINK來對待。
如果指定了WORKING_DIRECTORY選項,這條命令會在給定的路徑下執行。如果設定了COMMENT選項,後跟的引數會在構建時、以構建資訊的形式、在命令執行之前顯示出來。如果指定了APPEND選項,COMMAND以及DEPENDS選項的值會附加到第一個輸出檔案的自定義命令上。在此之前,必須有一次以相同的輸出檔案作為引數的對該命令的呼叫。在當前版本下,如果指定了APPEND選項,COMMENT, WORKING_DIRECTORY和MAIN_DEPENDENCY選項會被忽略掉,不過未來有可能會用到。
如果指定了VERBATIM選項,所有該命令的引數將會合適地被轉義,以便構建工具能夠以原汁原味的引數去呼叫那些構建命令。注意,在add_custom_command能看到這些引數之前,CMake語言處理器會對這些引數做一層轉義處理。推薦使用VERBATIM引數,因為它能夠保證正確的行為。當VERBATIM未指定時,CMake的行為依賴於平臺,因為CMake沒有針對某一種工具的特殊字符采取保護措施。
如果自定義命令的輸出並不是實際的磁碟檔案,應該使用SET_SOURCE_FILES_PROPERTIES命令將該輸出的屬性標記為SYMBOLIC。
IMPLICIT_DEPENDS選項請求掃描一個輸入檔案的隱含依賴關係。給定的語言引數(文中的lang1—譯註)指定了應該使用哪種程式語言的依賴掃描器。目前為止,僅支援C和CXX語言掃描器。掃描中發現的依賴檔案將會在編譯時新增到自定義命令中。注意,IMPLICIT_DEPENDS選專案前僅僅直至Makefile生成器,其它的生成器會忽略之。
如果COMMAND選項指定了一個可執行目標(由ADD_EXECUTABLE命令建立的目標),在構建時,它會自動被可執行檔案的位置所替換。而且,一個目標級的依賴性將會被新增進去,這樣這個可執行目標將會在所有依賴於該自定義命令的結果的目標之前被構建。不過,任何時候重編譯這個可執行檔案,這種特性並不會引入一個會引起自定義命令重新執行的檔案級依賴。
DEPENDS選項指定了該命令依賴的檔案。如果依賴的物件是同一目錄(CMakeLists.txt檔案)下另外一個自定義命令的輸出,CMake會自動將其它自定義命令帶到這個命令中來。如果DEPENDS指定了任何型別的目標(由ADD_*命令建立),一個目標級的依賴性將會被建立,以保證該目標在任何其它目標使用這個自定義命令的輸出之前,該目標已經被建立了。而且,如果該目標是可執行檔案或庫檔案,一個檔案級依賴將會被建立,用來引發自定義命令在目標被重編譯時的重新執行。
在Unix Makefile中,這條命令相當於增加了一個依賴關係和一條顯式生成命令。
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])
這條命令的作用是為構建新增一個子路徑。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:break
從一個包圍該命令的foreach或while迴圈中跳出。
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_minimum_required
設定一個工程所需要的最低CMake版本。
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_policy
管理CMake的策略設定。
隨著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: elseif 開始
if 塊的 elseif 部分。
elseif(expression)
參見if命令。
CMD#19: enable_language 支援某種語言
(CXX/C/Fortran/等)
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: endforeach
結束foreach語句塊中的一系列命令。
endforeach(expression)
參見FOREACH命令。
CMD#22: endfunction
結束一個function語句塊中的一系列命令。
endfunction(expression)
參見function命令。
CMD#23: endif
結束一個if語句塊中的一系列命令。
endif(expression)
參見if命令。
CMD#24: endmacro
結束一個macro語句塊中的一系列命令。
endmacro(expression)
參見macro命令。
CMD#25: endwhile
結束一個while語句塊中的一系列命令。
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選項,搜尋過程如下:
1、在cmake特有的cache變數中指定的搜尋路徑搜尋。這些路徑用於在命令列裡用-DVAR=value被設定。如果使用了NO_CMAKE_PATH選項,該路徑會被跳過。(此句翻譯可能有誤——譯註。)搜尋路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變數:CMAKE_INCLUDE_PATH
變數:CMAKE_FRAMEWORK_PATH
2、在cmake特定的環境變數中指定的搜尋路徑搜尋。該路徑會在使用者的shell配置中被設定。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,該路徑會被跳過。搜尋路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變數:CMAKE_INCLUDE_PATH
變數:CMAKE_FRAMEWORK_PATH
3、由HINTS選項指定的搜尋路徑。這些路徑是由系統內省(introspection)時計算出來的路徑,比如已經發現的其他項的位置所提供的痕跡。硬編碼的參考路徑應該使用PATHS選項指定。(HINTS與PATHS有何不同?比後者的優先順序高?有疑問。——譯註)
4、搜尋標準的系統環境變數。如果指定NO_SYSTEM_ENVIRONMENT_PATH選項,搜尋路徑將跳過其後的引數。搜尋路徑包括環境變數PATH個INCLUDE。
5、查詢在當前系統的平臺檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。其他的搜尋路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的路徑<prefix>,<prefix>/include
變數:CMAKE_SYSTEM_INCLUDE_PATH
變數:CMAKE_SYSTEM_FRAMEWORK_PATH
6、搜尋由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選項,那麼搜尋的過程中不會有其他的附加路徑。如果沒有指定該選項,搜尋過程如下:
1、搜尋cmake特有的cache變數指定的路徑。這些變數是在用cmake命令列時,通過-DVAR=value指定的變數。如果指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
2、搜尋cmake特有的環境變數指定的路徑。這些變數是使用者的shell配置中設定的變數。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
3、搜尋由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,比如由另一個已經發現的庫檔案的地址提供的參考資訊。硬編碼的推薦路徑應該通過PATHS選項指定。
4、查詢標準的系統環境變數。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
PATH
LIB
5、查詢在為當前系統的平臺檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/lib
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
6、搜尋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_*選項都會被啟用。
1、搜尋在cmake特有的cache變數中指定的搜尋路徑。這些變數是為了在命令列中用-DVAR=value選項指定而設計的。通過指定NO_CMAKE_PATH選項可以跳過該搜尋路徑。搜尋路徑還包括:
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
2、搜尋cmake特有的環境變數。這些變數是為了在使用者的shell配置中進行配置而設計的。通過指定NO_CMAKE_ENVIRONMENT_PATH選項可以跳過該路徑。搜尋的路徑包括:
<package>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
3、搜尋HINTS選項指定的路徑。這些路徑應該是由作業系統內省時計算產生的,比如由其它已經找到的項的位置而提供的線索。硬編碼的參考路徑應該在PATHS選項中指定。
4、搜尋標準的系統環境變數。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。以"/bin"或"/sbin"結尾的路徑條目會被自動轉換為它們的父路徑。搜尋的路徑包括:
PATH
5、搜尋在CMake GUI中最新配置過的工程的構建樹。可以通過設定NO_CMAKE_BUILDS_PATH選項來跳過這些路徑。這是為了在使用者正在依次構建多個相互依賴的工程時而準備的。
6、搜尋儲存在CMake使用者包登錄檔中的路徑。通過設定NO_CMAKE_PACKAGE_REGISTRY選項可以跳過這些路徑。當CMake嗲用export(PACKAGE<name>)配置一個工程時,這些路徑會被儲存在登錄檔中。參見export(PACKAGE)命令的文件閱讀更多細節。
7、搜尋在當前系統的平臺檔案中定義的cmake變數。可以用NO_CMAKE_SYSTEM_PATH選項跳過這些路徑。
CMAKE_SYSTEM_PREFIX_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
8、搜尋由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選項,搜尋的過程如下:
1、搜尋cmake專有的cache變數中的路徑。這種用法是為了在命令列中用選項-DVAR=value指定搜尋路徑。如果指定了NO_CMAKE_PATH選項,該路徑會被跳過。搜尋路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>/,路徑<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
2、搜尋cmake專有的環境變數中指定的路徑。這種用法是為了在使用者的shell配置中設定指定的搜尋路徑。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,該路徑會被跳過。搜尋路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>/,路徑<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
3、搜尋由HINTS選項指定的路徑。這些路徑應該是由系統內省時計算得出的路徑,比如由其它已經發現的專案提供的線索。硬編碼的參考路徑應該在PATHS選項中指定。
4、搜尋標準的系統環境變數。通過指定選項NO_SYSTEM_ENVIRONMENT_PATH可以跳過搜尋環境變數。搜尋的路徑還包括:
PATH
INCLUDE
5、查詢在為當前系統的平臺檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/include
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
6、搜尋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選項,那麼搜尋的過程中不會有其他的附加路徑。如果沒有指定該選項,搜尋過程如下:
1、搜尋cmake特有的cache變數指定的路徑。這些變數是在用cmake命令列時,通過-DVAR=value指定的變數。如果指定了NO_CMAKE_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
2、搜尋cmake特有的環境變數指定的路徑。這些變數是使用者的shell配置中設定的變數。如果指定了NO_CMAKE_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
3、搜尋由HINTS選項指定的路徑。這些路徑是系統內省(introspection)估算出的路徑,比如由另一個已經發現的程式的地址提供的參考資訊。硬編碼的推薦路徑應該通過PATHS選項指定。
4、查詢標準的系統環境變數。如果指定了NO_SYSTEM_ENVIRONMENT_PATH選項,這些路徑會被跳過。搜尋的路徑還包括:
PATH
5、查詢在為當前系統的平臺檔案中定義的cmake變數。如果指定了NO_CMAKE_SYSTEM_PATH選項,該路徑會被跳過。搜尋的路徑還包括:
對於每個在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路徑<prefix>/[s]bin
CMAKE_SYSTEM_PROGRAM_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
6、搜尋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_wrap_ui
建立FLTK使用者介面包裝器。
fltk_wrap_ui(resultingLibraryName source1
source2 ... sourceN )
為所有列出的.fl和.fld檔案生成.h和.cxx檔案。這些生成的.h和.cxx檔案將會加到變數resultingLibraryName_FLTK_UI_SRCS中,它也會加到你的庫中。
CMD#35 : foreach
對一個list中的每一個變數執行一組命令。
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 :get_cmake_property
獲取一個CMake例項的屬性。
get_cmake_property(VAR property)
從指定的CMake例項中獲取屬性。屬性的值儲存在變數VAR中。如果屬性不存在,CMake會報錯。一些會被支援的屬性包括:VATIABLES,COMMANDS,MACROS以及COMPONENTS。
CMD#38 :get_directory_property
獲取DIRECTORY域中的某種屬性。
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運算子的左邊的引數和右邊的引數會被獨立測試,用來確認它們是否是布林常量;如果是,就用這個常量,否則它們會被當做變數然後被解引用。
從給定的檔案中讀取CMake的列表檔案。CMD#45
:include
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
[NO_POLICY_SCOPE])
從給定的檔案中讀取CMake的清單檔案程式碼。在清單檔案中的命令會被立即處理,就像它們是寫在這條include命令展開的地方一樣。如果指定了OPTIONAL選項,那麼如果被包含檔案不存在的話,不會報錯。如果指定了RESULT_VARIABLE選項,那麼var或者會被設定為被包含檔案的完整路徑,或者是NOTFOUND,表示沒有找到該檔案。
如果指定的是一個模組(module)而不是一個檔案,查詢的物件會變成路徑CMAKE_MODULE_PATH下的檔案<modulename>.camke。
參考cmake_policy()命令文件中關於NO_POLICY_SCOPE選項的討論。
CMD#46 : include_directories
為構建樹新增包含路徑。
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
將給定的路徑新增到編譯器搜尋包含檔案(.h檔案)的路徑列表中。預設情況下,該路徑會被附加在當前路徑列表的後面。這種預設行為可以通過設定CMAKE_include_directories_BEFORE變數為ON被改變。通過將該變數改變為BEFORE或AFTER,你可以在追加和附加在前端這兩種方式中選擇,而不用理會預設設定。如果指定了SYSTEM選項,編譯器將會認為該路徑是某種平臺上的系統包含路徑。
CMD#47
:include_external_msproject
在一個workspace中包含一個外部的Microsoft工程。
include_external_msproject(projectname locationdep1 dep2 ...)
在生成的workspace檔案中包含一個外部的Microsoft工程。它會建立一個名為[projectname]的目標。這個目標可以用在add_dependencies命令中讓其他工程依賴於這個外部工程。當前版本下,該命令在UNIX平臺上不會做任何事情。
CMD#48 : include_regular_expression 設定用於依賴性檢查的正則表示式。
include_regular_expression(regex_match [regex_complain])
設定依賴性檢查的正則表示式。這有匹配正則表示式regex_match的檔案會成為依賴性跟蹤的物件。只有匹配regex_complain的檔案,在找不到它們的時候才會給出警告(標準標頭檔案不會被搜尋)。正則表示式的預設值是:
regex_match = "^.*$" (匹配所有檔案) regex_complain = "^$" (僅匹配空字串)
CMD#49 :install指定在安裝時要執行的規則。
該命令為一個工程生成安裝規則。在某一原始檔路徑中,呼叫這條命令所指定的規則會在安裝時按順序執行。在不同路徑之間的順序未定義。
該命令有諸多版本。其中的一些版本定義了檔案以及目標的安裝屬性。這多個版本的公共屬性都有所涉及,但是隻有在指定它們的版本中,這些屬性才是合法的(下面的DESTIONATION到OPTIONAL的選項列表是公共屬性。——譯註)。
DESTINATION選項指定了一個檔案會安裝到磁碟的哪個路徑下。若果給出的是全路徑(以反斜槓或者驅動器名開頭),它會被直接使用。如果給出的是相對路徑,它會被解釋為相對於CMAKE_INSTALL_PREFIX的值的相對路徑。
PERMISSIONS選項制定了安裝檔案需要的許可權。合法的許可權有:OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID。對於在某些特定的平臺上沒有意義的許可權,在這些平臺上會忽略這些選項。
CONFIGURATIONS選項指定了該安裝規則將會加諸之上的一系列的構建配置(Debug,Release,等等)。
COMPONENT選項指定了該安裝規則相關的一個安裝部件的名字,比如“runtime”或“development”。對於那些指定安裝部件的安裝過程來說,在安裝時只有與給定的部件名相關的安裝規則會被執行。對於完整安裝,所有部件都會被安裝。
RENAME選項為一個可能不同於原始檔案的已經安裝的檔案指定另一個名字。重新命名只有在該命令正在安裝一個單一檔案時才被允許(猜測是為了防止檔名衝突時覆蓋掉舊檔案。——譯註)。
OPTIONAL選項表示要安裝的檔案不存在不會導致錯誤。
TARGETS版本的install命令
install(TARGETS targets... [EXPORT <export-name>]
[[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]
] [...])
TARGETS格式的install命令規定了安裝工程中的目標(targets)的規則。有5中可以被安裝的目標檔案:ARCHIVE,LIBRARY,RUNTIME,FRAMEWORK,和BUNDLE。除了被標記為MACOSX_BUNDLE屬性的可執行檔案被當做OS X上的BUNDLE目標外,其他的可執行檔案都被當做RUNTIME目標。靜態連結的庫檔案總是被當做ARCHIVE目標。模組庫總是被當做LIBRARY目標。對於動態庫不是DLL格式的平臺來說,動態庫會被當做LIBRARY目標來對待,被標記為FRAMEWORK的動態庫是例外,它們被當做OS X上的FRAMEWORK目標。對於DLL平臺而言,動態庫的DLL部分被當做一個RUNTIME目標而對應的匯出庫被當做是一個ARCHIVE目標。所有基於Windows的系統,包括Cygwin,都是DLL平臺。ARCHIVE,LIBRARY,RUNTIME和FRAMEWORK引數改變了後續屬性會加諸之上的目標的型別。如果只給出了一種型別,那麼只有那種型別的目標會被安裝(這樣通常只會安裝一個DLL或者一個匯出庫。)
PRIVATE_HEADER,PUBLIC_HEADER,和RESOURCE選項的功能是,在非蘋果平臺上,將後續的屬性應用在待安裝的一個FRAMEWORK共享庫目標的相關檔案上。這些選項定義的規則在蘋果系統上會被忽略掉,因為相關的檔案將會被安裝到framework資料夾內的合適位置。參見PRIVATE_HEADER,PUBLIC_HEADER和RESOURCE目標屬性中更為詳細的解釋。
可以指定NAMELINK_ONLY或者NAMELINK_SKIP選項作為LIBRARY選項。在一些平臺上,版本化的共享庫有一個符號連結,比如lib<name>.so -> lib<name>.so.1,其中“lib<name>.so.1”是so庫檔名(soname)而“lib<name>.so”是一個符號連結,當指定“-l<name>”選項時,連結器將會查詢這個符號連結。如果一個庫目標已經被安裝,NAMELINK_ONLY選項表示僅僅安裝符號連結;而NAME_SKIP選項則表示僅僅安裝庫檔案而不是符號連結。當兩種選項都沒有給出時,動態庫的兩個部分都會被安裝。在那些版本化的共享庫沒有符號連結或者庫沒有被版本化的平臺,選項NAMELINK_SKIP安裝這個庫,而NAMELINK_ONLY選項什麼都不會安裝。參見VERSION和SOVERSION目標屬性,獲取關於建立版本化共享庫的更多細節。
在該命令的TARGETS版本的一次呼叫中,可以一次性指定一個或多個屬性組。一個目標也可以被多次安裝到不同的位置。假設有三個目標myExe,mySharedLib和myStaticLib,下面的程式碼
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)
將會把myExe安裝到<prefix>/bin目錄下,把myStaticLib安裝到<prefix>/lib/static目錄下。在非-DLL平臺上,mySharedLib將會被安裝到<prefix>/lib和/some/full/path下。在DLL平臺上,mySharedLib DLL將會被安裝到<prefix>/bin和/some/full/path路徑下,它的匯出庫會被安裝到<prefix>/lib/static和/some/full/path路徑下。
EXPORT選項將已經安裝的目標檔案和一個名為<export-name>的匯出檔案關聯起來。它必須出現在所有RUNTIME,LIBRARY或者ARCHIVE選項之前。為了實際安裝匯出檔案本身(export file),呼叫install(EXPORT)。參見下述install命令EXPORT版本的文件獲取更多的細節。
將EXCLUDE_FROM_ALL設定為true時,安裝一個目標會造成未定義的行為。
FILES版本的install命令
install(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
FILES版本的install命令指定了為一個工程安裝檔案的規則。在命令中,以相對路徑方式給出的檔名是相對於當前原始碼路徑而言的。以這個版本安裝的檔案,如果沒有指定PERMISSIONS選項,預設會具有OWNER_WRITE,OWNER_READ,GROUP_READ,和WORLD_READ的許可權。
PROGRAMS版本的install命令
install(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
PROGRAMS版本與FILES版本一樣,只在預設許可權上有所不同:它還包括了OWNER_EXECUTE,GROUP_EXECUTE和WORLD_EXECUTE選項。INSTALL的這個版本用來安裝不是目標的程式,比如shell指令碼。使用TARGETS格式安裝該工程內部構建的目標。
DIRECTORY版本的install命令
install(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>] [FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
INSTALL的DIRECTORY版本將一個或者多個路徑下的內容安裝到指定的目標地址下。目錄結構會原封不動地(verbatim)拷貝到目標地址。每個路徑名的最後一部分會追加到目標路徑下,但是結尾反斜槓(trailing slash)可以用來避免這一點,因為這樣最後一部分就是空的。給定的相對路徑名被解釋成相對於當前源路徑的路徑。如果沒有指定輸入目錄名字,目標目錄會被建立,但是不會安裝任何東西。FILE_PERMISSIONS和DIRECTORY_PERMISSIONS選項指定了賦予目標路徑和目標檔案的許可權。如果指定了USE_SOURCE_PERMISSIONS選項,但沒有指定FILE_PERMISSIONS選項,檔案許可權將沿襲源目錄結構的許可權,而且這個路徑會被賦予PAROGRAMS版本中指定的預設許可權。
通過使用PATTERN或REGEX選項可以對路徑安裝做出細粒度的控制。這些用於匹配的選項指定了一個查詢模式或正則表示式來匹配輸入路徑內的路徑或檔案。它們可以用來將特定的選項(見下文)加諸於遇到的檔案和路徑的一個子集上。每個輸入檔案或路徑的完整路徑(反斜槓/開頭的路徑)將用來匹配該表示式。PATTERN僅僅用來匹配完全檔名:匹配該模式的全路徑的那部分必須出現在檔名的結尾,並且必須以一個反斜槓開始。
正則表示式會用來匹配一個完全路徑的任何部分,但是它也可以使用'/'和'$'模仿PATTERN的行為。預設情況下,所有檔案和路徑不管是否匹配都會被安裝。可以在第一個匹配選項之前指定FILE_MATCHING選項,這樣就能禁止安裝那些不與任何表示式匹配的檔案。比如,程式碼
install(DIRECTORY src/ DESTINATION include/myproj
FILES_MATCHING PATTERN "*.h")
將會精確匹配並安裝從原始碼樹上得到的標頭檔案。
有些選項後面可以跟在PATTERN或者REGEX表示式的後面,這樣這些選項只能加諸於匹配PATTERN/REGEX的檔案或路徑上。EXCLUDE選項將會指示安裝過程跳過那些匹配的檔案或者路徑。PERMISSIONS選項可以覆蓋那些匹配PATTERN/REGEX的檔案的許可權設定。例如,程式碼
install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)
會將icons路徑安裝到share/myproject/icons下,同時把scripts目錄安裝到share/myproj路徑下。icons將具備預設的檔案許可權,scripts將會被給與指定的許可權,但是所有CVS路徑排除在外。
SCRIPT和CODE版本的install命令
install([[SCRIPT <file>] [CODE <code>]] [...])
SCRIPT格式將會在安裝期呼叫給定的指令碼檔案。如果指令碼檔名是一個相對路徑,它會被解釋為相對於當前的源路徑。CODE格式將會在安裝期呼叫給定的CMake程式碼。code被指定為一個雙引號括起來的單獨的引數。例如,程式碼
install(CODE "MESSAGE(\"Sample install message.\")")
會在安裝時列印一條訊息。
EXPORT版本的install命令
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>])
EXPORT格式的install命令生成並安裝一個包含將安裝過程的安裝樹匯入到另一個工程中的CMake檔案。Target格式的安裝過程與上文提及的使用EXPORT選項的install(TARGET ...)格式的命令中的EXPORT <export-name>選項是相關的。NAMESPACE選項會在它們被寫入到匯入檔案時加到目標名字之前。預設時,生成的檔案就是<export-name>.cmake;但是FILE選項可以用來指定不同於次的檔名。FILE選項後面的引數必須是一“.cmake”為副檔名的檔案。如果指定了CONFIGURATIONS選項,那麼只有那些具名的配置中的一個被安裝時,這個檔案才會被安裝。而且,生成的匯入檔案只能涉及到匹配的目標配置版本。如果指定了一個COMPONENT選項,並且<component>與那個<export-name>相關的目標指定的部件不匹配,那麼行為是未定義的。如果一個庫目標被包含在export之中,但是與之關聯的庫卻沒有揹包含,那麼結果是未指定的。
EXPORT格式可以協助外部工程使用當前工程構建出來並安裝的目標。例如,程式碼
install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)
將會把可執行檔案myexe安裝到<prefix>/bin下,並且將匯入它的程式碼寫到檔案"<prefix>/lib/myproj/myproj.cmake"中。一個外部工程可以用include命令載入這個檔案,並且可以在安裝樹上使用匯入的目標名mp_myexe(字首_目標名——譯註)引用myexe可執行檔案,如同這個目標是它自身的構建樹的內建目標一樣。
注意:這個命令會取代INSTALL_TARGETS命令以及PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT兩個目標屬性。它也可以取代FILES格式的INSTALL_FILES命令和INSTALL_PROGRAMS命令。由INSTALL命令生成的安裝規則相對於那些由INSTALL_TARGETS,INSTALL_FILES和INSTALL_PROGRAMS命令生成的安裝規則處理順序是未定義的。
CMD#50 :link_directories 指定
聯結器查詢庫的路徑。
link_directories(directory1 directory2 ...)
指定聯結器搜尋庫檔案時的路徑。該命令僅僅能用在那些在它被呼叫後才生成的目標上。由於歷史上的原因,為該命令指定的相對路徑將會不加改變地傳遞給聯結器(不像許多其他CMake命令那樣解釋為相對於當前源路徑的相對路徑。)
CMD#51: list
列表操作命令。
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...] <output variable>)
list(APPEND <list> <element> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
使用LENGTH選項時,該命令會返回給定list的長度。
使用GET選項時,該命令返回list中所有被index索引的元素構成的list。
使用APPEND選項時,該命令將會在該list之後追加若干元素。
使用FIND選項時,該命令將返回list中指定的元素的索引;若果未找到,返回-1。
使用INSERT選項時,該命令將在list中指定的位置插入若干元素。
使用REMOVE_AT和REMOVE_ITEM選項將會從list中刪除一些元素。它們之間的區別是:REMOVE_ITEM刪除的是指定的項,而REMOVE_AT刪除的是在指定索引處的項。
使用REMOVE_DUPLICATES選項時,該命令將刪除list中的重複項。
使用REVERSE選項時,該命令將把list的內容就地前後倒換。
使用SORT選項時,該命令將按字母序對list總的內容就地排序。
注意:在CMake中,一個list是一個由封號;分割的一組字串。使用set命令可以建立一個list。例如,set(var a b c d e)命令將會建立一個list:a;b;c;d;e;而set(var "a b c d e")命令建立的只是一個字串,或者說是隻有一個項的list。
當使用指定索引的命令格式時,如果<element index>是大於等於0的數,<element index>是從list第一個項開始的序號,list的第一項的索引是0。如果<element index>小於等於-1,這個索引是從結尾開始的逆向索引,其中-1表示的是list的最後一項。當使用負數索引時,注意它們不是從0開始!-0與0等價,它指向list的第一個成員。
CMD#52:load_cache
從另一個工程的CMake cache中載入值。
load_cache(pathToCacheFile READ_WITH_PREFIX
prefix entry1...)
該命令讀取指定的cache檔案,並將以請求的字首為其字首的那些cache檔案中的entry(ies)儲存到變數中。這個格式僅僅讀取值,但是不在本地工程的cache中建立entry(ies)。
load_cache(pathToCacheFile [EXCLUDE entry1...]
[INCLUDE_INTERNALS entry1...])
從另一個cache檔案中載入值並像內部entry(ies)那樣,將它們儲存到本地工程的cache中。這條命令對於一個依賴於另一個不同構建樹上的另一個工程的工程比較有用。EXCLUDE選項給出了那些需要排除在外的entry(ies)的一個list。INCLUDE_INTERNALS選項給出了需要包含的entry(ies)的內部entry(ies)的一個list。通常情況下,不需要引入內部entry(ies)。強烈不推薦使用該命令的這種格式,但是它可以被用來維持向後相容性。
CMD#53:load_command
將一條命令載入到一個執行中的CMake。
load_command(COMMAND_NAME <loc1> [loc2 ...])
該命令將在給定的路徑下查詢名字為cmCOMMAND_NAME的一個庫。如果找到了,它將會以模組的方式被載入,然後該命令將會被新增到可用的CMake命令集中。通常,TRY_COMPILE選項被用在這個命令之前來編譯這個模組。如果該命令被成功載入,一個名為CMAKE_LOADED_COMMAND_<COMMAND_NAME>的變數將會被設定為這個載入模組的完整路徑。否則,這個變數就不會被設定。
CMD#54:macro
為後續以命令方式呼叫而開始記錄一組巨集。
macro(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endmacro(<name>)
定義一個名為<name>的巨集,它以arg1 arg2 arg3 (...)為引數。在macro命令之後,在與之配對的endmacro命令之前出現的命令,只有在巨集被呼叫的時候才會被呼叫。當被呼叫的時候,這些被記錄的命令首先以傳進來的實參替換掉形參(如${arg1}),然後像正常的命令那樣執行。除了形參之外,你還可以引用變數${ARGC},它表示傳遞到巨集裡的引數的數量;${ARG0}, ${ARG1}, ${ARG2} ...等等則是傳進來的實參值。這些變數使得建立帶可選引數的巨集變得很便捷。此外,變數${ARGV}保留了所有傳遞到巨集裡的所有引數組成的一個list,變數${ARGN}保留了在最後一個形參之後的引數組成的一個list。注意:傳遞到巨集內部的引數和值,比如ARGN不是CMake通常意義下的變數;它們只是字串替換,這一點非常像C前處理器對C語言巨集的處理過程。如果你想要用真正的CMake變數,你應該檢視一下function命令的說明。
關於在macro內部的策略的行為,參見cmake_policy()命令的相關文件。
CMD#55:mark_as_advanced
將CMake 的快取變數標記為高階。
mark_as_advanced([CLEAR|FORCE] VAR VAR2 VAR...)
將快取的變數標記為高階變數。其中,高階變數指的是那些在cmake GUI中,只有當“顯示高階選項”被開啟時才會被顯示的變數。如果CLEAR是第一個選項,引數中的高階變數將變回非高階變數。如果FORCE是第一個選項,引數中的變數會被提升為高階變數。如果兩者都未出現,新的變數會被標記為高階變數;如果這個變數已經是高階/非高階狀態的話,它將會維持原狀。
該命令在指令碼中無效。
CMD#56:math
數學表示式。
math(EXPR <output variable> <math expression>)
EXPR計算數學表示式然後通過output變數返回計算結果。數學表示式的一個例子是"5*(10+13)"。該命令支援的運算子包括:+ - * / % ^ ~ << >> ;它們的含義與C語言中的完全一致。
CMD#57:message
為使用者顯示一條訊息。
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
"message to display" ...)
可以用下述可選的關鍵字指定訊息的型別:
(無) = 重要訊息;
STATUS = 非重要訊息;
WARNING = CMake 警告, 會繼續執行;
AUTHOR_WARNING = CMake 警告 (dev), 會繼續執行;
SEND_ERROR = CMake 錯誤, 繼續執行,但是會跳過生成的步驟;
FATAL_ERROR = CMake 錯誤, 終止所有處理過程;
CMake的命令列工具會在stdout上顯示STATUS訊息,在stderr上顯示其他所有訊息。CMake的GUI會在它的log區域顯示所有訊息。互動式的對話方塊(ccmake和CMakeSetup)將會在狀態行上一次顯示一條STATUS訊息,而其他格式的訊息會出現在互動式的彈出式對話方塊中。
CMake警告和錯誤訊息的文字顯示使用的是一種簡單的標記語言。文字沒有縮排,超過長度的行會回捲,段落之間以新行做為分隔符。
CMD#58:option
為使用者提供一個可選項。
option(<option_variable> "描述選項的幫助性文字" [initial value])
該命令為使用者提供了一個在ON和OFF中做出選擇的選項。如果沒有指定初始值,將會使用OFF作為初值。如果有些選項依賴於其他選項的值,參見CMakeDependentOption模組的幫助檔案。
CMD#59:output_required_files
輸出一個list,其中包含了一個給定原始檔所需要的其他原始檔。
output_required_files(srcfile outputfile)
輸出一個指定的原始檔所需要的所有原始檔的list。這個list會寫到outputfile變數中。該命令的功能是將srcfile的依賴性寫出到outputfile中,不過該命令將盡可能地跳過.h檔案,搜尋依賴中的.cxx,.c和.cpp檔案。
CMD#60:project
為整個工程設定一個工程名。
project(<projectname> [languageName1 languageName2 ... ] )
為本工程設定一個工程名。而且,該命令還將變數<projectName>_BINARY_DIR和<projectName>_SOURCE_DIR設定為對應值。後面的可選項還可以讓你指定你的工程可以支援的語言。比如CXX(即C++),C,Fortran,等等。在預設條件下,支援C和CXX語言。例如,如果你沒有C++編譯器,你可以通過列出你想要支援的語言,例如C,來明確地禁止對它的檢查。使用特殊語言"NONE",針對任何語言的檢查都會被禁止。
CMD#61:qt_wrap_cpp
建立Qt包裹器。
qt_wrap_cpp(resultingLibraryName DestName SourceLists ...)
為所有在SourceLists中列出的.h檔案生成moc檔案。這些moc檔案將會被新增到那些使用DestName原始檔列表的庫檔案中。
Produce moc files for all the .h files listed in the SourceLists. The moc files will be added to the library using the DestName source list.
CMD#62:qt_wrap_ui
建立Qt的UI包裹器。
qt_wrap_ui(resultingLibraryName HeadersDestName SourcesDestName SourceLists ...)
為所有在SourceLists中列出的.ui檔案生成.h和.cxx檔案。這些.h檔案會被新增到使用HeadersDestNamesource列表的庫中。這些.cxx檔案會被新增到使用SourcesDestNamesource列表的庫中。
CMD#63:remove_definitions
取消由add_definitions命令新增的-D定義標誌。
remove_definitions(-DFOO -DBAR ...)
在當前及以下的路徑,從編譯命令列中取消(由add_definitions命令新增的)標誌。
CMD#64:return
從一個檔案,路徑或函式內返回。
return()
從一個檔案,路徑或函式中返回。若出現在一個include檔案裡(經由include()或find_package()命令),該命令會導致當前檔案的處理過程停止,並且將控制權轉移到試圖包含它的檔案中。若出現在一個不被任何檔案包含的檔案中,例如,一個CMakeLists.txt中,那麼該命令將控制權轉移到父目錄下,如果存在這樣的父目錄的話。如果在一個函式中呼叫return函式,控制權會返回到該函式的呼叫函式那裡。注意,巨集不是函式,它不會像函式那樣去處理return命令。
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#78unset
撤銷對一個變數,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命令使用相同的邏輯。
CMake變數按功能分有主要有四種不同的型別:1.) 提供資訊的變數[共53個];2.) 改變行為的變數[共23個];3.) 描述系統的變數[共24個];4.)控制構建過程的變數[共22個]。此外還有一些變數因編譯使用的語言不同而不同,將它們歸為第五類[共29個]。由於變數比較多,這裡只給出變數的大概描述;具體作用可使用cmake --help-variable variable_name命令檢視。
一、提供資訊的變數
VAR#1-1 : CMAKE_AR
靜態庫的歸檔工具名字。
VAR#1-2 : CMAKE_BINARY_DIR
構建樹的頂層路徑。
VAR#1-3 : CMAKE_BUILD_TOOL
實際構建過程中使用的工具。
VAR#1-4 : CMAKE_CACHEFILE_DIR
檔案CMakeCache.txt所在的路徑。
VAR#1-5 : CMAKE_CACHE_MAJOR_VERSION
用於建立CMakeCache.txt檔案的CMake的主版本號。
VAR#1-6 : VCMAKE_CACHE_MINOR_VERSION
用於建立CMakeCache.txt檔案的CMake的子版本號。
VAR#1-7 : CMAKE_CACHE_PATCH_VERSION
用於建立CMakeCache.txt檔案的CMake的補丁號。
VAR#1-8 : CMAKE_CFG_INTDIR
構建時,與構建配置相對應的輸出子路徑(只讀)。
VAR#1-9 : CMAKE_COMMAND
指向CMake可執行檔案的完整路徑。
VAR#1-10 : CMAKE_CROSSCOMPILING
指出CMake是否正在交叉編譯。
VAR#1-11 : CMAKE_CTEST_COMMAND
與cmake一起安裝的ctest命令的完整路徑。
VAR#1-12 : CMAKE_CURRENT_BINARY_DIR
當前正在被處理的二進位制目錄的路徑。
VAR#1-13 : CMAKE_CURRENT_LIST_DIR
當前正在處理的listfile的完整目錄。
VAR#1-14 : CMAKE_CURRENT_LIST_FILE
當前正在處理的listfile的完整路徑。
VAR#1-15 : CMAKE_CURRENT_LIST_LINE
當前正在處理的listfile的行號。
VAR#1-16 : CMAKE_CURRENT_SOURCE_DIR
指向正在被處理的原始碼目錄的路徑。
VAR#1-17 : CMAKE_DL_LIBS
包含dlopen和dlclose函式的庫的名稱。
VAR#1-18 : CMAKE_EDIT_COMMAND
指向cmake-gui或ccmake的完整路徑。
VAR#1-19 : CMAKE_EXECUTABLE_SUFFIX(_<LANG>)
本平臺上可執行檔案的字尾。
VAR#1-20 : CMAKE_EXTRA_GENERATOR
構建本工程所需要的額外生成器。
VAR#1-21 : CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES
附加的共享庫字尾(除CMAKE_SHARED_LIBRARY_SUFFIX以外,其他可以識別的共享庫的字尾名。)
VAR#1-22 : CMAKE_GENERATOR
用於構建該工程的生成器。
VAR#1-23 : CMAKE_HOME_DIRECTORY
指向原始碼樹頂層的路徑。
VAR#1-24 : CMAKE_IMPORT_LIBRARY_PREFIX(_<LANG>)
需要連結的匯入庫的字首。
VAR#1-25 : CMAKE_IMPORT_LIBRARY_SUFFIX(_<LANG>)
需要連結的匯入庫的字尾。
VAR#1-26 : CMAKE_LINK_LIBRARY_SUFFIX
需要連結的庫的字尾。
VAR#1-27 : CMAKE_MAJOR_VERSION
cmake的主版本號(例如2.X.X中的2)。
VAR#1-28 : CMAKE_MAKE_PROGRAM
參見CMAKE_BUILD_TOOL。
VAR#1-29 : CMAKE_MINOR_VERSION
cmake的次版本號(例如X.4.X中的4)。
VAR#1-30 : CMAKE_PARENT_LIST_FILE
當前正在被處理listfile的父listfile的全路徑。
VAR#1-31 : CMAKE_PATCH_VERSION
cmake的補丁號(例如X.X.3中的3)。
VAR#1-32 : CMAKE_PROJECT_NAME
當前工程的工程名。
VAR#1-33 : CMAKE_RANLIB
靜態庫的隨機化工具的名字(比如linux下的ranlib)。
VAR#1-34 :CMAKE_ROOT
CMake的安裝路徑。
VAR#1-35 : CMAKE_SHARED_LIBRARY_PREFIX(_<LANG>)
被連結的共享庫的字首。
VAR#1-36 : CMAKE_SHARED_LIBRARY_SUFFIX(_<LANG>)
被連結的共享庫的字尾。
VAR#1-37 :CMAKE_SHARED_MODULE_PREFIX(_<LANG>)
被連結的可載入模組的字首。
VAR#1-38 : CMAKE_SHARED_MODULE_SUFFIX(_<LANG>)
被連結的共享庫的字尾。
VAR#1-39 : CMAKE_SIZEOF_VOID_P
void指標的長度。
VAR#1-40 :CMAKE_SKIP_RPATH
如果變數為真,不為編譯出的可執行檔案新增執行時的路徑資訊。預設新增。
VAR#1-41 :CMAKE_SOURCE_DIR
原始碼樹的頂層路徑。
VAR#1-42 :CMAKE_STANDARD_LIBRARIES
連結到所有可執行檔案和共享庫上的庫。這是一個list。
VAR#1-43 :CMAKE_STATIC_LIBRARY_PREFIX(_<LANG>)
被連結的靜態庫的字首。
VAR#1-44 :CMAKE_STATIC_LIBRARY_SUFFIX(_<LANG>)
被連結的靜態庫的字尾。
VAR#1-45 :CMAKE_TWEAK_VERSION
cmake的tweak版本號(例如X.X.X.1中的1)。
VAR#1-46 :CMAKE_USING_VC_FREE_TOOLS
如果用到了免費的visual studio工具,設定為真。
VAR#1-47 :CMAKE_VERBOSE_MAKEFILE
設定該變數為真將建立完整版本的makefile。
VAR#1-48 :CMAKE_VERSION
cmake的完整版本號;格式為major.minor.patch[.tweak[-id]]。
VAR#1-49 :PROJECT_BINARY_DIR
指向工程構建目錄的全路徑。
VAR#1-50 :PROJECT_NAME
向project命令傳遞的工程名引數。
VAR#1-51 :PROJECT_SOURCE_DIR
當前工程的原始碼路徑。
VAR#1-52 :[Project name]_BINARY_DIR
給定工程的二進位制檔案頂層路徑。
VAR#1-53 :[Project name]_SOURCE_DIR
給定工程的原始碼頂層路徑。
==========================End