CMake 学习笔记 (Generator Expressions)

CMake 学习笔记 (Generator Expressions)

Generator Expressions 可以认为是一种特殊的变量,它会在编译阶段求值。通常用在 target_link_libraries(), target_include_directories(), target_compile_definitions() 上。

用 Generator Expressions 可以帮助我们简化代码,省略掉很多原来只能用 if() endif() 来实现的代码。

下面来讲一讲 Generator Expressions 的基本类型和 规则。

Conditional Expressions (条件表达式)

$<condition:true_string>

当 condition 为 1 的时候,求值为 true_string,否则为空字符串。

$<IF:condition,true_string,false_string>

当 condition 为 1 的时候,求值为 true_string,否则为 false_string。

$<BOOL:string>

把string转换成 0 或者 1。以下是求值为0的情况:

  1. string为空
  2. string(不区分大小写)是 0, FALSE, OFF, N, NO, IGNORE, or NOTFOUND
  3. string(不区分大小写)的后缀是“ -NOTFOUND”

其他情况都为 1。

Logical Operators (逻辑操作)

$<AND:conditions>

conditions 由多个互相独立的 boolean expressions构成,这些独立的 boolean expressions 之间用 逗号 分割。当所有 condition 都是 1 的时候,表达式才会值为1,否则为 0。

$<OR:conditions>

conditions 由多个互相独立的 boolean expressions构成,这些独立的 boolean expressions 之间用 逗号 分割。有一个 condition 是 1 的时候,表达式的值为 1,否则为 0。

$<NOT:condition>

condition 是 0 的时候表达式值为1, condition是 1 时候表达式值为 0。

Primary Comparison Expressions (各种比较表达式)

这里给出的是一些比较常见的,还有些不常见的没有列出。

$<STREQUAL:string1,string2>

string1和string2相等为1,不等为0(区分大小写)。

$<EQUAL:value1,value2>

value1 和 value2 数值相等为 1,不等为 0。

$<VERSION_LESS:v1,v2>

若 v1 的版本号小于 v2 则为 1,否则为 0。

$<VERSION_GREATER:v1,v2>

若 v1 的版本号大于 v2 则为 1,否则为 0。

$<VERSION_EQUAL:v1,v2>

若 v1 的版本号等于 v2 则为 1,否则为 0。

$<VERSION_LESS_EQUAL:v1,v2>

若 v1 的版本号小于或等于 v2 则为 1,否则为 0。

$<VERSION_GREATER_EQUAL:v1,v2>

若 v1 的版本号大于或等于 v2 则为 1,否则为 0。

$<TARGET_EXISTS:target>

target 存在为 1,不存在为 0。

String Transformations (字符串的基本变换)

$<LOWER_CASE:string>

将字符串转化为小写。

$<UPPER_CASE:string>

将字符串转化为大写。

$<MAKE_C_IDENTIFIER:...>

将字符串转换为一个合法的C语言的变量名,也就是说把空格都去掉变成下划线。如果字符串是以数字开头的,那么在前面加上下划线。

List Expressions (List 相关的一些操作)

$<IN_LIST:string,list>

若 string 是 list 中的成员则为 1,否则为 0。注意:cmake 的字符串区分大小写。

$<LIST:LENGTH,list>

输出这个 list 的元素的个数。

$<LIST:GET,list,index,...>

取得 list 中的第 index 个元素。如果给出多个 index ,则取出的还是个 list。

$<LIST:SUBLIST,list,begin,length>

得到一个list 的子 list。

$<LIST:FIND,list,value>

在一个 list 中查找 value,找到了则返回 index,没找到返回 -1。

$<LIST:APPEND,list,item,...>

在 list 后面增加一些项。

$<LIST:PREPEND,list,item,...>

在 List 前面增加一些项。

$<LIST:INSERT,list,index,item,...>

在 list 中插入一个或者多个 item。

$<LIST:POP_BACK,list>

返回一个 去掉最后一个元素的 list。

$<LIST:POP_FRONT,list>

返回一个去掉第一个元素的 list。

$<LIST:REMOVE_ITEM,list,value,...>

删除 list 中的一些元素。将删除后的 list 返回。

$<LIST:REMOVE_DUPLICATES,list>

删除重复的元素。返回去重后的list。

$<LIST:REVERSE,list>

将 list 反转。

$<LIST:SORT,list[,(COMPARE:option|CASE:option|ORDER:option)]...>

将list 排序。

Path Comparisons

$<PATH_EQUAL:path1,path2>

比较两个路径是否是相同的。

$<PATH:IS_ABSOLUTE,path>

判断一个路径是否是绝对路径。

$<PATH:IS_RELATIVE,path>

判断一个路径是否是相对路径。

$<PATH:IS_PREFIX[,NORMALIZE],path,input>

判断 path 是否是 input 的 prefix 。也就是 input 是否是 path 的子目录。

平台和编译器相关表达式

$<PLATFORM_ID>

返回平台 ID。

$<PLATFORM_ID:platform_ids>

platform_ids 是个列表,当 PLATFORM_ID 是这个列表中的某一项时,输出1 ,否则 0。

$<C_COMPILER_VERSION>
$<CXX_COMPILER_VERSION>
$<CUDA_COMPILER_VERSION>
$<OBJC_COMPILER_VERSION>
$<OBJCXX_COMPILER_VERSION>
$<Fortran_COMPILER_VERSION>
$<HIP_COMPILER_VERSION>
$<ISPC_COMPILER_ID>

输出编译器的版本。

$<C_COMPILER_VERSION:version>
$<CXX_COMPILER_VERSION:version>
$<CUDA_COMPILER_VERSION:version>
$<OBJC_COMPILER_VERSION:version>
$<OBJCXX_COMPILER_VERSION:version>
$<Fortran_COMPILER_VERSION:version>
$<HIP_COMPILER_VERSION:version>
$<ISPC_COMPILER_ID:compiler_ids>

当编译器的版本和 version 一致时输出1,否则 0。

$<COMPILE_LANGUAGE>

执行当前编译动作时的编程语言。当我们的项目中包含多种编程语言时可能会用到这个结果。

$<COMPILE_LANGUAGE:languages>

当编程语言时 languages 之一时输出1,否则 为 0。

下面是一个例子:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_options(myappPRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)
target_compile_definitions(myappPRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>$<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
)
target_include_directories(myappPRIVATE $<$<COMPILE_LANGUAGE:CXX,CUDA>:/opt/foo/headers>
)

myapp 是一个可执行文件,它的源代码既包括C++ 又包括 c 语言等其他语言。

那么:

$<COMPILE_LANGUAGE:CXX>    # 当编译 main.cpp 和 bar.cpp 时的结果是 1。
$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>  # 等价于 $<1:-fno-exceptions>,这个也是个条件表达式。继续等价于 "-fno-exceptions"编译其他文件是 $<COMPILE_LANGUAGE:CXX> 输出是 0。$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions> 输出为空 字符串。
$<COMPILE_LANG_AND_ID:language,compiler_ids>

当语言和编译器都对的时候输出 1,否则 0。下面是个例子:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_definitions(myappPRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:COMPILING_CXX_WITH_CLANG>$<$<COMPILE_LANG_AND_ID:CXX,Intel>:COMPILING_CXX_WITH_INTEL>$<$<COMPILE_LANG_AND_ID:C,Clang>:COMPILING_C_WITH_CLANG>
)
$<LINK_LANGUAGE>
$<LINK_LANGUAGE:languages>

这两个是用来控制链接阶段的选项的。比如下面的例子:

add_library(api_C ...)
add_library(api_CXX ...)
add_library(api INTERFACE)
target_link_options(api   INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c>$<$<LINK_LANGUAGE:CXX>:-opt_cxx>)
target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C>$<$<LINK_LANGUAGE:CXX>:api_CXX>)add_executable(myapp1 main.c)
target_link_options(myapp1 PRIVATE api)add_executable(myapp2 main.cpp)
target_link_options(myapp2 PRIVATE api)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【visual studio2019】如何打开即时窗口

在 Visual Studio2019 中打开即时窗口&#xff0c;有两种方法&#xff1a; 1、可以通过“调试”菜单&#xff0c;然后选择“窗口”下的“即时窗口”选项 2、直接使用快捷键“Ctrl Alt I” 此时即时窗口将显示在 Visual Studio2019 的底部。在即时窗口中&#xff0c;可以执…

oracle环境变量

查看oracle环境变量 env |grep ORA [oracleizhp3b679b0ht5m1rzqhubz tomcat]$ env |grep ORA ORACLE_SIDorcl ORACLE_BASE/u01/app/oracle ORACLE_HOME/u01/app/oracle/product/12/db_1重新 登陆刷新环境变量配置 source ~/.bash_profile 登陆oracle cd /u01/app/oracle/p…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

stable diffusion

一&#xff1a;安装。 stable diffusion 安装和使用全教程 - 知乎 Stable Diffusion安装 - 知乎 环境安装&#xff1a; 1&#xff1a;python 3.10安装。 Download Python | Python.org 切记要安装3.10版本&#xff0c;因为Stable diffusion是用3.10版本编写的&#xff0c;所…

【C++】 哈希

一、哈希的概念及其性质 1.哈希概念 在顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。比如顺序表需要从第一个元素依次向后进行查找&#xff0c;顺序查找时间复杂度为…

VS Code环境配置问题

VS Code 环境配置问题 文章目录 VS Code 环境配置问题配置 C问题解决不乱码只显示结果避免闪退&#xff0c;中文乱码 配置 Java下载 JDKJDK 环境配置安装插件 配置 C 跟着官网教程&#xff08;英文版&#xff09;和其他博客配置了一遍&#xff0c;却遇到了很多小问题&#xff…

MyBatis源码剖析之延迟加载源码细节

文章目录 什么是延迟加载&#xff1f;实现局部延迟加载全局延迟加载 延迟加载原理实现延迟加载原理&#xff08;源码剖析)Setting 配置加载&#xff1a;延迟加载代理对象创建注意事项 什么是延迟加载&#xff1f; 在开发过程中很多时候我们并不需要总是在加载⽤户信息时就⼀定…

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如&#xff0c;tab缩进4个空格&#xff0c;或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Mysql-MVCC 并发版本控制

参考链接&#xff1a;一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客 1.总述&#xff1a; MVCC 主要是InnoDB解决数据库事务读写&#xff0c;导致的脏读、重复读问题的处理方法。通过快照读的方式&#xff0c;提高数据库并发查询的能力。 2.MVCC的实现 实现MVCC主要用到了…

在OK3588板卡上部署模型实现人工智能OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

金蝶云星空任意文件读取漏洞复现(0day)

0x01 产品简介 金蝶云星空是一款云端企业资源管理&#xff08;ERP&#xff09;软件&#xff0c;为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织&#xff0c;多利润中心的大中型企业&#xff0c;以 “开放、标准、社交”三大特性为数字…

ChatGPT伦理挑战:人工智能的权利与责任

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Android 首次开机优化分析工具bootchart

Android开机时长优化_android 开机时间优化_Mart!nHu的博客-CSDN博客 bootchart使用_bootchart.jar_xuyewen288的博客-CSDN博客 bootchart_hc-斌斌的博客-CSDN博客 性能分析工具 — bootchart 工具使用(android 8.1)_岁月斑驳7的博客-CSDN博客 linux-用户进程时间统计_pybo…

HCIP期中实验

考试需求 1 、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 OSPF 协议…

除......之外,不等于

查找除复旦大学的用户信息_牛客题霸_牛客网 3种方法 1. <> select device_id,gender,age,university from user_profile where university <> 复旦大学; 2. !&#xff08;其实是<>不等于的另外一种写法&#xff09; select device_id,gender,age,univ…

实时协作:团队效率倍增的关键

实时协作是指团队在当前时刻共同完成项目的能力。无论是否使用技术&#xff0c;都能实现这一点。然而&#xff0c;随着远程工作的盛行&#xff0c;安全的协作工具被用来让团队成员在项目和一般业务之间保持联系和同步。 传统协作与实时协作的区别 两种类型的协作最明显的区别…

uniapp 微信小程序 navigationBarBackgroundColor 标题栏颜色渐变

大体思路&#xff1a; 第一步&#xff1a;“navigationStyle”:“custom” 第二步&#xff1a; template内 重点&#xff1a;给view添加ref“top” 第三步&#xff1a;添加渐变色样式 1、pages.json {"path" : "pages/user/user","style" : …

【玩转Linux】Linux输入子系统简介

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…