CMake----if与option使用小记

在CMake中if语法比较简单,if后面括号中的参数随着CMake版本的推动,在else和endif中也能够不用写了。spa

if(address)
else()
endif()

    对于if语法,比较经常使用的就是字符串比较了,这里我的简单用到过两种,一种是这个变量有没有定义过。有两种写法能够验证命令行

if(DEFINED address)
else()
endif()
if(address)
else()
endif()

两种均可以验证这个变量有没有定义过,注意:是定义过,好比你在CMake命令行中随便写了-Daddress=xxx,就表示定义过了,对里面的值没有任何要求。code

 

    第二中经常使用的用法就是字符串比较,好比blog

if(${address} STREQUAL "ON")
else()
endif()

固然去掉大括号也是能够比较的字符串

if(address STREQUAL "ON")
else()
endif()

 

这种就是比较字符串的值了,注意:在这个时候,你的脚本已经假设你对于address已经有了已被定义的默认要求,也就是说此时若是你没有定义过address变量,在正常处理cmake ..的时候会报错,会提示没法识别的参数“STREQUAL”和"ON",这个须要特别注意。还有就是若是真的要加上大括号来取值,适当加上双引号能够防止出现一些没必要要的麻烦。it

    有的同窗会问了,若是我就想有个默认值呢?若是我就想,当我本身不去设这个,我但愿它存在,被定义过,而且有个本身的默认值,有没有办法?io

    答案固然是有的,强大的CMake为咱们准备了--option这个命令,给咱们做为默认初始值而且做为定义值的候选。编译

option(address "This is a option for address" ON)

此时表示,若是用户没有定义过address,那我address的默认值就是ON,若是用户在命令行显示改变过address的值好比为OFF,那么在脚本中address的值就是OFF。class

有一个须要注意,就是对于那些依赖于address有没有定义过的时候,若是你用了option你要特别注意,就是在脚本处理过程当中,若是你没有在命令行中显示定义过address,那么在option以前的语句对于address都是没有定义过,直到到达了option,此时才真正定义了address.提及来很差理解,给个例子变量

复制代码
if(address)
    message("defined address!!!!!!!!!!")
else()
    message("NOT defined address!!!!!!!!!")
endif()

option(address "hello world" ON)
message("option is ${address}")

if(address)
    message("defined address!!!!!!!!!!")
else()
    message("NOT defined address!!!!!!!!!")
endif()
复制代码

输出结果为

NOT defined address!!!!!!!!!!
option is a
defined address!!!!!!!!!!

这样就比较好理解了。

    配合option和if一块儿使用,能够灵活多变的针对编译环境作各类定制化处理,包括项目中宏的各类替换和使用等等。这里我给你们开了个简单的头,但愿这篇文章可以给你带来哪怕只有一点点的帮助就够了  : )

相关文章
相关标签/搜索