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