CMake语法详解
2020-04-06 本文已影响0人
差点长成一枚帅哥
1.注释
- 单行注释
# 我是一行注释 - 多行注释
#[[我是多行注释
我是多行注释]]
2.变量定义与使用
在Cmake中所有变量都是字符串
- 声明变量:set(变量名 变量值) ,比如set(name 张三)
- 移除变量:unset(变量名),比如unset(name)
- 打印变量:message("name=${name}")
3.Cmake列表(list)
- 声明变量:set(list_array 1 2 3 4 5) 或 set(list_array "1;2;3;4;5")
- 打印变量:message("list_array ${list_array}")
4.操作符
- 一元操作符:EXIST, COMMAND, DEFINED
- 二元操作符:EQUAL,LESS,LESS_EQUAL,GREATER,MATCHES等等
- 逻辑操作符:NOT,AND,OR
优先级是 () > 一元操作符 > 二元操作符 > 逻辑操作符
5.流程控制-布尔常量值
- true: 1,ON,YES,TRUE,Y,非0的值
- false: 0,OFF,NO,N,FALSE,空字符串,以-NORFOUND结尾的字符串
6.条件控制
if, elseif, else, endif
例子:
set(value_a OFF)
set(value_b ON)
if(${value_a})
message("value_a is true")
elseif(${value_b})
message("value_b is true")
endif(${value_a})
7.循环控制
while 例子如下:
set(a "")
white(NOT a STREQUAL "xxx")
set(a "${a}x")
message("a == ${a}")
endwhile()
8.循环遍历
- foreach 方式一
#循环打印 1,2,3,当item等于1则跳出本次循环,当item等于3则跳出循环
foreach(item 1 2 3)
message("item = ${item}")
if(item EQUAL "1")
continue()
elseif(item EQUAL "3")
break()
endif(item)
endforeach
- foreach 方式二
#循环打印 1-6的字符串
foreach(item RANGE 6)
message("item = ${item}")
endforeach
- foreach 方式三
#循环打印 梯度为3的字符串 0,3,6
foreach(item RANGE 0 7 3)
message("item = ${item}")
endforeach
- foreach 方式四
#循环打印 一个list
set(list_a 1 2 3 4 5 6)
foreach(item IN LISTS list_a)
message("item = ${item}")
endforeach
8.CMake自定义函数
function(funcA ...)这是固定写法
function(funcA a b c)
#分别打印 a,b,c的值
message("a=${a}")
message("b=${b}")
message("c=${c}")
#这里打印出参数个数,ARGC为系统函数
message("ARGC=${ARGC}")
#输出结果为:ARGC=3
#这里打印出参数列表,ARGV为系统函数
message("ARGV=${ARGV}")
#输出结果为:ARGV=1:2:3
#这里打印出第N个参数,ARGVN
message("ARGV0=${ARGV0}")
message("ARGV1=${ARGV1}")
message("ARGV2=${ARGV2}")
#输出结果为:ARGV0=1
#输出结果为:ARGV0=2
#输出结果为:ARGV0=3
endfunction(funcA)
#以下是调用函数
funcA(1 2 3)
9.Cmake自定义宏命令
macro 关键字作用域与调用者作用域一致
#宏定义
macro(maA a b)
message("a=${a}")
message("b=${b}")
endmacro(maA)
#宏调用
maA("hello" "word")
#输出结果为:a=hello
#输出结果为:b=word
10.CMake变量作用域
- 全局层
cache变量,在整个项目范围可见,一般在set定义变量时,指定CACHE就能定义cache变量
比如:set(cacheA "123" CACHE STRING INTERNAL)
- 目录层
在当前目录CMakeLists.txt中定义,以及在该文件包含的其他cmake源文件中定义的变量。
- 函数层
在命令函数中定义的变量,属于函数作用域内的变量