CMake学习(六) —— if 和 else

一、基本语法

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

如果需要对项目进行有条件的编译,则需要用到if-else语句。

二、基本用法

比如需要根据操作系统执行不同的代码:

# CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.5)

# 项目名称
project(test_6)

if(WIN32)
	message(STATUS "Now is windows")
elseif(APPLE)
	message(STATUS "Now is Apple systens.")
elseif(UNIX)
	message(STATUS "Now is UNIX-like OS's.")
endif()

三、其他用法

1. 逻辑运算

# 取反运算
if(NOT <condition>)

# 与运算
if(<cond1> AND <cond2>)

# 或运算
if(<cond1> OR <cond2>)

2. 特殊语句

if(COMMAND command-name)
如果给定名称是可以调用的命令,宏或函数,则为trueif(POLICY policy-id)
如果给定名称是现有策略(格式为CMP<NNNN>),则为True 。

if(TARGET target-name)
如果给定名称是通过调用调用创建的现有逻辑目标名称,则为True。 add_executable()add_library(), 要么 add_custom_target() 已经被调用的命令(在任何目录中)。

if(TEST test-name)
如果给定名称是由测试人员创建的现有测试名称,则为True add_test() 命令。

if(EXISTS path-to-file-or-directory)
如果指定的文件或目录存在,则为True。仅针对完整路径定义行为。解析符号链接,即,如果命名的文件或目录是符号链接,则如果符号链接的目标存在,则返回trueif(file1 IS_NEWER_THAN file2)
如果file1是更新版本file2或两个文件之一不存在,则为true 。仅针对完整路径定义行为。如果文件时间戳完全相同,则IS_NEWER_THAN比较将返回true,这样,在出现平局的情况下将发生任何相关的生成操作。这包括为file1和file2传递相同文件名的情况。

if(IS_DIRECTORY path-to-directory)
如果给定名称是目录,则为True。仅针对完整路径定义行为。

if(IS_SYMLINK file-name)
如果给定名称是符号链接,则为True。仅针对完整路径定义行为。

if(IS_ABSOLUTE path)
如果给定路径是绝对路径,则为True。

if(<variable|string> MATCHES regex)
如果给定的字符串或变量的值与给定的常规条件匹配,则为true。有关正则表达式格式,请参见正则表达式规范。 ()组被捕获在CMAKE_MATCH_<n> 变量。

if(<variable|string> LESS <variable|string>)
如果给定的字符串或变量的值是有效数字且小于右边的数字,则为trueif(<variable|string> GREATER <variable|string>)
如果给定的字符串或变量的值是有效数字并且大于右侧的数字,则为trueif(<variable|string> EQUAL <variable|string>)
如果给定的字符串或变量的值是有效数字并且等于右侧的数字,则为trueif(<variable|string> LESS_EQUAL <variable|string>)
如果给定的字符串或变量的值是有效数字且小于或等于右侧的数字,则为trueif(<variable|string> GREATER_EQUAL <variable|string>)
如果给定的字符串或变量的值是有效数字并且大于或等于右侧的数字,则为trueif(<variable|string> STRLESS <variable|string>)
如果给定的字符串或变量的值在字典上小于右侧的字符串或变量,则为trueif(<variable|string> STRGREATER <variable|string>)
如果给定的字符串或变量的值在字典上大于右侧的字符串或变量,则为trueif(<variable|string> STREQUAL <variable|string>)
如果给定的字符串或变量的值在字典上等于右侧的字符串或变量,则为trueif(<variable|string> STRLESS_EQUAL <variable|string>)
如果给定的字符串或变量的值在字典上小于或等于右侧的字符串或变量,则为trueif(<variable|string> STRGREATER_EQUAL <variable|string>)
如果给定的字符串或变量的值在字典上大于或等于右侧的字符串或变量,则为trueif(<variable|string> VERSION_LESS <variable|string>)
按组件的整数版本号比较(版本格式为 major[.minor[.patch[.tweak]]],省略的组件视为零)。任何非整数版本组件或版本组件的非整数结尾部分均会在该点处有效截断字符串。

if(<variable|string> VERSION_GREATER <variable|string>)
按组件的整数版本号比较(版本格式为 major[.minor[.patch[.tweak]]],省略的组件视为零)。任何非整数版本组件或版本组件的非整数结尾部分均会在该点处有效截断字符串。

if(<variable|string> VERSION_EQUAL <variable|string>)
按组件的整数版本号比较(版本格式为 major[.minor[.patch[.tweak]]],省略的组件视为零)。任何非整数版本组件或版本组件的非整数结尾部分均会在该点处有效截断字符串。

if(<variable|string> VERSION_LESS_EQUAL <variable|string>)
按组件的整数版本号比较(版本格式为 major[.minor[.patch[.tweak]]],省略的组件视为零)。任何非整数版本组件或版本组件的非整数结尾部分均会在该点处有效截断字符串。

if(<variable|string> VERSION_GREATER_EQUAL <variable|string>)
按组件的整数版本号比较(版本格式为 major[.minor[.patch[.tweak]]],省略的组件视为零)。任何非整数版本组件或版本组件的非整数结尾部分均会在该点处有效截断字符串。

if(<variable|string> IN_LIST <variable>)
如果给定元素包含在命名列表变量中,则为trueif(DEFINED <name>|CACHE{<name>}|ENV{<name>})
如果<name>定义了具有给定的变量,缓存变量或环境变量,则为true 。变量的值无关紧要。请注意,宏参数不是变量。

if((condition) AND (condition OR (condition)))
首先评估括号内的条件,然后像前面的示例一样评估其余条件。如果有嵌套的括号,则将最里面的括号作为包含它们的条件的一部分进行评估。

参考:
https://cmake.org/cmake/help/v3.14/command/if.html?highlight=#command:if
https://blog.csdn.net/sean_8180/article/details/81189996

发布了72 篇原创文章 · 获赞 87 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/maizousidemao/article/details/104099776