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

Regular Expressions 編輯