cmake流程控制---cmake数学计算操作和if命令

目录

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}")

cmake流程控制---cmake数学计算操作和if命令_第1张图片

 

if命令

现在cmake的if()命令格式如下:

 if()
   
 elseif() # optional block, can be repeated
   
 else()              # optional block
   
 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这个变量

你可能感兴趣的:(cmake,c++,linux,开发语言)