深入理解 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
的项。- 这通常用于移除在某个平台无法运行的测试用例,保证构建/测试的跨平台兼容性。