cmake:if

1059 篇文章 278 订阅

有条件地执行一组命令。

概要

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

根据下面描述的条件语法计算if子句的条件参数。如果结果为真,则执行If块中的命令。否则,可选的elseif块以相同的方式处理。最后,如果没有条件为真,则执行可选else块中的命令。

条件语法

以下语法适用于if、elseif和while()子句的条件参数。

复合条件按以下优先顺序求值:首先求值最里面的圆括号。接下来是一元测试,如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。

基本的表达式

  • if(< constant >)
    • constant 即常数。
    • 如果常数为1、ON、YES、True、Y或非零数,则为True。如果常量为0、OFF、NO、False、N、IGNORE、NOTFOUND、空字符串或以后缀-NOTFOUND结尾,则返回False。
    • 命名的布尔常量不区分大小写。
    • 如果参数不是这些特定常量之一,则将其视为变量或字符串,并使用以下签名。
  • if(< variable|string>)
    • 如果给定的变量定义为非假常量的值,则为True。
    • 否则为假(注意宏参数不是变量。)

逻辑操作

  • if(NOT < condition>)
    • 如果条件不为真,则为真
  • if(< cond1> AND < cond2>)
    • 皆真为真
  • if(< cond1> OR < cond2>)
    • 一真即真
  • if((condition) AND (condition OR (condition)))
    • 先计算括号内的条件,然后计算其余条件,如其他示例所示。
    • 如果有嵌套的圆括号,最里面的圆括号将作为计算包含圆括号的条件的一部分进行计算。

存在性检查

  • if(COMMAND command-name)

    • 如果给定名称是可以调用的命令、宏或函数,则为True。
  • if(POLICY policy-id)

    • 如果给定的名称是一个已存在的策略(形式为CMP< NNNN>),则为True。
  • if(TARGET target-name)

    • 如果给定名称是通过调用已调用(在任何目录中)的add_executable()、add_library()或add_custom_target()命令创建的现有逻辑目标名称,则为True。
  • if(TEST test-name)

    • 3.3新版功能:如果给定名称是由add_test()命令创建的现有测试名称,则为True。
  • if(DEFINED < name>|CACHE{< name>}|ENV{< name>})

    • 如果定义了具有给定的变量、缓存变量或环境变量,则为True。变量的值无关紧要。请注意,宏参数不是变量。
    • 版本3.14中的新功能:添加了对CACHE{< name>}变量的支持。
  • if(<variable|string> IN_LIST < variable>)

    • 版本3.3中的新特性:如果给定元素包含在命名列表变量中,则为True。

文件操作

  • if(EXISTS path-to-file-or-directory)

    • 如果指定的文件或目录存在,则为True。
    • 行为只对显式的完整路径进行了定义(引导的~/没有展开为主目录,而是被认为是相对路径)
    • 解析符号链接,即,如果指定的文件或目录是符号链接,如果符号链接的目标存在,则返回true。
  • if(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。注意以下特殊情况:
      • 空路径的计算结果为false。
      • 在Windows主机上,任何以驱动器号和冒号(例如C:)、正斜杠或反斜杠开头的路径都将计算为true。这意味着像C:no\base\dir这样的路径将计算为true,即使路径的非驱动器部分是相对的。
      • 在非Windows主机上,任何以波浪号(~)开头的路径的计算结果都为true。

比较

  • if(<variable|string> MATCHES regex)
    • 如果给定的字符串或变量的值与给定的正则条件匹配,则为True。关于正则表达式格式,请参见正则表达式规范。
    • 3.9新版功能:()组在CMAKE_MATCH_变量中被捕获。
  • if(<variable|string> LESS <variable|string>)
    • 如果给定字符串或变量的值是有效的数字,且小于右边的值,则为True。
  • if(<variable|string> GREATER <variable|string>)
    • 如果给定字符串或变量的值是有效的数字,且大于右边的值,则为True。
  • if(<variable|string> EQUAL <variable|string>)
    • 如果给定字符串或变量的值是有效的数字,且等于右边的值,则为True。
  • if(<variable|string> LESS_EQUAL <variable|string>)
    • 如果给定字符串或变量的值是有效的数字,且小于等于右边的值,则为True。
  • if(<variable|string> GREATER_EQUAL <variable|string>)
    • 如果给定字符串或变量的值是有效的数字,且大于等于右边的值,则为True。
  • if(<variable|string> STRLESS <variable|string>)
    • 如果给定字符串或变量的值按字典顺序小于右侧的字符串或变量,则为True
  • if(<variable | string>STREQUAL<variable | string>)
    • 如果给定字符串或变量的值在词典中等于右侧的字符串或变量,则为True。
  • if(<variable | string>STRLESS|EQUAL<variable | string>)
    • 版本3.7中的新功能:如果给定字符串或变量的值按字典顺序小于或等于右侧的字符串或变量,则为True。
  • if(<variable | string>STRGREATER|u EQUAL<variable | string>)
    • 版本3.7中的新功能:如果给定字符串或变量的值按字典顺序大于或等于右侧的字符串或变量,则为True。

版本比较

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

感觉没有什么用,不看了

变量展开

if命令在CMake的历史中写得很早,早于${}变量求值语法,为了方便计算由其参数命名的变量,如上面签名所示。请注意,使用${}的普通变量计算在if命令接收参数之前就生效了。因此代码

set(var1 OFF)
set(var2 "var1")
if(${var2})

在if命令中显示为

if(var1)

并根据上面记录的if()案例进行评估。结果是OFF,即false。但是,如果我们从示例中删除${},那么命令就会看到

if(var2)

结果真,因为var2被定义为var1而var1不是一个假常数。

当上述条件语法接受<variable | string>时,自动计算适用于其他情况:

  • 首先检查MATCHES的左侧参数是否是已定义的变量,如果是,则使用变量的值,否则使用原始值。
  • 如果MATCHES的左边参数缺失,它将返回false而没有错误
  • 对LESS、GREATER、EQUAL、LESS_EQUAL和GREATER_EQUAL的左、右参数都分别进行测试,以确定它们是否是已定义的变量,如果是,则使用它们的已定义值,否则使用原始值。
  • STRLESS、STRGREATER、STREQUAL、STRLESS_EQUAL和STRGREATER_EQUAL的左、右参数都被独立测试,以确定它们是否是已定义的变量,如果是,则使用它们的已定义值,否则使用原始值。
  • 分别测试VERSION_LESS、VERSION_GREATER、VERSION_EQUAL、VERSION_LESS_EQUAL和VERSION_GREATER_EQUAL的左、右参数,以确定它们是否是已定义的变量,如果是,则使用它们的已定义值,否则使用原始值。
  • 测试NOT的右边参数是否为布尔常数,如果使用了值,则假定它是一个变量,并对其进行解引用。
  • and和OR的左、右参数被独立测试,以确定它们是否是布尔常量,如果是,则将它们作为布尔常量使用,否则将被假定为变量并被解引用。

在版本3.1中进行了更改:为了防止歧义,可以在带引号的参数或括号参数中指定潜在的变量或关键字名称。带引号或括号的变量或关键字将被解释为字符串,而不是取消引用或解释。参见政策CMP0054。

环境或缓存变量引用没有自动求值。它们的值必须被引用为$ENV{<name>}或$CACHE{<`name>},只要上面记录的条件语法接受<variable | string>。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值