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>

使用示例:

cmake 复制代码
#条件表达式 $<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>"
)

除了 10 之外的类似布尔的 condition 值可以通过用 $<BOOL:...> 生成器表达式包装它们来处理:

$<BOOL:string>

string 转换为 01。如果以下任何一项为真,则评估为"0":

  • string 为空,

  • string 是不区分大小写的等于 0FALSEOFFNNOIGNORE NOTFOUND

  • string 以后缀 -NOTFOUND 结尾(区分大小写)。

否则计算为"1"。

当 CMake 变量提供 condition 时,经常使用 $<BOOL:...>生成器表达式:

$<$<BOOL:${HAVE_SOME_FEATURE}>:-DENABLE_SOME_FEATURE>

使用示例:

cmake 复制代码
#条件表达式 $<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 是以逗号分隔的布尔表达式列表,所有这些表达式的计算结果必须为 10。如果所有条件都为"1",则整个表达式的计算结果为"1"。如果任何条件为"0",则整个表达式的计算结果为"0"。

$<OR:conditions>

其中 conditions 是以逗号分隔的布尔表达式列表。所有这些都必须评估为"1"或"0"。如果 condition 中的至少一个为"1",则整个表达式的计算结果为"1"。如果所有 condition 的计算结果为"0",则整个表达式的计算结果为"0"。

$<NOT:condition>

condition 必须是 01。如果 condition 为"1",则表达式的结果为"0",否则为"1"。

使用示例:

cmake 复制代码
#逻辑运算符 $<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

相关推荐
小汉堡编程2 小时前
数据结构——vector数组c++(超详细)
数据结构·c++
胖大和尚7 小时前
CMake是什么
cmake
tan180°7 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
彭祥.9 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk9 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
胖大和尚11 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
钱彬 (Qian Bin)12 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶83613 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸13 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言14 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio