CMAKE(1)——message,变量定义、判断、比较

本文深入讲解CMake的高级使用技巧,包括错误与警告消息的输出、变量管理、环境变量判断及字符串比较。通过实例演示如何灵活运用这些技巧进行定制化处理。

消息提示 message

输出错误 FATAL_ERROR

message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
       You should create a separate directory for build files.
")  

输出警告 WARNING

message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")

输出正常 STATUS

message(STATUS "Can't detect runtime and/or arch")

变量

定义变量

cache

cache变量全部是全局变量,变量的值可以在CMakeCache.txt中找到,如CMAKE_INSTALL_PREFIX。变量设置方式如下:

set(<variable> <value>... CACHE <type> <docstring> [FORCE])
type 说明
类型内容cmake-gui效果
BOOLbool值,只有ON/OFF两种个值checkBox,等同效果于OPTION
FILEPATH文件路径文件对话框
PATH目录路径路径对话框
STRING字符串输入框或内容为string列表的comboBox
INTERNAL字符串不在界面显示,使用此类型,则默认FORCE

删除变量

unset(<variable> CACHE)

判断环境变量是否定义 (NOT)DEFINED

set( ENV{PATH} /home/martink )

if(NOT DEFINED ENV{JAVA_HOME})
    # 没有找到JAVA_HOME环境变量
    message(FATAL_ERROR "not defined environment variable:JAVA_HOME")  
endif()

#不能用if(ENV{JAVA_HOME})形式来判断是否定义 
#但可以用if($ENV{JAVA_HOME})

if(DEFINED ENV{JAVA_HOME})
    # 找到JAVA_HOME环境变量
    message(STATUS  "defined environment variable:JAVA_HOME")  
endif()

字符串

在CMake中if语法比较简单,if后面括号中的参数随着CMake版本的推进,在else和endif中也可以不用写了。
对于if语法,比较常用的两种字符串比较。

字符串变量有无定义

一种是这个变量有没有定义过.

if(DEFINED address)

else()

endif()
if(address)

else()

endif()

两种都可以验证这个变量有没有定义过,
注意:是定义过,比如你在CMake命令行中写了-Daddress=xxx,就表示定义过了。

字符串比较

第二中常用的用法就是字符串比较,比如

if(${address} STREQUAL "ON")

else()

endif()

当然去掉大括号也是可以比较的

if(address STREQUAL "ON")

else()

endif()

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

默认值 option

–option这个命令作为默认初始值并且作为定义值的候选。

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

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

有一个需要注意,就是对于那些依赖于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一起使用,可以灵活多变的针对编译环境做各种定制化处理,包括项目中宏的各种替换和使用等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值