Cmake语法浅析

2019-07-22  本文已影响0人  佟小胆胆小

什么是CMake

CMake源文件

注释

变量

# 声明变量
set(var 123)
# 引用变量
message("var = ${var}")

列表(lists)

set(列表名 值1 值2...值N)
或
set(列表名 "值1;值2;...;值N")
set(list_var "1;2;3;4;5")
message("list_var = ${list_var}")

流程控制

# 语法格式:
if(表达式)
    COMMAND(ARGS...)
elseif(表达式)
    COMMAND(ARGS...)
else(表达式)
    COMMAND(ARGS...)
endif(表达式)
# elseif和else部分是可选的,也可以有多个elseif部分,缩进和空格对语句解析没有影响。

# 例子
set(if_tap OFF)
set(elseif_tap ON)

if(${if_tap})
    message("if")
elseif(${elseif_tap})
    message("elseif")
else(${if_tap})
    message("else")
endif(${if_tap})
# 语法格式:
while(表达式)
    COMMAND(ARGS...)
endwhile(表达式)

# break()命令可以跳出整个循环
# continue()命令可以跳出当前循环
# 语法格式1:
foreach(循环变量 参数1 参数2...参数N)
    COMMAND(ARGS...)
endforeach(循环变量)

# 语法格式2:
# 循环范围从0到total。
foreach(循环变量 RANGE total)
    COMMAND(ARGS...)
endforeach(循环变量)

# 语法格式3:
# 循环范围从start到stop,循环增量为step。
foreach(循环变量 RANGE start stop step)
    COMMAND(ARGS...)
endforeach(循环变量)
    
# 语法格式4:对列表的循环
foreach(循环变量 IN LISTS 列表)
    COMMAND(ARGS...)
endforeach(循环变量)

自定义函数命令

# 格式
function(<name> [arg1[arg2[arg3...]]])
    COMMAND()
endfunction(<name>)
# 函数命令调用
name(实参列表)

# 例子
function(func a b c)
    message("a = ${a}")
    message("a = ${b}")
    message("a = ${c}")
    # ARGC 内置变量表示传入参数的个数 
    # 输出:ARGC = 3
    message("ARGC = ${ARGC}")
    # ARGV 输入的参数列表
    # 输出 ARGV = 1;2;3
    message("ARGV = ${ARGV}")
    # ARGV0 代表输入的第一个参数值
    message("ARGV0 = ${ARGV0}")
    message("ARGV1 = ${ARGV1}")
    message("ARGV2 = ${ARGV2}")
endfunction(func)

func(1 2 3)

自定义宏命令

函数有自己的作用域 而宏命令的作用域与调用者的作用域相同

# 自定义宏命令格式:
macro(<name> [arg1[arg2[arg3...]]])
    COMMAND()
endmacro(<name>)
# 宏命令调用
name(实参列表)

变量的作用域

作用域优先级:函数层 <覆盖>> 目录层 <覆盖>> 全局层

在当前层修改上一层的作用域不会传递到上一层的作用域中:因为当前作用域只是复制上一层作用域的全部变量到自己的作用域在进行修改

如果在修改时通过set命令明确指定PARENT_SCOPE参数,修改的变量作用域就是上一层的作用域

上一篇 下一篇

猜你喜欢

热点阅读