当前位置: 首页 > article >正文

cmake生成器表达式

CMake生成器表达式语法是为了在构建过程中灵活地指定和操作构建目标的属性和参数。生成器表达式通常在CMakeLists.txt文件中的某些指令或命令中使用,常见的场景包括target_link_librariesadd_custom_command等。以下是CMake生成器表达式语法的一些规则和常用表达式:

1. 语法规则

  • 生成器表达式$<...> 的形式出现,其中 ... 是具体的表达式内容。
  • 表达式内部可以嵌套使用,例如 $<IF:$<CONFIG:Debug>,debug,release>
  • 表达式支持逻辑运算和条件判断,可以根据不同的构建配置进行不同的处理。

2. 常用表达式

  • $<CONFIG:cfg>:如果当前构建配置是 cfg,则返回1,否则返回0。
  • $<PLATFORM_ID:platform>:如果目标平台是 platform,则返回1,否则返回0。
  • $<TARGET_FILE:tgt>:返回构建目标 tgt 的完整路径。
  • $<TARGET_FILE_DIR:tgt>:返回构建目标 tgt 所在目录的路径。
  • $<TARGET_LINKER_FILE:tgt>:返回链接目标 tgt 的路径。
  • $<BOOL:expr>:返回表达式 expr 的布尔值,0 或 1。
  • $<JOIN:list,sep>:将列表 list 中的所有元素用分隔符 sep 连接起来,生成一个新的字符串。

3. 例子

add_library(myLib STATIC ${source_files})
target_link_libraries(myApp PRIVATE $<TARGET_FILE:myLib>)

这段代码中,$<TARGET_FILE:myLib> 表达式在构建 myApp 时会被替换为 myLib 库的实际路径。


当然可以!CMake生成器表达式提供了许多功能强大且灵活的工具,这里再列举一些常用的表达式:

常用生成器表达式

  • $<COMPILE_LANGUAGE:lang>:如果编译语言是 lang,则返回1,否则返回0。
  • $<TARGET_PROPERTY:tgt,prop>:返回构建目标 tgt 的属性 prop 的值。
  • $<INSTALL_INTERFACE:content>:在安装规则中生成指定的 content
  • $<BUILD_INTERFACE:content>:在构建规则中生成指定的 content
  • $<STREQUAL:string1,string2>:如果字符串 string1 等于 string2,则返回1,否则返回0。
  • $<AND:expr1,expr2>:如果 expr1expr2 都为真,返回1,否则返回0。
  • $<OR:expr1,expr2>:如果 expr1expr2 为真,返回1,否则返回0。
  • $<NOT:expr>:如果 expr 为假,返回1,否则返回0。
  • $<IF:cond,true_expr,false_expr>:如果 cond 为真,返回 true_expr,否则返回 false_expr
  • $<REMOVE_DUPLICATES:list>:移除列表 list 中的重复项。
  • $<TARGET_PROPERTY:tgt,prop>:获取目标 tgt 的属性 prop 的值。
  • $<TARGET_EXISTS:tgt>:如果目标 tgt 存在,则返回1,否则返回0。
  • $<TARGET_NAME_IF_EXISTS:tgt>:如果目标 tgt 存在,则返回目标的名称,否则返回空字符串。
  • $<FILTER:list,regex>:返回匹配正则表达式 regex 的列表 list 元素。
  • $<GENEX_EVAL:expr>:评估生成器表达式 expr 并返回结果。

示例

# 设置不同构建配置的编译定义
target_compile_definitions(myApp PRIVATE $<$<CONFIG:Debug>:DEBUG> $<$<CONFIG:Release>:NDEBUG>)

# 只在安装时包含某些目录
target_include_directories(myApp
  PRIVATE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
    $<INSTALL_INTERFACE:include>
)

这些表达式可以帮助你更灵活地配置和管理构建过程,特别是当你需要根据不同的平台、编译器或者配置进行不同处理时,非常有用。


http://www.kler.cn/a/392686.html

相关文章:

  • LeetCode--347.前k个高频元素(使用优先队列解决)
  • 浅谈下雪花算法的原理,及在项目中使用需要注意哪些事项
  • Redis——数据过期策略
  • 【视觉惯性SLAM:六、图优化库(1):g2o的使用指南】
  • 谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持
  • Flink的Watermark水位线详解
  • WordPress 6.7 “Rollins”发布
  • 成本400元,DIY一个高刷新率热成像相机
  • 使用 scipy 计算置信区间
  • 第N7周:调用Gensim库训练Word2Vec模型
  • 网络编程示例之开发板测试
  • java常用工具介绍
  • Prometheus面试内容整理-Metrics 类型
  • PHP接口安全的机制
  • 【代码管理之道】Git基础知识详解
  • 主成分分析(Principal Component Analysis, PCA) 数学原理 与 MATLAB代码复现
  • D67【python 接口自动化学习】- python基础之数据库
  • PostgreSQL 一键安装部署脚本化
  • html实体字符
  • 动态规划 —— dp 问题-买卖股票的最佳时机含冷冻期
  • Linux手动安装nginx
  • Vue全栈开发旅游网项目(11)-用户管理前端接口联调
  • 【iStat Menus for MacBook状态栏菜单系统监控工具--安装教程【简单操作,随时了解电脑情况】
  • IDEA一键部署SpringBoot项目到服务器
  • 516.最长回文子序列
  • 通过wsl配置Qt的中文开发环境