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