CMake在項(xiàng)目中的組織結(jié)構(gòu)
CMake命令執(zhí)行時(shí)的輸入文件是在名為CMakeLists.txt源文件中以“CMake語言”寫入,或以.cmake文件擴(kuò)展名結(jié)尾搀军。
CMake項(xiàng)目中的語言源文件被組織為:
- 目錄 ( CMakeLists.txt )
- 腳本 ( <script>.cmake )
- 模塊 ( <module>.cmake )
目錄
當(dāng)CMake處理項(xiàng)目源目錄樹時(shí)症虑,入口點(diǎn)是頂級(jí)源目錄中名為CMakeLists.txt的源文件缩歪。 此文件可能包含整個(gè)構(gòu)建規(guī)范或使用add_subdirectory()
命令用于將子目錄添加到構(gòu)建中。 該命令添加的每個(gè)子目錄還必須包含CMakeLists.txt文件作為該目錄的入口點(diǎn)谍憔。 對于每一個(gè)待處理的源目錄中的CMakeLists.txt文件匪蝙,CMake都會(huì)在構(gòu)建樹中生成相應(yīng)的目錄,以充當(dāng)默認(rèn)的工作和輸出目錄习贫。
腳本
可以使用cmake帶有-P選項(xiàng)的命令行工具逛球,以腳本模式處理單個(gè)<script>.cmake源文件。 此時(shí)只是在給定的CMake語言源文件中運(yùn)行命令苫昌,而不生成構(gòu)建系統(tǒng)颤绕。 它不允許CMake命令定義構(gòu)建目標(biāo)或操作。
模塊
在目錄或腳本中的 CMake代碼會(huì)使用 include()命令在包含上下文的范圍內(nèi)加載<module>.cmake源文件蜡歹。在 cmake-modules手冊中記錄了CMake發(fā)行版附帶的模塊屋厘。 在項(xiàng)目源碼樹中也可以提供自己的模塊,并在CMAKE_MODULE_PATH變量中指定它們的位置月而。
可以使用目錄或腳本中的 CMake語言代碼 include()命令用于在包含上下文的范圍內(nèi)加載<module>.cmake源文件汗洒。 見 cmake-modules手冊頁,用于記錄CMake發(fā)行版附帶的模塊父款。 項(xiàng)目源樹也可以提供自己的模塊并在其中指定它們的位置 CMAKE_MODULE_PATH變量溢谤。
語法
編碼
CMake語言源文件可以用7位ASCII文本編寫,以便在所有支持的平臺(tái)上實(shí)現(xiàn)最大的可移植性憨攒。 換行符可以編碼為\n或\r\n,但在讀取輸入文件時(shí)將轉(zhuǎn)換為\n 世杀。
請注意,7位ASCII的實(shí)現(xiàn)是純8位的肝集,因此源文件可以在具有支持此編碼的系統(tǒng)API的平臺(tái)上編碼為UTF-8瞻坝。 此外,CMake 3.2及更高版本支持在Windows上以UTF-8編碼的源文件(使用UTF-16調(diào)用系統(tǒng)API)杏瞻。 此外所刀,CMake 3.0及更高版本允許在源文件中使用領(lǐng)先的UTF-8 字節(jié)順序標(biāo)記 。
源文件
CMake語言源文件由零個(gè)或多個(gè)命令調(diào)用組成捞挥,這些命令調(diào)用由換行符和可選的空格和注釋分隔浮创。
命令調(diào)用
命令調(diào)用是一個(gè)名稱,后跟由空格分隔的由括號(hào)封閉的參數(shù):
例如:
add_executable( hello world.c )
命令名稱不區(qū)分大小寫砌函。 參數(shù)中的括號(hào)必須配對斩披。 例如:
if( FALSE AND ( FALSE OR TRUE )) # evaluates to FALSE
命令參數(shù)
命令調(diào)用中有三種類型的參數(shù):中括號(hào)參數(shù)溜族、引用參數(shù)、非引用參數(shù)垦沉。
中括號(hào)參數(shù)
受Lua長括號(hào)語法的啟發(fā)煌抒,在相同長度的開始和結(jié)束 “中括號(hào)”之間包含內(nèi)容。
開始括號(hào)的寫法是:寫一個(gè)左括號(hào)“[”乡话,后跟零或更多的”=”摧玫,接著后跟 ”[” 。
對應(yīng)的結(jié)束括號(hào)寫法是:寫一個(gè)右括號(hào)“]”绑青,后跟零或更多的”=”诬像,接著后跟 ”]” 。中括號(hào)不嵌套闸婴。 例如:
message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like ]].
It does end in a closing bracket of length 1.
]=])
注意 3.0之前的CMake版本不支持括號(hào)參數(shù)坏挠。
引用參數(shù)
帶引號(hào)的參數(shù)包含雙引號(hào)字符之間的內(nèi)容。比如:
message("This is a quoted argument containing multiple lines.
This is always one argument even though it contains a ; character.
Both \\-escape sequences and ${variable} references are evaluated.
The text does not end on an escaped double-quote like \".
It does end in an unescaped double quote.
")
以奇數(shù)個(gè)反斜杠結(jié)尾的任何行上的最后一個(gè)\
被視為行繼續(xù)邪乍,并且與緊隨的后續(xù)換行符一起被忽略降狠。 例如:
message("\
This is the first line of a quoted argument. \
In fact it is the only line but since it is long \
the source code uses line continuation.\
")
3.0之前的CMake版本不支持使用
\
作為續(xù)行符