[CMake教程] if 和 else

2023-11-05

一、基本语法

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

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

其中,<condition> 可以是常量、变量、字符串。

  • 对于常量:

    • 如果是 1ONYESTRUEY或非零数(包括浮点数),则为 True
    • 如果是 0OFFNOFALSENIGNORENOTFOUND、空字符串或以 -NOTFOUND 后缀结尾,则为 False
    • 布尔常量不区分大小写。
    • 如果参数不是这些特定常量之一,则将其视为变量或字符串。
  • 对于变量:

    • 如果变量未定义,则为 False
    • 环境不能直接参与该判断,如 if(ENV{some_var}) 均判断为 False
    • 如果变量的值不是上述常量中为 False 的任一值,则该变量判断为 True
  • 对于字符串:

    • 带引号的字符串始终判断为 False,除非字符串的值是上述常量中为 True 的任一值。

二、基本用法

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

# 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()

三、其他用法

3.1 逻辑运算

  • 取反运算

    if(NOT <condition>)
    

​ 如果 condition 不为真,则语句为真。

  • 与运算

    if(<cond1> AND <cond2>)
    

    如果两个条件都为真,则语句为真。

  • 或运算

    if(<cond1> OR <cond2>)
    

    如果任一条件为真,则语句为真。

  • 括号

    if((condition) AND (condition OR (condition)))
    

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

3.2 存在性检查

  • 命令、宏或函数

    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)
    

    CMake3.3 新增,如果给定名称是通过调用 add_test() 创建的现有测试名称,则为 True

  • 变量

    if(DEFINED <name>|CACHE{<name>}|ENV{<name>})
    

    如果 <name> 是已经定义了的变量、缓存变量或环境变量,则为 True。变量的值无关紧要。
    请注意:

    • 宏参数不是变量。
    • CACHE{<name>} 是在 CMake 3.14 才引入的。
    • if(DEFINED someName) 不能区分是缓存变量还是普通变量,只要该变量被定义,都返回 Trueif(DEFINED CACHE{someName}) 仅当缓存变量存在时,才返回 True
      如果需要知道非缓存变量是否存在,需要使用 if(DEFINED someName AND NOT DEFINED CACHE{someName})
  • 列表

    if(<variable|string> IN_LIST <variable>)
    

    如果给定元素包含在指定列表变量中,则为 True

3.3 文件操作

  • 存在性检查

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

    如果指定的文件或目录存在,则为True

    如果给定路径是空字符串,则为 False

    仅针对显式完整路径明确定义行为(前导~/不扩展为主目录,并被视为相对路径)。

    解析符号链接,即,如果命名的文件或目录是符号链接,则如果符号链接的目标存在,则返回 True

  • 新旧比较

    if(file1 IS_NEWER_THAN file2)
    

    如果 file1file2 版本更新、时间戳完全相同或两个文件之一不存在,则为 True

    仅针对完整路径定义行为。

  • 是否为目录

    if(IS_DIRECTORY path-to-directory)
    

    如果给定名称是目录,则为True。仅针对完整路径定义行为。

  • 是否为符号链接

    if(IS_SYMLINK file-name)
    

    如果给定名称是符号链接,则为True。仅针对完整路径定义行为。

  • 是否为绝对路径

    if(IS_ABSOLUTE path)
    

    如果给定路径是绝对路径,则为True

    注意:

    • path 为空值,返回 False
    • 在 Windows 主机上,任何 path 以驱动器号和冒号(例如C:)、正斜杠或反斜杠开头的内容都将评估为 True。例如 C:no\base\dir ,即使路径的非驱动部分是相对路径。
    • 在非 Windows 主机上,任何path以波形符 ( ~) 开头的值都计算为 True

3.4 数值比较

  • 小于

    if(<variable|string> LESS <variable|string>)
    

    如果给定的字符串或变量的值是有效数字且小于右边的数字,则为 True

  • 大于

    if(<variable|string> GREATER <variable|string>)
    

    如果给定的字符串或变量的值是有效数字并且大于右侧的数字,则为 True

  • 等于

    if(<variable|string> EQUAL <variable|string>)
    

    如果给定的字符串或变量的值是有效数字并且等于右侧的数字,则为 True

  • 小于等于 (CMake 3.7引入)

    if(<variable|string> LESS_EQUAL <variable|string>)
    

    如果给定的字符串或变量的值是有效数字且小于或等于右侧的数字,则为 True

  • 大于等于 (CMake 3.7引入)

    if(<variable|string> GREATER_EQUAL <variable|string>)
    

    如果给定的字符串或变量的值是有效数字并且大于或等于右侧的数字,则为 True

3.5 字符串比较

  • 小于

    if(<variable|string> STRLESS <variable|string>)
    

    如果给定的字符串或变量的值在字典上小于右侧的字符串或变量,则为 True

  • 大于

    if(<variable|string> STRGREATER <variable|string>)
    

    如果给定的字符串或变量的值在字典上大于右侧的字符串或变量,则为 True

  • 等于

    if(<variable|string> STREQUAL <variable|string>)
    

    如果给定的字符串或变量的值在字典上等于右侧的字符串或变量,则为 True

  • 小于等于 (CMake 3.7引入)

    if(<variable|string> STRLESS_EQUAL <variable|string>)
    

    如果给定的字符串或变量的值在字典上小于或等于右侧的字符串或变量,则为 True

  • 大于等于 (CMake 3.7引入)

    if(<variable|string> STRGREATER_EQUAL <variable|string>)
    

    如果给定的字符串或变量的值在字典上大于或等于右侧的字符串或变量,则为 True

  • 匹配

    if(<variable|string> MATCHES regex)
    

    如果给定的字符串或变量的值与给定的常规条件匹配,则为 True。有关正则表达式格式,请参见正则表达式规范

3.6 版本比较

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

  • 小于

    if(<variable|string> VERSION_LESS <variable|string>)
    

    如果给定的字符串或变量的版本号小于右侧的字符串或变量,则为 True

  • 大于

    if(<variable|string> VERSION_GREATER <variable|string>)
    

    如果给定的字符串或变量的版本号大于右侧的字符串或变量,则为 True

  • 等于

    if(<variable|string> VERSION_EQUAL <variable|string>)
    

    如果给定的字符串或变量的版本号等于右侧的字符串或变量,则为 True

  • 小于等于 (CMake 3.7引入)

    if(<variable|string> VERSION_LESS_EQUAL <variable|string>)
    

    如果给定的字符串或变量的版本号小于或等于右侧的字符串或变量,则为 True

  • 大于等于 (CMake 3.7引入)

    if(<variable|string> VERSION_GREATER_EQUAL <variable|string>)
    

    如果给定的字符串或变量的版本号大于或等于右侧的字符串或变量,则为 True

3.7 路径比较 (CMake 3.24引入)

if(<variable|string> PATH_EQUAL <variable|string>)

逐级比较两个路径,如每级都相等,则返回 True

注意,多个路径分隔符重叠,会解析为一个,如:a//b///c 会解析为 a/b/c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[CMake教程] if 和 else 的相关文章

随机推荐

  • uboot环境变量与内核MTD分区关系

    uboot 与系统内核中MTD分区的关系 http www cnblogs com lidabo p 4774314 html 分区只是内核的概念 就是说A B地址放内核 C D地址放文件系统 也就是规定哪个地址区间放内核或者文件系统 等等
  • element 省市区三级联动

    https github com Plortinus element china area data github源码地址如下
  • [译] APT分析报告:08.漏洞利用图谱–通过查找作者的指纹来寻找漏洞

    这是作者新开的一个专栏 主要翻译国外知名安全厂商的APT报告 了解它们的安全技术 学习它们溯源APT组织和恶意代码分析的方法 希望对您有所帮助 当然 由于作者英语有限 会借助机翻进行校验 还请包涵 前文分享了APT组织拉撒路 Lazarus
  • docker安装kafka

    一 概述 Kafka是由Apache基金会开发的分布式流处理平台 采用发布 订阅模式 支持高吞吐量 低延迟的数据传输 主要用于处理实时数据管道 数据存储和数据分析等大数据应用场景 Kafka采用高效的数据压缩算法 可以在集群中存储大量的数据
  • 【网络】udp_socket编程

    目录 1 认识端口号 1 1 理解端口号和进程ID 1 2 理解源端口号和目的端口号 2 认识TCP协议 3 认识UDP协议 4 网络字节序 5 socket编程接口 5 1socket常见API 5 2sockaddr结构 sockadd
  • Java业务开发常见错误100例总结

    最近在极客时间上看了 Java业务开发常见错误100例 收获还是很大 我个人是很认真地刷了两遍 并花了二十来个晚上认真整理了一份脑图包括大纲和每个知识点的详细笔记 虽然Github上有原创作者整理的版本 效果如下 全部内容如下 自己整理一遍
  • linux(RedHat)启动无法进入图形界面,出现灰色屏幕。

    问题描述 安装完某些软件如DB2 Oracle等 可能出现启动系统 检查完各种硬件设备 但是没有出现登陆界面 出现的 是灰色屏幕 解决过程 初步猜测是无法启动图形界面 进一步论证的方法是在启动时 按下entre键 选择你按装的或者是要更改的
  • JavaScript实现人民币大小写转换

    当使用支票或者签署合同时 需要用到大写人民币 常用的中文大写包括零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写 工具地址 人民币大小写转换工具 人民币大小
  • uni-app自定义配置安卓模拟器 - MuMu模拟器

    第一步 下载MuMu模拟器 下载地址 http mumu 163 com 第二步 配置模拟器端口以及abd路径 该路径在HBuilder安装目录中 然后继续打开你的HBuilder编辑器 运行 运行到手机或模拟器 安卓模拟器端口配置 第三步
  • Oracle查询入门(五)连表查询

    定义 表连接查询 当要查询的数据来自于多个数据源 现在主要有92语法和99语法 92语法 select 数据 from 数据源1 数据源2 where 行过滤条件 group by 分组字段1 分组字段2 having 组过滤信息 orde
  • 仲裁文件夹服务器,存储仲裁服务器

    存储仲裁服务器 内容精选 换一换 帮助用户完成专属云服务器备份任务的创建 快速完成服务器数据保护 专属云服务器不支持应用一致性备份 当专属对象存储的容量不足时 会导致专属云服务器备份创建失败 已开通专属对象存储 登录管理控制台 单击 选择
  • IBM小型机安装AIX系统

    1 系统开机自检 系统开机后会进行自检 前置面板绿灯闪烁 此时放入系统光盘 2 系统菜单 系统自检完成后会显示菜单 按1进入系统菜单 这里要尽快输入 否则会进入之前的系统 3 输入密码 进入系统菜单后 出现两个选项 选择第二项输入密码 默认
  • html层级显示优先,CSS 样式的层叠和优先级说明

    上面说了浏览器要查看的所有样式来源后 现在聊一下浏览器显示元素时确认一个 CSS 属性值的次序 补充 CSS 样式由一条或者多条以分号分割开的样式声明组成 每条声明包含着一个 CSS 属性和该属性的值 两者以冒号分割 一 CSS 样式的层叠
  • 期货开户CTP高性能高容量高可靠性

    一 交易通道选择 CTP交易通道是就是上期技术 是上海期货信息技术有限公司研发的期货行业技术最先进的交易系统 具备每秒2000笔交易处理能力和1毫秒的行情更新速度 保障交易系统的最高可靠性 该通道是十分成熟的交易平台 目前主流期货公司中绝大
  • 在网页中内嵌网页

    目录 文章目录 前言 代码展示 主页代码 展示作品的代码 球体运动 方块旋转 结果演示 前言 在制作个人网站时 经常遇到一个问题 就是如何让自己的作品动态的显示在主页上 而本文就是找到了解决办法 利用标签 引入想要的结果 代码展示 主页代码
  • 自学Python能做哪些副业?我一般不告诉别人

    Python作为今天的互联网不可或缺的一门技能 可以成为自己的主业以外 其实它也还是可以成为副业的 那么学好python后可以从事的副业有哪些呢 自学Python能干的副业 1 兼职处理数据 分析数据是很重要的一点 那么利用python 就
  • 结构化思维的训练方式

    转自 https www sohu com a 198266900 628522 结构化思维 Structured Thinking 是指人在面对工作任务或者难题时 能从多个侧面进行思考 深刻分析导致问题出现的原因 系统制定行动方案 并采取
  • python实现剪刀石头布小游戏

    首先实现系统随机出剪刀石头布 import random 首先导入random模块 k 剪刀 石头 布 创建一个列表 列表共有我们所需要用到的三个元素 m random choice k 用该函数随机从k中取一个元素并赋值给m m便为剪刀石
  • MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

    最近学习MyBatis框架 用到多表查询比较多 以前学的不是很好 今特意回来补上 呜呜呜 有对MySql数据库的初步使用不是很了解的朋友们 可以切换到这里噢 https blog csdn net haobo article details
  • [CMake教程] if 和 else

    目录 一 基本语法 二 基本用法 三 其他用法 3 1 逻辑运算 3 2 存在性检查 3 3 文件操作 3 4 数值比较 3 5 字符串比较 3 6 版本比较 3 7 路径比较 CMake 3 24引入 一 基本语法 if