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

编辑