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

上一篇:跨平台宏定义


下一篇:stm32f10x_lib.h