当前位置: 首页 > 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)
http://www.lryc.cn/news/108858.html

相关文章:

  • 提高测试用例质量的6大注意事项
  • 2023牛客暑期多校训练营6 A-Tree (kruskal重构树))
  • 软件测试—支付功能测试
  • 自动化测试的统筹规划
  • 外键字段的增删改查、多表查询(子查询和连表查询、正反向、聚合查询、 分组查询、 F与Q查询)、django中如何开启事务
  • 【学习笔记】生成式AI(ChatGPT原理,大型语言模型)
  • 【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作
  • Autosar诊断系列介绍20 - UDS应用层P2Server/P2Client等时间参数解析
  • 【iOS】json数据解析以及简单的网络数据请求
  • Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证
  • 45.ubuntu Linux系统安装教程
  • Jmeter函数助手(一)随机字符串(RandomString)
  • SpringCloud之微服务API网关Gateway介绍
  • 机器学习入门之 pandas
  • Django之JWT库与SimpleJWT库的使用
  • Jmeter远程服务模式运行时引用csv文件的路径配置
  • 《OWASP代码审计》学习——注入漏洞审计
  • Linux虚拟机中安装MySQL5.6.34
  • Django的FBV和CBV
  • [每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目
  • springboot-mybatis的增删改查
  • HTML5(H5)的前生今世
  • 抽象工厂模式(Abstract Factory)
  • Java 实现下载文件工具类
  • C# 12 预览版的新功能
  • 34.利用matlab解 多变量多目标规划问题(matlab程序)
  • 暑假刷题第18天--7/30
  • 通向架构师的道路之Apache整合Tomcat
  • 如何消除“信息孤岛”对业务增长的威胁?
  • Kali部署dvwa和pikachu靶场