CMake语法详解

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源文件中定义的变量。

  • 函数层

在命令函数中定义的变量,属于函数作用域内的变量

推荐阅读更多精彩内容