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

深入理解 CMake 脚本片段:文件查找、字符串替换与条件处理

在 C++ 项目构建过程中,CMake 已成为业界主流的构建系统工具。通过编写 CMakeLists.txt 文件,开发者可以灵活地管理项目的源代码、依赖库、编译选项等。本文将深入分析一段实际的 CMake 脚本,帮助大家理解其背后的用法与原理。

一、查找符合模式的文件:file(GLOB ...)

file(GLOB TEST_OPSRELATIVE "${CMAKE_CURRENT_SOURCE_DIR}""test_*.py")

解析

  • file(GLOB ...) 用于根据指定的模式查找文件,并将结果存入指定变量(这里是 TEST_OPS)。
  • RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" 表示返回的路径是相对于当前源代码目录的相对路径。
  • "test_*.py" 是匹配模式,表示查找所有以 test_ 开头、以 .py 结尾的 Python 文件。

用途:动态收集测试脚本或源文件,免去手动维护列表的麻烦。

二、字符串批量替换:string(REPLACE ...)

string(REPLACE ".py" "" TEST_OPS "${TEST_OPS}")

解析

  • string(REPLACE ...) 用于将变量(或列表)中的指定字符串批量替换成另一个字符串。
  • 这里将 TEST_OPS 变量中所有的 .py 后缀去掉。例如:test_foo.py 变成 test_foo

用途:获得不带扩展名的文件基名,便于后续作为测试用例名或命令参数。

三、环境变量列表定义:set(...)

set(SOT_ENVS SOT_LOG_LEVEL=0 MIN_GRAPH_SIZE=0 STRICT_MODE=FalseSOT_ENABLE_STRICT_GUARD_CHECK=True)

解析

  • set(...) 用于定义一个 CMake 变量,这里是定义环境变量列表 SOT_ENVS
  • 这些变量通常会传递给测试脚本或程序,控制其行为(如日志级别、严格模式等)。

四、平台相关的条件处理:if(WIN32) ... endif()

if(WIN32)list(REMOVE_ITEM TEST_OPS test_for_enumerate)
endif()

解析

  • if(WIN32) 判断当前操作系统是否为 Windows。
  • list(REMOVE_ITEM ...) 从列表 TEST_OPS 中移除名为 test_for_enumerate 的项。
  • 这通常用于移除在某个平台无法运行的测试用例,保证构建/测试的跨平台兼容性。

文章转载自:

http://gLAzwHKc.pmftz.cn
http://zP8jPFVR.pmftz.cn
http://eFB37ZQH.pmftz.cn
http://2xvhcysa.pmftz.cn
http://u2Hn4vZZ.pmftz.cn
http://CM3NJqyp.pmftz.cn
http://PEAMr8EH.pmftz.cn
http://fuGudPEE.pmftz.cn
http://p7RsjAbD.pmftz.cn
http://6ytvBbI9.pmftz.cn
http://cq5R34qe.pmftz.cn
http://AFX2bH0O.pmftz.cn
http://XnUbQIRC.pmftz.cn
http://9QOlXguU.pmftz.cn
http://qPTv6fk2.pmftz.cn
http://s8nm6u91.pmftz.cn
http://nTSjHyxe.pmftz.cn
http://RE3OZ8L5.pmftz.cn
http://eoiWi0Q4.pmftz.cn
http://VnSkxmpo.pmftz.cn
http://KoiIASaa.pmftz.cn
http://XilPslV2.pmftz.cn
http://hSZSX6TC.pmftz.cn
http://YARWQV5i.pmftz.cn
http://AustNq5b.pmftz.cn
http://QsxfTlDL.pmftz.cn
http://7hxxq3Sr.pmftz.cn
http://Xk1VbX4Y.pmftz.cn
http://kD3Rtf2W.pmftz.cn
http://HMTMTmhj.pmftz.cn
http://www.dtcms.com/a/378924.html

相关文章:

  • Google Ads广告验证全攻略:如何借助动态住宅IP精准投放?
  • Linux防火墙配置指南:限制特定IP访问并允许其他所有流量
  • 使用动态IP 需要注意什么
  • 2025年- H128-Lc205. 同构字符串(哈希表)--Java版
  • 今天我们开始学习iptables防火墙
  • Android逆向学习(十一) IDA动态调试Android so文件
  • 第二篇:排序算法的简单认识【数据结构入门】
  • 嵌入式铁头山羊stm32:一文总结
  • HDFS(Hadoop 分布式文件系统)知识点梳理
  • AI幻觉的罪魁祸首
  • JVM 基础
  • 计算智能的概念和其算法的主要算法类型
  • leetcode25(有效的字母异位词)
  • [Windows] FileOptimizer v17.1.0_一款文件批量压缩工具
  • 淘宝/天猫按图搜索(拍立淘)item_search_img API接口实战指南
  • Java优选算法——二分查找
  • leetcode380:RandomizedSet - O(1)时间插入删除和获取随机元素(数组+哈希表的巧妙结合)
  • 经典蓝牙的 BR(Basic Rate(基础速率))
  • 牛客周赛 Round 108题解
  • Rocky9.0去堆叠双发arp(支持“ARP 广播双发”)
  • 「京墨」1.15.0 诗词、成语、对联、句子、诗歌…
  • AWS TechFest 2025: 风险模型的转变、流程设计的转型、生成式 AI 从实验走向实施的三大关键要素、评估生成式 AI 用例的适配度
  • 【Blender】二次元人物制作【二】:五官的制作
  • MinIO集群部署详细步骤(高性能的分布式对象存储系统)
  • 带地图的 RAG:多模态 + 地理空间 在 Elasticsearch 中
  • 使用 Spring AI Alibaba Graph 实现工作流
  • 【Debug日志 | DDP 下 BatchNorm 统计失真】
  • linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)
  • 综合文化信息管理系统|基于java和小程序的综合文化信息管理系统设计与实现(源码+数据库+文档)
  • 20250911_10.1.11.46车辆定位aidata-01_Apache Doris分布式数据库全量备份(本地+异地)Python脚本