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

消息提示 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一起使用,可以灵活多变的针对编译环境做各种定制化处理,包括项目中宏的各种替换和使用等等。

### CMake 中的一元判断与二元判断 #### 一元判断 在一元判断中,`if()`语句仅针对单个对象进行测试。这类操作符用于验证特定属性或状态是否存在或成立。 常见的CMake一元测试操作符有: - `COMMAND`: 测试给定名称是否为已知命令、函数或宏。 - `DEFINED`: 检查指定变量是否已被定义。 - `EXISTS`: 验证文件或目录路径是否存在。 例如,要检查名为`my_command`的命令是否存在,可以使用如下代码[^3]: ```cmake if(COMMAND my_command) message(STATUS "Command 'my_command' exists.") endif() ``` 同样地,为了确认某个变量是否已经设置,可以用下面的方法: ```cmake if(DEFINED MY_VARIABLE) message(STATUS "'MY_VARIABLE' is defined with value ${MY_VARIABLE}") endif() ``` #### 二元判断 相比之下,二元判断涉及两个参数之间的比较。这允许更复杂的逻辑评估,比如数值对比或是字符串匹配等。 常用的二元测试操作符包括但不限于: - 数值比较:`EQUAL`, `LESS`, `GREATER`及其变体(如`LESS_EQUAL`) - 字符串比较:`STREQUAL`, `STRLESS`, `STRGREATER`及其相应版本 - 正则表达式匹配:`MATCHES` 这里有一个简单的例子展示如何利用二元运算符来进行数值间的比较: ```cmake set(NUMBER_1 5) set(NUMBER_2 10) if(NUMBER_1 LESS NUMBER_2) message(STATUS "${NUMBER_1} is less than ${NUMBER_2}.") endif() ``` 对于字符串相等性的检验,则可以通过这种方式实现: ```cmake set(TEXT_A "hello") set(TEXT_B "world") if(TEXT_A STREQUAL TEXT_B) message(STATUS "The strings are equal!") else() message(STATUS "Strings differ: '${TEXT_A}' vs '${TEXT_B}'.") endif() ``` 通过上述说明可以看出,两者的主要区别在于适用场景的不同——当只需要关注单一实体的状态时采用一元判断;而涉及到多个要素间关系分析的情况下,则更适合运用二元判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值