目录
cmake 数学计算操作
demo
if命令
基本表达式
逻辑表达式(NOT AND OR)
比较表达式
正则表达式
demo
文件系统相关
判断是否存在的表达式
cmake 数学计算操作
有时候我们需要对cmake变量之间进行数学运算,这时候cmake提供了math()这个命令,命令格式如下:
math(EXPR outVar mathExpr [OUTPUT_FORMAT format])
这个命令也是很简单,直接通过cmake变量结合数学运算符组成mathExpr,然后将结果保存到outVar
中.
OUTPUT_FORMAT是可选参数,代表输出结果的格式,可以是
- HEXADECIMAL:输出16进制结果.
- DECIMAL:输出10进制结果
demo
message("-------------------------------")
set(x 3)
set(y 7)
math(EXPR zDec "(${x} + ${y}) * 2")
message("zDec = ${zDec}")
math(EXPR zDec "(${x} + ${y}) * 2" OUTPUT_FORMAT DECIMAL)
message("DECIMAL zDec = ${zDec}")
math(EXPR zDec "(${x} + ${y}) * 2" OUTPUT_FORMAT HEXADECIMAL)
message("HEXADECIMAL zDec = ${zDec}")
if命令
现在cmake的if()命令格式如下:
if(<condition>)<commands>elseif(<condition>) # optional block, can be repeated<commands>else() # optional block<commands>endif()
上述命令格式中,elseif和else是可选的,而且elseif可以有多个,但必须在else之前列出.
其中最重要的就是括号中的表达式,这个用来判断要走那个分支的关键.
基本表达式
if(value)
- ON,YES,TRUE,Y视为真
- OFF,NO,FALSE,N,IGNORE,NOTFOUND,空字符串,以-NOTFOUND结尾的字符串被视为假.
- 如果是一个数字,将根据C语言的规则转换为bool值.
- 如果上面三种情况都不适用,那该条件表达式将最为一个变量的名字.
- 如果没有使用引号,那该变量的值会和为假的值对比,如果匹配上则为假,否则为真,如果其值是空字符串则为假.
- 如果使用引号
- cmake3.1及以后,如果该字符串不匹配任何为真的值,那该条件表达式为假.
- cmake3.1以前,如果该字符串匹配到任何存在的变量名字,则会按照变量处理.
- if(ENV{some_var})这种形式的条件表达式永远为假,所以不要使用环境变量
逻辑表达式(NOT AND OR)
if (NOT expressin)if (expression1 AND expression2)if (expression1 OR expression2)if (NOT (expression1 AND (expression2 OR expression3)))
比较表达式
if (value1 OPERATOR value2)
Number(数字) | string(字符串) | Version number(版本号) | Path(路径) |
LESS(小于) | STRLESS | VERSION_LESS | |
GREATER(大于) | STRGEREATER | VERSION_GREATER | |
EQUAL(等于) | STREQUAL | VERSION_EQUAL | PATH_EQUAL |
LESS_EQUAL(小于等于) | STRLESS_EQUAL | VERSION_LESS_EQUAL | |
GREATER_EQUAL | STRGREATER_EQUAL | VERSION_GREATER_EQUAL |
版本号比较格式:major[.minor[.patch[.tweak]]]
正则表达式
if (value MATCHES regex)
demo
如果是Fred或者Barney执行if中的语句,否则执行else语句.
message("-------------------------------")
set(who "Fred")
if("Hi from ${who}" MATCHES "Hi from (Fred|Barney).*")message(STATUS "says Hello")
else()message(STATUS " 执行到这里")
endif()
文件系统相关
if (EXISTS pathFileOrDir) #是否存在文件
if (IS_DIRCTORY pathToDir) #是不是目录
if (IS_SYMLINK fileName) #是不是符号链接
if (IS_ABSOLUTE path) #是不是绝对路径
if (file1 IS_NEWR_THAN file2) #第一个文件是不是比第二个文件新
判断是否存在的表达式
if (DEFINED name) #有没有定义name这个变量
if (COMMAND name) #有没有name这个命令
if (POLICY name) #有没有name这个策略
if (TARGET name) #有没有name这个目标
if (TEST name) #有没有name这个单元测试
if (value IN_LIST listVar) #value这个值是不是在listVar这个列表里面
if (DEFINED SOMEVAR) #检查是不是定义了SOMEVAR这个变量
if (DEFINED CACHE{SOMEVAR}) #检查是不是CACHE(缓存)SOMEVAR这个变量
if (DEFINED ENV{SOMEVAR}) #检查是不是定义了ENV(环境)SOMEVAR这个变量