1,基础语法
CMakeLists.txt 目录组织文件;
*.cmake 脚本文件
运行:
$ cmake -P xxx.cmake
*.cmake 模块文件
include 命令来引用 模块文件。
自定义模块;
cmake 预制模块;
单行注释
# com
括号注释
#[[
.... ]]
#[==[
.... ]==]
程序构成
cmake 程序由命令调用构成;
控制结构也是命令;
变量:
分类:
普通变量,${var}
缓存变量,$CACHE{var} ${var}
环境变量,$ENV{var}
赋值兼定义:
set(var XXXXX)
使用:
${var}
可嵌套
2, POLICY
if(POLICY CMP0068)
cmake_policy(SET CMP0068 NEW)
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
endif()
功能:控制 macOS 动态库的 INSTALL_NAME_DIR 行为。
NEW 行为:在构建时(BUILD)使用 INSTALL_NAME_DIR 设置动态库的 @rpath 或安装路径,而不是默认的构建目录。
相关变量:CMAKE_BUILD_WITH_INSTALL_NAME_DIR(设置为 ON 时,构建时也使用安装路径)。
用途:确保 macOS 动态库在构建时就能正确解析依赖路径,而不需要等到安装后。
if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()
功能:控制 find_package() 如何处理 CMAKE_FIND_PACKAGE_REDIRECTS_DIR。
NEW 行为:允许 find_package() 优先检查 CMAKE_FIND_PACKAGE_REDIRECTS_DIR 目录下的包配置文件。
用途:用于自定义包查找逻辑,例如在特定目录下覆盖默认的包查找行为。
if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW)
endif()
功能:控制 option() 命令如何处理变量的预定义值。
NEW 行为:如果 option() 的变量已经通过 set(... CACHE ...) 定义,则 option() 不会覆盖它。
用途:避免 option() 意外覆盖已经定义的缓存变量。
if(POLICY CMP0057)
cmake_policy(SET CMP0057 NEW)
endif()
功能:控制 if() 命令如何处理 IN_LIST 操作符。
NEW 行为:if(var IN_LIST list_var) 可以正确检查变量是否在列表中。
用途:使 IN_LIST 语法更加可靠,避免旧版本中的潜在问题。
if(POLICY CMP0074)
cmake_policy(SET CMP0074 NEW)
endif()
功能:控制 find_package() 如何处理 <PackageName>_ROOT 变量。
NEW 行为:<PackageName>_ROOT 变量会影响 find_package() 的搜索路径。
用途:允许用户通过 <PackageName>_ROOT 指定包的根目录,类似于 CMAKE_PREFIX_PATH。
if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
endif()
功能:控制 file(GENERATE) 命令如何处理相对路径。
NEW 行为:file(GENERATE) 输出的相对路径相对于当前 CMakeLists.txt 所在目录。
用途:使 file(GENERATE) 的行为更符合预期,避免路径解析问题。
if(POLICY CMP0116)
cmake_policy(SET CMP0116 OLD)
endif()
功能:控制 FetchContent 是否在配置阶段(configure-time)填充内容。
OLD 行为:FetchContent 在配置阶段填充内容(旧行为)。
NEW 行为:FetchContent 默认在构建阶段(build-time)填充内容(CMake 3.24+ 默认)。
用途:这里显式选择 OLD 行为,可能是为了兼容某些依赖配置阶段下载的逻辑。
3,get_filename_component
get_filename_component 是 CMake 中的一个命令,用于从文件路径中提取特定组成部分。它可以获取路径中的目录名、文件名、扩展名或文件名不带扩展名等部分。get_filename_component 是 CMake 中处理文件路径时非常有用的工具命令。
基本语法
get_filename_component(<VAR> <FileName> <COMP> [CACHE])
<VAR>: 存储结果的变量名
<FileName>: 要处理的文件路径
<COMP>: 指定要提取的部分,可以是以下之一:
DIRECTORY: 目录部分
NAME: 文件名部分(带扩展名)
EXT: 文件扩展名(带点)
NAME_WE: 文件名不带扩展名
LAST_EXT: 最后一个扩展名(对于类似 file.tar.gz 的文件)
NAME_WLE: 文件名不带最后一个扩展名
ABSOLUTE: 完整绝对路径
REALPATH: 解析所有符号链接后的绝对路径
使用示例
# 获取当前目录
get_filename_component(MY_DIR "path/to/file.txt" DIRECTORY)
# MY_DIR 将包含 "path/to"
# 获取文件名
get_filename_component(MY_NAME "path/to/file.txt" NAME)
# MY_NAME 将包含 "file.txt"
# 获取不带扩展名的文件名
get_filename_component(MY_NAME_WE "path/to/file.txt" NAME_WE)
# MY_NAME_WE 将包含 "file"
# 获取扩展名
get_filename_component(MY_EXT "path/to/file.txt" EXT)
# MY_EXT 将包含 ".txt"
# 获取绝对路径
get_filename_component(MY_ABS_PATH "path/to/file.txt" ABSOLUTE)
# MY_ABS_PATH 将包含完整绝对路径
实际应用场景
这个命令常用于:
处理用户输入的文件路径
从完整路径中提取特定部分用于后续操作
确保路径格式正确
解析符号链接获取真实路径