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的情况:
- string为空
- string(不区分大小写)是 0, FALSE, OFF, N, NO, IGNORE, or NOTFOUND
- 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)
相关文章:
CMake 学习笔记 (Generator Expressions)
CMake 学习笔记 (Generator Expressions) Generator Expressions 可以认为是一种特殊的变量,它会在编译阶段求值。通常用在 target_link_libraries(), target_include_directories(), target_compile_definitions() 上。 用 Generator Expr…...
提高测试用例质量的6大注意事项
在软件测试中,经常会遇到测试用例设计不完整,用例没有完全覆盖需求等问题,这样往往容易造成测试工作效率低下,不能及时发现项目问题,无形中增加了项目风险。 因此提高测试用例质量,就显得尤为重要。一般来说…...
2023牛客暑期多校训练营6 A-Tree (kruskal重构树))
文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai≤1),(1≤costi≤109) 题解 提供一种新的算法,kruskal重构树。 该算法重新构树,按边权排序每一条边…...
软件测试—支付功能测试
有人问过我这样一个问题:作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 回答:对支付平台而言&#…...
自动化测试的统筹规划
背景 回顾以前自动化测试编写的经历,主要是以开发者自驱动的方式进行,测试的编写随心而动,没有规划,也没有章法,这样就面临如下的一些问题: 测试用例设计不到位,覆盖不全,或者不够…...
外键字段的增删改查、多表查询(子查询和连表查询、正反向、聚合查询、 分组查询、 F与Q查询)、django中如何开启事务
一、 外键字段的增删改查 1.多对多的外键增删改查图书和作者是多对多,借助于第三张表实现的,如果想绑定图书和作者的关系,本质上就是在操作第三方表2.如何操作第三张表问题:让你给图书添加一个作者,他俩的关系可是多对…...
【学习笔记】生成式AI(ChatGPT原理,大型语言模型)
ChatGPT原理剖析 语言模型 文字接龙 ChatGPT在测试阶段是不联网的。 ChatGPT背后的关键技术:预训练(Pre-train) 又叫自监督式学习(Self-supervised Learning),得到的模型叫做基石模型(Founda…...
【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作
文章目录 1.腐蚀操作2.膨胀操作3.开运算和闭运算4.礼帽与黑帽5.梯度运算 1.腐蚀操作 腐蚀操作是图像处理中常用的一种形态学操作,我们通常用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。腐蚀操作的原理是,在给定的结构元素下,…...
Autosar诊断系列介绍20 - UDS应用层P2Server/P2Client等时间参数解析
本文框架 1. 前言2.几个时间参数含义2.1 P2Client与P2Server2.2 P2*Client与P2*Server2.3 P3Client_Phys与P3Client_Func2.4 S3Client与S3Server 1. 前言 本系列Autosar 诊断入门介绍,会详细介绍诊断相关基础知识,如您对诊断实战有更高需求,…...
【iOS】json数据解析以及简单的网络数据请求
文章目录 前言一、json数据解析二、简单的网络数据请求三、实现访问API得到网络数据总结 前言 近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结 一、json数据解析 JSON是一种轻量级的数据…...
Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证
1、概述 在 Kubernetes 官方手册中给出了 “用户” 的概念,Kubernetes 集群中存在的用户包括 “普通用户” 与 “ServiceAccount”, 但是 Kubernetes 没有普通用户的管理方式,通常只是将使用集群根证书签署的有效证书的用户都被视为合法用户。…...
45.ubuntu Linux系统安装教程
目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习,Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然 后再安装 Linux 系统。 所需安装文件:…...
Jmeter函数助手(一)随机字符串(RandomString)
一、目标 实现一个请求单次调用,请求体里多个集合中的相同参数(zxqs)值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段,单次执行请求,请求体里多个集合中的相同参数&a…...
SpringCloud之微服务API网关Gateway介绍
文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…...
机器学习入门之 pandas
pandas 有三种数据结构 一种是 Series 一种是 Dataframe import pandas as pd import numpy as np score np.random.randint(0,100,[10,5])score[0,0] 100Datascore pd.DataFrame(score)subject ["语文","数学","英语","物理&quo…...
Django之JWT库与SimpleJWT库的使用
Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…...
Jmeter远程服务模式运行时引用csv文件的路径配置
问题 在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。 在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考虑将脚本拷贝到remote主机。但是jmeter…...
《OWASP代码审计》学习——注入漏洞审计
一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令,以修改其行为。这些类型的攻击是常见且广泛的,黑客很容易测试网站是否易受攻击,攻击者也很容易利用这些攻击。如今,它们在尚未更新的遗留应用程序中非常常见…...
Linux虚拟机中安装MySQL5.6.34
目录 第一章、xshell工具和xftp的使用1.1)xshell下载与安装1.2)xshell连接1.3)xftp下载安装和连接 第二章、安装MySQL5.6.34(不同版本安装方式不同)2.1)关闭防火墙,传输MySQL压缩包到Linux虚拟机2.2&#x…...
Django的FBV和CBV
Django的FBV和CBV 基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…...
【5G系列】深入解析NAS层UAC:Access Identity与Access Category的获取机制
1. 深入理解NAS层UAC的核心概念 在5G网络中,NAS(Non-Access Stratum)层的统一接入控制(UAC)机制扮演着至关重要的角色。简单来说,UAC就像是一个智能门卫,它负责决定哪些终端设备(UE&…...
RexUniNLU开源NLU模型实战:金融研报关系抽取+事件时间线自动生成案例
RexUniNLU开源NLU模型实战:金融研报关系抽取事件时间线自动生成案例 1. 引言:当研报分析遇上智能信息抽取 想象一下这个场景:作为一名金融分析师,你刚收到一份长达50页的行业深度研究报告。你需要从中找出所有提到的公司、它们之…...
MATLAB/Simulink搭建全桥LLC仿真:从参数计算到波形调试的保姆级避坑指南
MATLAB/Simulink全桥LLC仿真实战:从理论参数到波形优化的工程化实现 电力电子工程师在设计全桥LLC谐振变换器时,仿真环节往往是理论走向实践的第一道门槛。许多初学者在Simulink中搭建模型时,明明按照教科书计算了Lr、Lm、Cr等参数࿰…...
Java架构师知识框架总结
Java架构师的核心定位是“技术决策者、系统设计者、问题解决者”,需具备“广度深度”的知识储备,既要精通Java核心技术,也要掌握架构设计思维、工程化落地能力,同时能结合业务场景做出最优技术决策。以下是完整的知识框架…...
手把手教你用Python的ObsPy库计算地震P波到时(附完整代码与避坑指南)
零基础实战:用Python的ObsPy库精准计算地震P波到时 地震数据分析中,P波到时的准确计算是定位震源和研究地下结构的基础。对于地球物理专业的学生和工程师来说,掌握这项技能能大幅提升工作效率。本文将带你从零开始,用Python的ObsP…...
避坑指南:PaviaU数据集预处理中,你的标准化和样本切片方法可能都错了
高光谱数据处理进阶:PaviaU数据集预处理的三大优化策略 1. 标准化方法的深度选择:全局与逐波段的博弈 高光谱数据的标准化处理远非简单调用StandardScaler()就能解决。PaviaU数据集包含103个波段,每个波段的光谱响应特性差异显著。全局标准化…...
Keil5项目模块化实战:将STM32标准外设驱动打包成GCC编译的.a静态库
Keil5项目模块化实战:将STM32标准外设驱动打包成GCC编译的.a静态库 在嵌入式开发中,随着项目规模扩大和复杂度提升,代码复用和模块化管理变得尤为重要。将常用的外设驱动(如GPIO、USART等)编译成静态库(.a文…...
技术拆解:豆包接入抖音电商的AI购物链路,从对话到下单如何实现15秒闭环
技术拆解:豆包接入抖音电商的AI购物链路,从对话到下单如何实现15秒闭环前言字节豆包App内测接入抖音电商,实现对话内下单闭环。本文从技术架构角度拆解AI购物链路的实现方式,以及对电商开发者的影响。一、AI购物链路架构用户自然语…...
Vue3+Turf.js开发指南:5个GIS空间分析必学技巧(2023最新版)
Vue3Turf.js开发指南:5个GIS空间分析必学技巧(2023最新版) 当我们需要在Web应用中处理地理空间数据时,传统的GIS系统往往显得笨重而复杂。而现代前端技术栈与轻量级空间分析库的结合,正在彻底改变这一局面。本文将带你…...
为什么97%的AI原生平台在QPS破5万后日志分析失效?揭秘内核级采样压缩与语义缓存双引擎设计
第一章:AI原生软件研发日志分析平台建设 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发对日志的语义理解、实时归因与根因推断提出了全新要求。传统ELK栈难以支撑LLM驱动的日志聚类、异常模式自演化识别及跨服务调用链的因果推理,因此需…...
