CMake 生成器表达式---条件表达式和逻辑运算符
【写在前面】
CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在目标属性和生成器表达式上下文中。这些表达式允许你根据不同的平台、配置或编译器来定制构建过程。
本文引用的文档链接:
cmake 生成器表达式 (7) — CMake 3.26.4 Documentation
【正文开始】
本篇文章将介绍《条件表达式》
和《逻辑运算符》
。
- 条件表达式:
生成器表达式的一个基本类别与条件逻辑有关。支持两种形式的条件生成器表达式:
$<condition:true_string>
如果
condition
为 “1”,则评估为“true_string”,如果condition
评估为“0”,则评估为空字符串。condition
的任何其他值都会导致错误。
$<IF:condition,true_string,false_string>
在 3.8 版本加入.
如果
condition
为 “1”,则评估为“true_string”,如果condition
为“0”,则评估为“false_string”。condition
的任何其他值都会导致错误。
通常,condition
本身就是一个生成器表达式。例如,当使用 Debug
配置时,以下表达式扩展为 DEBUG_MODE
,所有其他配置为空字符串:
$<$<CONFIG:Debug>:DEBUG_MODE>
使用示例:
#条件表达式 $<condition:true_string>
#等价于C++ if (condition == "1") return true_string else return ""
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[1]: WIN32: ${WIN32} | $<${WIN32}:is win32> | $<0:is 0>"
)
#条件表达式 $<IF:condition,true_string,false_string>
#等价于C++ condition ? true_string : false_string
set(IS_DEBUG "1")
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[2]: IS_DEBUG: ${IS_DEBUG} | $<IF:${IS_DEBUG},is debug,is release>"
)
除了 1
或 0
之外的类似布尔的 condition
值可以通过用 $<BOOL:...>
生成器表达式包装它们来处理:
$<BOOL:string>
将
string
转换为0
或1
。如果以下任何一项为真,则评估为“0”:
string
为空,
string
是不区分大小写的等于0
、FALSE
、OFF
、N
、NO
、IGNORE
或NOTFOUND
string
以后缀-NOTFOUND
结尾(区分大小写)。否则计算为“1”。
当 CMake 变量提供 condition
时,经常使用 $<BOOL:...>
生成器表达式:
$<$<BOOL:${HAVE_SOME_FEATURE}>:-DENABLE_SOME_FEATURE>
使用示例:
#条件表达式 $<BOOL:string>
#等价于C++ if (string) return "1" else return "0"
set(STRING2BOOL "not empty")
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[3]: STRING2BOOL: ${STRING2BOOL} | $<BOOL:${STRING2BOOL}> | $<$<BOOL:${STRING2BOOL}>:STRING2BOOL is not empty>"
)
三个示例的输出如下:
- 逻辑运算符
支持常见的布尔逻辑运算符:
$<AND:conditions>
其中
conditions
是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为1
或0
。如果所有条件都为“1”,则整个表达式的计算结果为“1”。如果任何条件为“0”,则整个表达式的计算结果为“0”。
$<OR:conditions>
其中
conditions
是以逗号分隔的布尔表达式列表。所有这些都必须评估为“1”或“0”。如果condition
中的至少一个为“1”,则整个表达式的计算结果为“1”。如果所有condition
的计算结果为“0”,则整个表达式的计算结果为“0”。
$<NOT:condition>
condition
必须是0
或1
。如果condition
为“1”,则表达式的结果为“0”,否则为“1”。
使用示例:
#逻辑运算符 $<AND:conditions>
#等价于C++ if (condition && condition && ...) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[1]: (1 && 0 && 1) = $<AND:1,0,1>"
)
#逻辑运算符 $<OR:conditions>
#等价于C++ if (condition || condition || ...) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[2]: (1 || 0 || 0) = $<OR:1,0,0>"
)
#逻辑运算符 $<NOT:condition>
#等价于C++ if (!condition) return "1" else return "0"
add_custom_command(
TARGET MyExecutable PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "[3]: !1 = $<NOT:1>"
)
结果如下:
【结语】
项目链接(多多star呀.._):
Github 地址:https://github.com/mengps/LearnCMake
CMake 生成器表达式---条件表达式和逻辑运算符的更多相关文章
- 【C语言探索之旅】 第一部分第六课:条件表达式
内容简介 1.课程大纲 2.第一部分第六课:条件表达式 3.第一部分第七课预告:循环语句 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...
- shell之条件表达式
conditional expressions are used by the [[ compound command and the test and [ builtin commands. ari ...
- Less的条件表达式
Less的条件表达式 当需要根据表达式,而不是参数的值或数量进行匹配时,条件表达式(Guards)就显得非常有用.如果你熟悉函数式编程的话,对条件表达式也不会陌生. 为了尽可能地接近CSS的语言结构, ...
- if的条件表达式
常用的: [ -a FILE ] 如果 FILE 存在则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真. [ -e FILE ] 如果 指定的文件或目录存在时返回为真. [ ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- javascript面向对象编程笔记(基本数据类型,数组,循环及条件表达式)
javascript面向对象编程指南 最近在看这本书,以下是我的笔记,仅供参考. 第二章 基本数据类型.数组.循环及条件表达式 2.1 变量 区分大小写 2.3 基本数据类型 数字:包括浮点数与整数 ...
- [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数
前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...
- Scala:条件表达式的好处
条件表达式的好处之一是:让代码更简洁,例如在一个需要根据不同条件收集不同值的场景中,多数语言提供的代码如下: ; ) { tmp = xxx; } ) { tmp = yyy; } else { tm ...
- Shell 条件表达式汇总
条件表达式 文件表达式 if [ -f file ] 如果文件存在if [ -d ... ] 如果目录存在if [ -s file ] 如果文件存在且非空 if [ -r f ...
- Python学习教程(learning Python)--3.3 分支语句的条件表达式详解
本节主要讨论分支语句的条件表达式问题. 在if或者if-else分支控制语句里由于都用到条件判断(表达式是真还是假),条件判断可以是一种关系运算也可以是布尔表达式. 本节将对if及if-else语句的 ...
随机推荐
- 处理报错 ResizeObserver loop completed with undelivered notifications.
// 处理报错 ResizeObserver loop completed with undelivered notifications. export const handlerResizeObse ...
- navicat远程连接报错
mysql,2003 can't connect to mysql server on 10038 我们连接远程服务器的mysql,如果出现问题,很大问题会出在服务器的端口和授权问题 # 首先我们通过 ...
- hacs安装
安装 HACS 直接使用 Docker 的可视化管理面板 Portainer 或者通过命令行进入 Docker 容器,然后执行以下安装命令: docker exec -it <容器名称或容器ID ...
- WinForm程序中使用Echarts图表
WinForm程序中使用Echarts 实现原理: WebBrowser + HTML 第一步:在窗体中添加WebBrowser控件 1.在工具箱中找到WebBrowser控件,拖动到窗体中 设置We ...
- 【Mac】之安装VM虚拟机并安装centos7系统
参考文章:<Mac 安装VMware Fusion虚拟机> 一.安装VMware Fusion 首先下载Mac版VMware虚拟机: 链接:https://pan.baidu.com/s/ ...
- VS Code 代码片段指南: 从基础到高级技巧
前言 " 系列首发于公众号『非同质前端札记』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. 今天咱们来聊聊 VS Code 里的自定义代码片段. 这 ...
- iptables 工作过程整理
转载注明出处: 1.概念和工作原理 iptables是Linux系统中用来配置防火墙的命令.iptables是工作在TCP/IP的二.三.四层,当主机收到一个数据包后,数据包先在内核空间处理,若发现目 ...
- win10远程登录的账号密码
win10有了一个windows hello,还有本地账号,还有microsoft账号 在 设置-账户信息 这里可以设置登录一个 Microsoft账号,然后远程登录的时候,用的是 Microsoft ...
- 【YashanDB数据库】PHP无法通过ODBC连接到数据库
[问题分类]驱动使用 [关键字]ODBC.驱动使用.PHP [问题描述]应用使用php-fpm+nginx架构,通过php的ODBC拓展连接YashanDB时出现报错: [unixODBC][Driv ...
- Qemu - 介绍
Ref: QEMU支持3种运行模式 -- 理解 https://www.minitool.com/partition-disk/qemu-for-windows.html