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
为后缀的变量; - 以上常量大小写不限;
- 为true的constant:
- 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>)
宏内部的变量在外部是可以访问的,而函数内部的变量则不行