首页 > 其他分享 >CMake 生成器表达式---条件表达式和逻辑运算符

CMake 生成器表达式---条件表达式和逻辑运算符

时间:2024-10-30 20:09:28浏览次数:7  
标签:return string 生成器 运算符 COMMAND 表达式 condition

【写在前面】

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 是不区分大小写的等于 0FALSEOFFNNOIGNORE 或  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

标签:return,string,生成器,运算符,COMMAND,表达式,condition
From: https://www.cnblogs.com/mengps/p/18516531

相关文章

  • 运算符重载
        运算符重载是C++中的一个重要特性,它允许程序员为自定义类型(类)定义运算符的行为。以下是运算符重载在C++语言中的一些应用:1.**自定义数据类型的运算**:通过运算符重载,可以使自定义类的对象像内置类型一样进行运算。例如,可以重载加法运算符(`+`)来实现两个对象的相加......
  • Python——点亮生活:励志名言生成器
    在这个快节奏、充满挑战的时代,我们每个人都可能在某个时刻感到迷茫或失去动力。在这些时刻,一句恰当的励志名言往往能够像一束光照亮我们的道路,给予我们继续前行的力量。本文将详细介绍如何使用Python编程语言来创建一个励志名言生成器,这不仅是一个编程实践的案例,也是一个能够......
  • 正则表达式
    正则表达式​ \(L=\{a\{a,b\}*\{\epsilon\}^*(\epsilon|(.|_)(a|b)(a|b*))\)正则表达式可以由较小的正则表达式按照特定规则递归地构建.每个正则表达式$r$定义(表示)一个语言,记为\(L(r)\).这个语言也是根据\(r\)的子表达式所表示的语言递归定义的.\(\epsilon......
  • 【linux】Shell中的运算符
    Shell中的运算符语法1)$((运算式))或$[运算式]2)expr+,-,*,/,%加,减,乘,除,取余注意:expr运算符间要有空格1.演示$((运算式))进行加减乘除取余[root@localhost~]#echo$((1+5))6[root@localhost~]#echo$((3*4))12[root@localhost~]#echo$((4/2))2[r......
  • GitHub Star 数量前 5 的开源应用程序生成器
    欢迎来的GitHubStar数量排名系列文章的第7篇——最受欢迎的应用程序生成器。之前我们已经详细探讨过:在GitHub上最受欢迎的——无代码工具、低代码项目、内部工具、CRUD项目、自部署项目和Airtable开源替代品。累计超过50个优质项目!(......
  • 用户交互与运算符
    二用户交互与运算符2.1用户交互人input输入,计算机print输出2.1.1输入input程序执行input(),程序会停下来等待用户的输入,用户可以从键盘输入任何内容,输入的数据都会存为字符串类型语法input("请输入姓名:")#程序遇到会立即停止,可以从控制台输入内容。回车后程序......
  • 用正则表达式获取json字段排序
    varReg01=newRegex($"\"fd9e\"\\s*?:\\s*?(\".*?)\"");varReg02=newRegex($"\"fe1e\"\\s*?:\\s*?(\".*?)\"");dtoList=dtoList.Select(a=>new{ dto=a,H=getMatchReg01(Reg02......
  • CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)
    最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比,还是有一定难度的。与现在网上的大多数所谓CodeQL教程不同,本系列基于......
  • 运算符优先级
    运算符优先级决定了在表达式中运算符的执行顺序。优先级高的运算符会优先执行,通常会影响表达式的计算结果。下面是一个常见的运算符优先级表(从高到低)。需要注意的是,优先级越高的运算符越先执行,同一优先级的运算符按结合性进行执行(如左结合或右结合):优先级运算符描述......
  • C/C++ 中有哪些常见的运算符?
    1.算术运算符用于执行数学运算。+(加法)-(减法)*(乘法)/(除法)%(取模,返回余数)2.关系运算符用于比较两个值的关系,结果为布尔值(true或false)。==(等于)!=(不等于)>(大于)<(小于)>=(大于等于)<=(小于等于)3.逻辑运算符用于在逻辑表达式中执行布尔逻辑运算。&&(逻辑与,AND)||(逻辑或,OR)!(逻辑非......