CMake 学习笔记 (Generator Expressions)

2023-11-01

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(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
          $<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
)
target_include_directories(myapp
  PRIVATE $<$<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(myapp
  PRIVATE $<$<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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake 学习笔记 (Generator Expressions) 的相关文章

随机推荐

  • Excel VBA宏

    一 宏与VBA 什么是宏与VBA VBA Visual Basic for Applications 是 Visual Basic https baike baidu com item Visual Basic 的一种宏语言 是在其桌面应用
  • Spring Boot中JSON的数据结构和交互讲解以及实战(超详细 附源码)

    Spring MVC在数据绑定的过程中 需要对传递数据的格式和类型进行转换 它既可以转换String登类型的数据 也可以转换JSON等其他类型的数据 JSON数据结构 JSON JavaScript Object Notation JS对象
  • 吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程

    Chisel项目构建 运行和测试 二 Chisel中生成Verilog代码 Chisel开发流程 上一篇文章我们提到了怎么用sbt构建Chisel项目并运行Chisel代码 但是毕竟还是在电脑上运行的 而在实践中 我们写的Chisel代码最
  • 51nod-1101 换零钱

    时间限制 1 秒 空间限制 65536 KB 分值 20 N元钱换为零钱 有多少不同的换法 币值包括1 2 5分 1 2 5角 1 2 5 10 20 50 100元 例如 5分钱换为零钱 有以下4种换法 1 5个1分 2 1个2分3个1分
  • FreeRTOS 临界段和开关中断

    以下转载自安富莱电子 http forum armfly com forum php 临界段代码的临界段也称为临界区 一旦这部分代码开始执行 则不允许任何中断打断 为确保临界段代码的执行不被中断 在进入临界段之前须关中断 而临界段代码执行完
  • AIGC来了,品牌方开始要求降价|AI重塑未来营销

    AIGC正在重塑营销领域 为品牌带来新的解决方案 营销可能是最早与AIGC结合并产生实际落地效果的领域之一 然而 需要注意AI工具的局限性和过度精准投放的影响 个性化的营销内容重要 但难以塑造国民级品牌 在AI时代 品牌需要找到自己的最大公
  • pycharm安装教程(安装必看)

    文章目录 软件简介 一 pycharm下载 二 安装 三 使用pycharm 软件简介 PyCharm是一种Python IDE Integrated Development Environment 集成开发环境 带有一整套可以帮助用户在使
  • fstat函数及struct stat结构

    转载地址 点击打开链接 一 fstat 函数 功能 由文件描述符取得文件状态 相关函数 stat lstat chmod chown readlink utime 头文件 include
  • Kettle_js脚本_示例

    Kettle 版本7 0 一 String function 1 date2str js操作时间 var dValue new Date 把时间变成字符串 var dValue1 date2str dValue 把时间变成当前格式字符串 v
  • java-统计一段句子中各单词出现的次数

    问题 统计一段句子中各单词出现的次数 思路 1 使用split方法将文章进行分割 我们这里以空格 逗号和句点为分隔符 然后存到一个字符串数组中 2 创建一个hashMap集合 key是字符串类型 保存单词 value是数字类型 保存该单词出
  • ROS编程Raspberry Pi机器人模型

    使用机器人操作系统 ROS 基础设施将物理机器人连接到机器人模拟是 ROS 工程师面临的最常见挑战之一 您将学习如何在虚拟环境中模拟机器人 并在等效的真实世界场景中实现所需的行为 首先介绍了 Raspberry Pi机器人模型及其配备的传感
  • 新一代免费开源大型企业数智制造解决方案

    国家加速推进信创产业的开源自主可控 信创产业 即信息技术应用创新产业 其包含了从信息化基础设施到底层系统 再到上层的应用软件 与信息化建设过程中涉及有关的全产业链都必须安全与可控 信创产业涉及到的领域包括信息化基础设施 如CPU 服务器 存
  • Axure RP软件安装包分享(附安装教程)

    目录 一 软件简介 二 软件下载 一 软件简介 Axure RP是一款专业的原型设计工具 它能够帮助用户创建高保真度的交互式原型 Axure RP具有以下特点 强大的交互设计功能 Axure RP提供了丰富的交互设计工具 用户可以通过拖拽和
  • Linux-僵尸进程产生与处理

    目录 背景 产生 处理方法 方法一 父进程通过wait或者wait pid方式回收子进程 方法二 信号处理signal 改进版 背景 父进程创建子进程之后 父进程没有等待该子进程的退出 子进程就会成为僵尸进程 如果父进程也退出 这个时候子进
  • F28027第八课---ADC操作解读

    已经有三天没有写了 心里真过意不过 但最近确实真的太忙了 大家见谅 前面那几节课 我们基本上把F28027自身的特性了解了一下 从这节课开始 我们将要学习它的外设 我的目标是周末这两天 要把ADC 温度 比较器 ePWM SPI都了解完 并
  • Bode Plots by Hand 徒手绘制波特图

    https blog csdn net u011368821 article details 26759659
  • USDT/DAPP授权原理/USDT接口实现

    一 安装需求 AAA com bbb com ccc com 需要三个域名 1 安装环境 a 服务器 centos7以上 软件商店 b nginx1 2以上 c php7 3版本 c1 安装php扩展 redis和gmp c2 删除所有ph
  • 接单日记(二)SMTP发送邮件

    文章目录 接单日记 二 SMTP发送邮件 一 实验目的 二 实验内容 三 程序及结果 1 运行程序 2 运行结果 接单日记 二 SMTP发送邮件 此为一个实验报告 故遵守实验报告的格式 一 实验目的 熟悉SMTP发送邮件的原理 使用SMTP
  • Docker基础修炼2--Docker镜像原理及常用命令

    通过前文的讲解对Docker有了基本认识之后 我们开始进入实战操作 本文先演示Docker三要素之镜像原理和相关命令 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境 如果你本地没有搭建Docker环境 也可以直接使用前文提
  • CMake 学习笔记 (Generator Expressions)

    CMake 学习笔记 Generator Expressions Generator Expressions 可以认为是一种特殊的变量 它会在编译阶段求值 通常用在 target link libraries target include