CMake 入門/基本語法
直譯模式
[编辑]CMake 提供了直譯模式,可以執行指定的 script 而不以生成 makefile 為目的 ,後面介紹的語法特色都可以在直譯模式下練習。
$ cmake -P <script-file>
雖然這意味著我們可以將 CMake 拿來當作一般的 scripting language 使用,但 CMake 先天上就不是為了通用程式語言而設計,所以使用起來未必方便,特別是數學計算方面。
語法簡介
[编辑]CMake 語法十分简单,具有以下要点:
1,CMake 由指令(command)和注释組成,空白、換行、tab仅作为语素分隔符。
2,注释以井号——“#”开头,至行尾结束。
3,指令后加小括号,用于传入参数,指令按照从上至下顺序进行解析。指令名称大小写不敏感。如command和COMMAND相同。
4,用户可使用变量(Variable)儲存信息,嚴格来说, CMake 只有字串和字符串列表兩種形式,本质上,數值变量和布尔变量只是特殊意義字符串。变量大小寫敏感,內建的變數均为大寫。如hello与HELLO不同。
为方便读者区别,本书自定义变量均采用“小写加下划线”形式,以与内建变量作区分。通常书写习惯为,变量均为大写。
指令
[编辑]CMake script 由一連串的指令(command)組成,每個指令可有零至多個參數。例如 message 指令常用來輸出訊息:
message(helloworld)
會輸出
helloworld
指令大小写不敏感,即command()、COMMAND() 和 Command() 相同。需注意,变量大小写敏感,即变量hello与变量HELLO不同。
變數
[编辑]在 CMake 當中我們可以用 set() 指令來設定一個變數的值,變數會在第一次使用的時候自動初始化,無須宣告。提取變數值時通常必須在外面加上 ${} 符號,不過也有少數場合例外。
set(var hello) message(${var})
會輸出
hello
變數值的代換甚至可以遞迴進行,在撰寫複雜的功能時可能很有用。例如
set(var hello) set(foo var) message(${foo}) message(${${foo}})
會輸出
var hello
字串與串列
[编辑]字串(string)是 CMake 當中的基本的資料型態,將字串用空白或分號分隔則表示串列(list)。
set(foo this is a list) set(foo this;is;a;list)
上面這兩個指令作用完全相同,都是將變數 foo 值指定為一個串列,內含 this、is、a、list 四個字串。
Quoted String
[编辑]在字串當中需要空白、換行、分號等字元時,可以使用 " " 將文字內容框住,如此就會被解釋成同一個字串。
set(a alpha beta gamma) set(b "alpha beta gamma") set(c "alpha beta gamma" ) message("a = ${a}") message("b = ${b}") message("c = ${c}")
在 " " 中被 ${} 標記的變數值也會被代換,輸出為
a = alpha;beta;gamma b = alpha beta gamma c = alpha beta gamma
請注意字串和串列的不同。
- a 等於一個串列,內容為 alpha、beta、gamma 三個字串
- b 等於一個字串,內容為 alpha beta gamma
- c 等於一個字串,內容為以換行為分隔的 alpha beta gamma
我們也可以利用 set 作字串串接:
set(a "alpha beta gamma") set(b "${a} delta") set(c ${a} "delta")
- b 等於一個字串,內容為 "alpha beta gamma delta"
- c 等於一個串列,內容為 alpha beta gamma 和 "delta" 兩個字串
Escapes
[编辑]CMake 大致上相容 C 語言當中的 Escape Sequence,如 \t \n 等等。如欲表示 CMake 當中的特殊字元時也可用 \ 標記。
set(bar "alpha beta gamma") message("\${bar}: ${bar}")
上面的程式碼輸出
${bar}: alpha beta gamma
布林值
[编辑]在 CMake 當中有些字串被賦予了布林值的意義,大小寫差異會被忽略:
以下這些會被視為 FALSE:
- OFF
- FALSE
- N
- NO
- 0
- "" (空字串)
- 沒被指派值的變數
- NOTFOUND
- 任何結尾是 -NOTFOUND 的字串
以下這些會被視為 TRUE:
- ON
- TRUE
- Y
- YE
- YES
- 1
- 其他不歸類為 FALSE 的字串
數學計算
[编辑]由於 CMake 當中並沒有提供直接的數學運算子,所有的符號組合最終都會形成字串或串列。數學計算必須透過 math 指令解釋:
math(EXPR var "1 + 2 * 3") message("var = ${var}")
輸出為
var = 7