基本语法

if (expression_1)
    IF_CMAKE_COMMAND
    ...
elseif (expression_2)
    ELSEIF_CMAKE_COMMAND
    ...
else (expression_1)
    ELSE_CMAKE_COMMAND
    ...
endif (expression_1)

一个if语句块if, elseif, else组成,并且由endif结尾,这是因为CMake没有缩进或者花括号之类的符号来标识语句块,如果没有endif会导致下文的其它命令也被当作if语句块的内部命令之一

另外,只有ifendif是必须的,其他的elseifelse都是可选的

执行顺序如下:

  • 先判断if
    • 若真,执行IF_CMAKE_COMMAND
    • 若假,则判断接下来的elseif
      • 若真,执行ELSEIF_CMAKE_COMMAND
      • 若假,继续判断接下来的elseif
  • 无论是if还是elseif,若判断为假且接下来没有其他的elseif的话,则执行elseELSE_CMAKE_COMMAND

条件表达式

条件表达式可以由单个变量或单变量与单目逻辑谓语组成,也可以由逻辑连词或多目逻辑谓语组织多个变量或表达式复合组成

变量值与布尔值的转换

当条件表达式由单个变量组成时,变量转换成布尔值时的取值决定了条件表达式的值。变量值与布尔值的转换规则如下:

变量var取以下值之一时,其布尔值为,否则为

var =   ,(为空)
        0,
        N,
        NO,
        OFF,
        FALSE,
        NOTFOUND,
        <var>_NOTFOUND,

逻辑连词

  • AND: if (var_1 AND var_2),两个变量布尔值都取真时表达式为真,否则为假
  • OR: if (var_1 OR var_2),存在一个变量布尔值取真时表达式为真,否则为假

逻辑谓语

  • NOT: if (NOT var),对var的布尔值取反并返回
  • DEFINED: if (DEFINED var),变量var被定义时返回真,否则返回假
  • COMMAND: if (COMMAND cmd),当cmd是系统命令并且可调用是返回真,否则返回假
  • EXISTS: if (EXISTS file),当file是文件或目录且存在时返回真,否则返回假
  • IS_DIRECTORY: if (IS_DIRECTORY dir),当dir是目录且存在时返回真,否则返回假
  • IS_NEWER_THAN:
    • if (file_1 IS_NEWER_THAN file_2), file_1file_2更新时返回真,否则为假。
    • 注意:当file_1或者file_2其中至多一个不存在时,返回真

比较运算

比较运算逻辑也是属于逻辑谓语,但其内容较多,单列出来讲讲

  1. 数字比较:
    • LESS: if (var_1 LESS var_2),var_1小于var_2时返回真,否则返回假
    • GREATER: if (var_1 GREATER var_2),var_1大于var_2时返回真,否则返回假
    • EQUAL: if (var_1 EQUAL var_2),var_1等于var_2时返回真,否则返回假
  2. 字符串比较(按字典序):
    • STRLESS: if (str_1 STRLESS str_2),str_1小于str_2时返回真,否则返回假
    • STRGREATER: if (str_1 STRGREATER str_2),str_1大于str_2时返回真,否则返回假
    • STREQUAL: if (str_1 STREQUAL str_2),str_1等于str_2时返回真,否则返回假

条件表达式的省略

CMake的内置变量CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS控制着if语句的书写方式,当CMakeLists.txt包含如下语句时:

set (CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

if语句中的elseendif语句可以省略条件表达式,但括号仍要保留,如下:

if (expression_1)
    ...
elseif (expression_2)
    ...
else ()
    ...
endif ()

Tags:

Categories:

Updated: