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

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)

相关文章:

CMake 学习笔记 (Generator Expressions)

CMake 学习笔记 &#xff08;Generator Expressions&#xff09; Generator Expressions 可以认为是一种特殊的变量&#xff0c;它会在编译阶段求值。通常用在 target_link_libraries(), target_include_directories(), target_compile_definitions() 上。 用 Generator Expr…...

提高测试用例质量的6大注意事项

在软件测试中&#xff0c;经常会遇到测试用例设计不完整&#xff0c;用例没有完全覆盖需求等问题&#xff0c;这样往往容易造成测试工作效率低下&#xff0c;不能及时发现项目问题&#xff0c;无形中增加了项目风险。 因此提高测试用例质量&#xff0c;就显得尤为重要。一般来说…...

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) 题解 提供一种新的算法&#xff0c;kruskal重构树。 该算法重新构树&#xff0c;按边权排序每一条边…...

软件测试—支付功能测试

有人问过我这样一个问题&#xff1a;作为一个支付平台&#xff0c;接入了快钱、易宝或直连银行等多家的渠道&#xff0c;内在的产品流程是自己的。业内有什么比较好的测试办法&#xff0c;来测试各渠道及其支持的银行通道呢&#xff1f; 回答&#xff1a;对支付平台而言&#…...

自动化测试的统筹规划

背景 回顾以前自动化测试编写的经历&#xff0c;主要是以开发者自驱动的方式进行&#xff0c;测试的编写随心而动&#xff0c;没有规划&#xff0c;也没有章法&#xff0c;这样就面临如下的一些问题&#xff1a; 测试用例设计不到位&#xff0c;覆盖不全&#xff0c;或者不够…...

外键字段的增删改查、多表查询(子查询和连表查询、正反向、聚合查询、 分组查询、 F与Q查询)、django中如何开启事务

一、 外键字段的增删改查 1.多对多的外键增删改查图书和作者是多对多&#xff0c;借助于第三张表实现的&#xff0c;如果想绑定图书和作者的关系&#xff0c;本质上就是在操作第三方表2.如何操作第三张表问题&#xff1a;让你给图书添加一个作者&#xff0c;他俩的关系可是多对…...

【学习笔记】生成式AI(ChatGPT原理,大型语言模型)

ChatGPT原理剖析 语言模型 文字接龙 ChatGPT在测试阶段是不联网的。 ChatGPT背后的关键技术&#xff1a;预训练&#xff08;Pre-train&#xff09; 又叫自监督式学习&#xff08;Self-supervised Learning&#xff09;&#xff0c;得到的模型叫做基石模型&#xff08;Founda…...

【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作

文章目录 1.腐蚀操作2.膨胀操作3.开运算和闭运算4.礼帽与黑帽5.梯度运算 1.腐蚀操作 腐蚀操作是图像处理中常用的一种形态学操作&#xff0c;我们通常用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。腐蚀操作的原理是&#xff0c;在给定的结构元素下&#xff0c;…...

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 诊断入门介绍&#xff0c;会详细介绍诊断相关基础知识&#xff0c;如您对诊断实战有更高需求&#xff0c;…...

【iOS】json数据解析以及简单的网络数据请求

文章目录 前言一、json数据解析二、简单的网络数据请求三、实现访问API得到网络数据总结 前言 近期写完了暑假最后一个任务——天气预报&#xff0c;在里面用到了简单的网络数据请求以及json数据的解析&#xff0c;特此记录博客总结 一、json数据解析 JSON是一种轻量级的数据…...

Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证

1、概述 在 Kubernetes 官方手册中给出了 “用户” 的概念&#xff0c;Kubernetes 集群中存在的用户包括 “普通用户” 与 “ServiceAccount”&#xff0c; 但是 Kubernetes 没有普通用户的管理方式&#xff0c;通常只是将使用集群根证书签署的有效证书的用户都被视为合法用户。…...

45.ubuntu Linux系统安装教程

目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习&#xff0c;Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统&#xff0c;所以需要先安装 vmware 软件&#xff0c;然 后再安装 Linux 系统。 所需安装文件&#xff1a;…...

Jmeter函数助手(一)随机字符串(RandomString)

一、目标 实现一个请求单次调用&#xff0c;请求体里多个集合中的相同参数&#xff08;zxqs&#xff09;值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段&#xff0c;单次执行请求&#xff0c;请求体里多个集合中的相同参数&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&#xff08;…...

机器学习入门之 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过程中&#xff0c;本机的内存等配置不足&#xff0c;启动较多的线程时&#xff0c;可以采用分布式运行。 在分布式运行的时候&#xff0c;jmeter会自动将脚本从master主机发送到remote主机上&#xff0c;所以不需要考虑将脚本拷贝到remote主机。但是jmeter…...

《OWASP代码审计》学习——注入漏洞审计

一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令&#xff0c;以修改其行为。这些类型的攻击是常见且广泛的&#xff0c;黑客很容易测试网站是否易受攻击&#xff0c;攻击者也很容易利用这些攻击。如今&#xff0c;它们在尚未更新的遗留应用程序中非常常见…...

Linux虚拟机中安装MySQL5.6.34

目录 第一章、xshell工具和xftp的使用1.1&#xff09;xshell下载与安装1.2&#xff09;xshell连接1.3&#xff09;xftp下载安装和连接 第二章、安装MySQL5.6.34&#xff08;不同版本安装方式不同)2.1&#xff09;关闭防火墙&#xff0c;传输MySQL压缩包到Linux虚拟机2.2&#x…...

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时&#xff0c;对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…...

电子电路中的“心脏”:电源谎

前言 Kubernetes 本身并不复杂&#xff0c;是我们把它搞复杂的。无论是刻意为之还是那种虽然出于好意却将优雅的原语堆砌成 鲁布戈德堡机械 的狂热。平台最初提供的 ReplicaSets、Services、ConfigMaps&#xff0c;这些基础组件简单直接&#xff0c;甚至显得有些枯燥。但后来我…...

ccmusic-database效果展示:麦克风实时录音→30秒截取→5类预测全链路演示

ccmusic-database效果展示&#xff1a;麦克风实时录音→30秒截取→5类预测全链路演示 1. 引言&#xff1a;当AI成为你的私人音乐DJ 想象一下这样的场景&#xff1a;你刚用手机录了一段朋友弹吉他的即兴片段&#xff0c;或者一段街头艺人的表演。你很好奇&#xff0c;这属于什…...

卡希诺水溶肥怎么样好用吗?深度实测与农户口碑

在水溶肥市场中&#xff0c;卡希诺凭借 “智能肥” 定位脱颖而出&#xff0c;成为不少种植户的选择。这款肥料到底好不好用&#xff1f;从成分、效果、实用性等维度综合来看&#xff0c;卡希诺水溶肥是一款高效、全能、适配性强的优质肥料&#xff0c;能切实解决种植中的多种痛…...

如何5分钟搞定Windows PDF处理:Poppler-windows终极指南

如何5分钟搞定Windows PDF处理&#xff1a;Poppler-windows终极指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上的PDF文档…...

2025最权威的六大降重复率助手实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于深度学习跟自然语言处理技术的学术原创性检测系统&#xff0c;被称作AI论文查重&#xf…...

哥本哈士奇(aspnetx)固

简介 langchain中提供的chain链组件&#xff0c;能够帮助我门快速的实现各个组件的流水线式的调用&#xff0c;和模型的问答 Chain链的组成 根据查阅的资料&#xff0c;langchain的chain链结构如下&#xff1a; $$Input \rightarrow Prompt \rightarrow Model \rightarrow …...

从零到一:手把手教你用Labelme打造专属Mask数据集

1. 为什么你需要掌握Labelme标注工具 如果你正在做计算机视觉相关的项目&#xff0c;尤其是图像分割任务&#xff0c;那么高质量的数据集就是你的命根子。市面上现成的数据集往往无法完全匹配你的业务需求&#xff0c;这时候自己动手标注数据就成了必经之路。我刚开始接触图像分…...

C++逆向解析通达信shm.tnf文件:从模糊格式到精准读取股票数据的实战

1. 初识通达信shm.tnf文件 第一次接触通达信的shm.tnf文件是在开发一个股票数据分析工具的时候。当时我需要获取沪市所有股票的代码和名称信息&#xff0c;但发现通达信并没有提供官方的文件格式说明。这个文件就像是一个黑盒子&#xff0c;里面装满了股票数据&#xff0c;却没…...

上班族也能用的PTrade量化策略:沪深300增强版保姆级配置指南

上班族量化投资实战&#xff1a;PTrade沪深300增强策略全流程配置手册 每天早上9点挤地铁时刷财经新闻&#xff0c;总能看到沪深300指数又创新高的消息&#xff0c;心里盘算着"要是早点入场就好了"。但作为朝九晚六的上班族&#xff0c;既没时间盯盘&#xff0c;又怕…...

从崩溃地址到问题源码:手把手教你用map文件逆向分析嵌入式程序死机原因

从崩溃地址到问题源码&#xff1a;嵌入式程序死机逆向分析实战指南 1. 嵌入式崩溃分析的核心价值与挑战 当嵌入式设备在现场运行中出现死机时&#xff0c;传统的调试器往往无法直接连接使用。此时&#xff0c;map文件与崩溃地址分析成为工程师最后的救命稻草。这种离线分析方法…...