CMake基本语法

1)注释的语法:在CMake中注释使用#字符开始到此行结束。

2)CMake命令:命令不区分大小写(参数会区分大小写),命令由命令、参数列表组成,参数之间使用空格进行分隔。使用一对双引号包括的字符串认为是一个参数。命令可以是一个内置命令(例如:project,add_executable等),也可以是一个用户定义的宏(macro)或者函数(function)。

3)数据类型:CMake的基本数据类型是字符串,一组字符串在一起称为列表(list),例如:

# 通过 set 命令构建一个 listVAR

set(VAR a b c)

使用语法 ${VariableName} 来访问名字为 VariableName 的变量的值(变量名区分大小写)。需要注意的是,即使在字符串中也可以使用 ${VariableName} 来访问变量的值:

set(VAR a b c)

# 输出 VAR = a;b;c

message("VAR = ${VAR}")

使用语法 $ENV{VariableName} 来访问环境变量的值(ENV{VariableName} 则表示环境变量本身)

# 输出环境变量 PATH 的值

message($ENV{PATH})

4)条件控制和循环结构

条件控制命令为 if 命令

if(expression)

#...

elseif(expression2)

#...

else()

#...

endif()

对于 if(string) 来说:

如果 string 为(不区分大小写)1、ON、YES、TRUE、Y、非 0 的数则表示真

如果 string 为(不区分大小写)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 结尾的字符串则表示假

如果 string 不符合上面两种情况,则 string 被认为是一个变量的名字。变量的值为第二条所述的各值则表示假,否则表示真。

# 此策略(Policy)在 CMake2.8.0 才被引入

# 因此这里需要指定最低 CMake 版本为 2.8

cmake_minimum_required(VERSION 2.8)

set(YES 0)

# 输出 True

if(YES)

  message(True)

else()

  message(False)

endif()

# 输出 False

if(${YES})

  message(True)

else()

  message(False)

endif()

表达式中可以包含操作符,操作符包括:

一元操作符,例如:EXISTS、COMMAND、DEFINED 等

二元操作符,例如:EQUAL、LESS、GREATER、STRLESS、STRGREATER 等

NOT(非操作符)

AND(与操作符)、OR(或操作符)

操作符优先级:一元操作符 > 二元操作符 > NOT > AND、OR

常用操作符介绍:

if(NOT expression)

为真的前提是 expression 为假

if(expr1 AND expr2)

为真的前提是 expr1 和 expr2 都为真

if(expr1 OR expr2)

为真的前提是 expr1 或者 expr2 为真

if(COMMAND command-name)

为真的前提是存在 command-name 命令、宏或函数且能够被调用

if(EXISTS name)

为真的前提是存在 name 的文件或者目录(应该使用绝对路径)

if(file1 IS_NEWER_THAN file2)

为真的前提是 file1 比 file2 新或者 file1、file2 中有一个文件不存在(应该使用绝对路径)

if(IS_DIRECTORY directory-name)

为真的前提是 directory-name 表示的是一个目录(应该使用绝对路径)

if(variable|string MATCHES regex)

为真的前提是变量值或者字符串匹配 regex 正则表达式

if(variable|string LESS variable|string)

if(variable|string GREATER variable|string)

if(variable|string EQUAL variable|string)

为真的前提是变量值或者字符串为有效的数字且满足小于(大于、等于)的条件

if(variable|string STRLESS variable|string)

if(variable|string STRGREATERvariable|string)

if(variable|string STREQUALvariable|string)

为真的前提是变量值或者字符串以字典序满足小于(大于、等于)的条件

if(DEFINED variable)

为真的前提是 variable 表示的变量被定义了。

foreach 循环范例:

set(VAR a b c)

foreach(f ${VAR})

  message(${f})

endforeach()

while 循环范例:

set(VAR 5)

while(${VAR} GREATER 0)

  message(${VAR})

  math(EXPR VAR "${VAR} - 1")

endwhile()

5)函数和宏定义

函数会为变量创建一个局部作用域,而宏则使用全局作用域。范例:

# 定义一个宏 hello

macro(hello MESSAGE)

  message(${MESSAGE})

endmacro()

# 调用宏 hello

hello("hello world")

# 定义一个函数 hello

function(hello MESSAGE)

  message(${MESSAGE})

endfunction()

函数和宏可以通过命令 return() 返回,但是函数和宏的返回值必须通过参数传递出去。例如:

cmake_minimum_required(VERSION 2.8)

function(get_func RESULT)

#RESULT 的值为实参的值,因此需要使用 ${RESULT}

#这里使用 PARENT_SCOPE 是因为函数会构建一个局部作用域

  set(${RESULT} "Hello Function" PARENT_SCOPE)

endfunction()

macro(get_macro RESULT)

  set(${RESULT} "Hello Macro")

endmacro()

get_func(V1)

# 输出 Hello Function

message(${V1})

get_macro(V2)

# 输出 Hello Macro

message(${V2})

7)字符串的一些问题

字符串可跨行且支持转移字符,例如:

set(VAR "hello

world")

# 输出结果为:

# ${VAR} = hello

# world

message("\${VAR} = ${VAR}")

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,793评论 0 38
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,149评论 0 13
  • 把你的脚步停一停吧, 你停下来, 我们才好说话。 我没说完的梦, 没讲完的情, 全都讲给你听。 让你的身形等一等吧...
    半月仙河北廊坊阅读 321评论 1 12
  • CFRunLoopTimerRef是基于时间的触发器 含义就是:1.NSTimer会受到runloop的mode影...
    我的梦想之路阅读 1,294评论 2 0
  • 公司组织架构调整后,我负责一个团队。由于销售员刚入职,对工作不熟悉,因此我们团队负责的客户要由我带着送过年礼品,顺...
    cc904ea6870c阅读 215评论 0 0