cmake基本语法

变量

cmake中变量不需要声明,有两种形式${variable}variable,前者是值引用,是最常见的用法,后者是直接引用,一般只用在赋值和条件判断中才会使用。

  • 赋值:set(variable arg1 arg2 arg3)
命令调用中的参数
1. Bracket Argument
  • [=*[]=*]封闭参数内容,其中前后的=数量相同;
  • 我们可以使用任意数量的=,只要防止参数中出现和括号中相同数量的=就行;
  • 其中的${variable}不会被替换.
message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like ]].
It does end in a closing bracket of length 1.
]=])
2. Quoted Argument
  • 使用双引号""封闭参数内容;
  • 参数中不能包含"\,可以使用\进行转义;
  • 参数中的${variable}会被替换成相应的值;
  • 如果一行写不下,可以使用\换行。
message("This is a quoted argument containing multiple lines.
This is always one argument even though it contains a ; character.
Both \\-escape sequences and ${variable} references are evaluated.
The text does not end on an escaped double-quote like \".
It does end in an unescaped double quote.
")
3. Unquoted Argument
  • 不使用任何符号封闭参数内容;
  • 参数中不可以包含空格, (, ), #, ", 或者 \, 可以使用\转义;
  • ;会将参数内容分割成多个参数,可以使用\转义;
foreach(arg
    NoSpace
    Escaped\ Space
    This;Divides;Into;Five;Arguments
    Escaped\;Semicolon
    )
  message("${arg}")
endforeach()
注释
  • 单行注释:以#为行首;
  • 多行注释:#[[comment]], 还可以可以放在代码中间;
#[[This is a bracket comment.
It runs until the close bracket.]]
message("First Argument\n" #[[Bracket Comment]] "Second Argument")
流程控制
1. 条件控制
if(expression)
  # then section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
elseif(expression2)
  # elseif section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
else(expression)
  # else section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
endif(expression)
  • if(<constant>)
    • 为true的constant:1, YES, ON, TRUE, Y, 或者非0数字;
    • 为false的constant:0, NO, OFF, FALSE, N, IGNORE, NOTFOUND, 空字符串, 或者以-NOTFOUND为后缀的变量;
    • 以上常量大小写不限;
  • if(variable | string)
    • variable被定义为非false的常量时为true,否则为false;
  • 逻辑运算: NOT, AND, OR;
  • if(COMMAND command-name)
    • 判断给定的名称是一个可以被调用的命令、宏或者函数;
  • if(TARGET target-name)
    • 判断是否是一个已经(在子目录中)调用add_library, add_executable, add_custom_target生成的目标;
  • ...
2. 循环
foreach(loop_var arg1 arg2 ...)
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endforeach(loop_var)
  • 对每个参数进行迭代
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
  • 迭代生成的数字范围

例:

set(src_list a.c b.c d.c)
foreach(src ${src_list})
    message(${src})
endforeach()

#生成从0到100的数字
foreach(num RANGE 100)
    message(${num})
endforeach()

#生成从2到100的数字,间隔为2
foreach(num RANGE 2 100 2)
    message(${num})
endforeach()
命令定义
1. 宏
macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endmacro(<name>)

例:

# 求和
macro(sum out)
    set(ret 0)
    foreach(var ${ARGN})
        math(EXPR ret "${ret}+${var}")
    endforeach()
    set(out ${ret})
endmacro()
sum(outRet 1 2 3 4 5)
message(${outRet})
  • 使用${ARGC}获取传入的参数的数量;
  • 使用${ARGV}获取传入的所有参数列表;
  • 使用${ARGN}获取期望的参数列表(除去在定义宏时指定的参数列表)
  • 使用${ARGV#}获取指定的参数,其中#为从0到${ARGC}的值,超出范围,行为未定义;
2. 函数
function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endfunction(<name>)

宏内部的变量在外部是可以访问的,而函数内部的变量则不行

转载于:https://www.cnblogs.com/nackee/p/10282619.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值