以下内容来自cmake官方文档: 传送门
if 语法
if(<condition>)
<commands>
elseif(<condition>) # optional block, can be repeated
<commands>
else() # optional block
<commands>
endif()
else和endif后面的括号中的<condition>
可写可不写,如果写了,就必须和if中的<condition>
一致。
操作符优先级
- 优先级最高的是括号内部的表达式
- 其次是一元测试操作符,如EXISTS, COMMAND 和 DEFINED
- 再次是二元测试操作符,如EQUAL, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL, STREQUAL, STRLESS, STRLESS_EQUAL, STRGREATER, STRGREATER_EQUAL, VERSION_EQUAL, VERSION_LESS, VERSION_LESS_EQUAL, VERSION_GREATER, VERSION_GREATER_EQUAL, 和 MATCHES
- 最后是逻辑判断操作符,如 NOT, AND, OR
如果不记得优先级,就加括号,简单粗暴~
表达式对照表
表达式 | true | false | 说明 |
---|---|---|---|
<constant> | constant 为1, ON, YES, TRUE, Y, 或非零数值 | 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串,或者带-NOTFOUND后缀 | 布尔值大小写不敏感;如果与这些常量都不匹配,则将其视为变量或字符串 |
<variable/string> | 已经定义且不是false的变量 | 未定义或者是false的变量 | 变量就是字符串 |
NOT <condition> | condition为false | condition为true | |
<cond1> AND <cond2> | cond1和cond2同时为true | cond1和cond2至少有一个为false | |
COMMAND command-name | command-name是一个已经定义的CAMMAND, MACRO或FUNCTION | command-name未定义 | |
POLICY policy-id | policy-id存在 | policy-id不存在 | policy可以理解为cmake的语法,当语句无法兼容不同的cmake版本时,可以判断policy-id来做兼容性处理 |
TARGET target-name | target-name是add_executable(), add_library(), add_custom_target()定义过的target | target-name未定义 | |
TEST test-name | test-name为add_test()创建过的测试名称 | test-name未创建 | |
EXISTS path | 存在路径为path的文件或目录 | 不存在路径为path的文件或目录 | |
file1 IS_NEWER_THAN file2 | file1文件时间戳比file2大,其中一个文件不存在,两个文件时间戳相同 | 其他情况 | 路径需要时全路径 |
IS_DIRECTORY path | path为目录 | path不为目录 | path必须是全路径 |
IS_SYMLINK path | path为链接 | path不为连接 | path必须是全路径 |
IS_ABSOLUTE path | path为绝对路径 | path不为绝对路径 | |
<variable> MATCHES regex | variable与正则表达式regex匹配成功 | variable与正则表达式匹配失败 | |
<var1> LESS <var2> | var1和var2均为数字且var1小于var2 | var1不小于var2 | 其他数值比较操作符:GREATER , EQUAL, LESS_EQUAL, GREATER_EQUAL |
<var1 STRLESS var2> | var1和var2为字符串且按照字典顺序var1小于var2 | var1不小于var2 | 其他字符串比较操作符:STRGREATER, STREQUAL, STRLESS_EQUAL , STRGREATER_EQUAL |
<var1 VERSION_LESS var2> | 左边版本号小于右边版本号 | 左边版本号大于等于右边版本号 | 其他的版本号比较操作符:VERSION_GREATER, VERSION_EQUAL, VERSION_LESS_EQUA, VERSION_GREATER_EQUAL |
<var1 IN_LIST var2> | 右边list中包含左边 | 不包含 | |
DEFINED <var> | 已定义变量 | 未定义变量 | |
CACHE {<var>} | 已定义cache variable | 未定义 | |
ENV {<var>} | 存在环境变量 | 不存在环境变量 |