cmake_file(GLOB)详解

文章目录

  • [第二章 CMake基础语法](#第二章 CMake基础语法)
    • [2.9 file()](#2.9 file())
      • [2.9.1 file子命令](#2.9.1 file子命令)
      • [2.9.2 GLOB/GLOB_RECURSE子命令的使用](#2.9.2 GLOB/GLOB_RECURSE子命令的使用)
      • [2.9.3 写文件 (WRITE / APPEND)](#2.9.3 写文件 (WRITE / APPEND))
      • 2.9.4读文件 (READ / STRINGS)
      • [2.9.5 复制/重命名/删除(COPY/RENAME/REMOVE)](#2.9.5 复制/重命名/删除(COPY/RENAME/REMOVE))
      • [2.9.6 file部分完整测试代码](#2.9.6 file部分完整测试代码)

本文介绍cmake的file()文件操作函数,该函数功能强大,可以读文件,写文件,复制,删除,重命名等操作。

第二章 CMake基础语法

2.9 file()

file() 是 CMake 中功能最强大的命令之一,用于执行各种文件系统操作(读写、搜索、复制等)。

2.9.1 file子命令

使用file(GLOB|GLOB RECURSE )命令匹配文件列表;

子命令:

bash 复制代码
GLOB I GLOB_RECURSE : 生成与匹配的文件列表。GLOB 不搜索子目录;GLOB_RECURSE 会递归搜索子目录;
WRITE 写入内容到文件中
MAKE DIRECTORY 创建给定的目录及其父目录。
REMOVE 删除给定的文件
COPY_FILE 复制文件
RELATIVE_PATH 计算相对路径。

2.9.2 GLOB/GLOB_RECURSE子命令的使用

使用GLOB/GLOB_RECURSE 来代替aux_source_directory 搜索目录下的文件。aux_source_directory只是搜索指定目录下的源文件;而FILE(GLOB)可以通过通配符搜索目录下的所有文件。

GLOB: 搜索当前目录符合模式的文件。

GLOB_RECURSE: 递归搜索子目录。

语法格式如下:

bash 复制代码
file(GLOB <variable> 
     [LIST_DIRECTORIES true|false] 
     [RELATIVE <path>] 
     [CONFIGURE_DEPENDS] 
     <globbing-expressions>...)
复制代码
参数说明:

参数1:: 存储搜索结果的变量名。

参数2:LIST_DIRECTORIES true\|false:是否在结果列表中包含目录。默认为 true。如果只想获取文件,可以设置为 false。

参数3:RELATIVE : 让返回的文件路径相对于指定的 ,而不是绝对路径。${CMAKE_CURRENT_SOURCE_DIR} 作为相对基准。
参数4:CONFIGURE_DEPENDS (重要:CMake 3.12+):解决 GLOB 不会自动更新的问题。
如果加上这个参数,CMake 会在构建时检查目录内容。如果增加了新文件,构建系统会自动重新运行 CMake 来更新文件列表。
示例:

bash 复制代码
file(GLOB SOURCES CONFIGURE_DEPENDS "*.cpp")

FOLLOW_SYMLINKS (仅限 GLOB_RECURSE):

是否递归进入符号链接指向的目录。

参数5::匹配模式,可以写多个。
.cpp:匹配所有 C++ 源文件。
src/
.h:匹配 src 目录下所有头文件。

test?.cpp:匹配 test1.cpp, test2.cpp 等(? 匹配单个字符)。

代码文件结构:

bash 复制代码
cmake_minimum_required(VERSION 3.30)

project (testfile VERSION 1.0 LANGUAGES CXX)

# GLOB 
file(GLOB SOURCES "*.cpp")
message("SOURCES = ${SOURCES}")
# SOURCES = E:/cmakeLearning/chap2/5file/main.cpp;
# E:/cmakeLearning/chap2/5file/mycul.cpp
# 可以看出,搜索到了两个.cpp文件。

# GLOB_RECURSE
# file(GLOB_RECURSE ALL_SOURCES  RELATIVE "./build" "*.cpp")
file(GLOB_RECURSE ALL_SOURCES 
     RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
      CONFIGURE_DEPENDS
    "*.cpp"
)
message("ALL_SOURCES = ${ALL_SOURCES}")
#[[
ALL_SOURCES = a/a.cpp;
build/CMakeFiles/4.2.1/CompilerIdCXX/CMakeCXXCompilerId.cpp;
main.cpp;
mycul.cpp
]]
# 可以发现,递归搜索出了目录下面的所有.cpp文件

add_executable(testfile ${SOURCES})

2.9.3 写文件 (WRITE / APPEND)

WRITE: 写入内容(覆盖原文件)。

APPEND: 在末尾追加内容。

bash 复制代码
message("###############################")
file(WRITE "version.txt" "hello cmake")

#追加
file(APPEND "version.txt" "\nhello APPEND")

WRITE测试结果:会在当前目录下面生成一个version.txt文件,并在该文件中插入 hello cmake字符串。

APPEND测试结果:会在version.txt文件中,添加 hello APPEND字符串,结果如下:

2.9.4读文件 (READ / STRINGS)

READ: 读取整个文件内容。

STRINGS: 按行读取,适合处理配置文件。

下面分别测试

bash 复制代码
# 读文件
file(READ "version.txt" CONTENTS)
message("CONTENTS = ${CONTENTS}")
#[[
CONTENTS = hello cmake
hello APPEND
]]

# 按行读
file (STRINGS "version.txt" lines)
message("line = ${lines}")
# line = hello cmake;hello APPEND

2.9.5 复制/重命名/删除(COPY/RENAME/REMOVE)

拷贝测试:拷贝一份version.txt 到指定的目录下。

bash 复制代码
# 拷贝一份
file(COPY "version.txt" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt")

重命名测试:

bash 复制代码
# 重命名:将 a/version.txt 重命名为 a/version2.txt
file(RENAME "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt" "${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

输出文件测试:删除指定的文件

bash 复制代码
# 删除文件或目录
file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

2.9.6 file部分完整测试代码

bash 复制代码
cmake_minimum_required(VERSION 3.30)

project (testfile VERSION 1.0 LANGUAGES CXX)

# GLOB 
file(GLOB SOURCES "*.cpp")
message("SOURCES = ${SOURCES}")
# SOURCES = E:/cmakeLearning/chap2/5file/main.cpp;
# E:/cmakeLearning/chap2/5file/mycul.cpp
# 可以看出,搜索到了两个.cpp文件。

# GLOB_RECURSE
# file(GLOB_RECURSE ALL_SOURCES  RELATIVE "./build" "*.cpp")
file(GLOB_RECURSE ALL_SOURCES 
     RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
      CONFIGURE_DEPENDS
    "*.cpp"
)
message("ALL_SOURCES = ${ALL_SOURCES}")
#[[
ALL_SOURCES = a/a.cpp;
build/CMakeFiles/4.2.1/CompilerIdCXX/CMakeCXXCompilerId.cpp;
main.cpp;
mycul.cpp
]]
# 可以发现,递归搜索出了目录下面的所有.cpp文件

message("###############################")
file(WRITE "version.txt" "hello cmake")

#追加
file(APPEND "version.txt" "\nhello APPEND")

# 读文件
file(READ "version.txt" CONTENTS)
message("CONTENTS = ${CONTENTS}")
#[[
CONTENTS = hello cmake
hello APPEND
]]

# 按行读
file (STRINGS "version.txt" lines)
message("line = ${lines}")
# line = hello cmake;hello APPEND

# 拷贝一份
#file(COPY "version.txt" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt")

# 重命名:将 a/version.txt 重命名为 a/version2.txt
# file(RENAME "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt" "${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

# 删除文件或目录
file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

add_executable(testfile ${SOURCES})
相关推荐
Javenwww14 小时前
CMake入门——基本语法规则
cmake
郝学胜-神的一滴3 天前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
橙色阳光五月天10 天前
CMake 构建配置文件解析
c++·cmake·plugin
blueman888812 天前
Qt5通过vcpkg中调用时,在debug模式下调试时总是调用release的plugins文件夹中的dll
c++·qt·cmake
郝学胜-神的一滴19 天前
CMake 038:OBJECT目标复用编译+Linux动态库版本自动化管理
linux·c++·程序人生·软件工程·软件构建·cmake·工程配置
郝学胜_神的一滴21 天前
CMake 037:宏传递流转机制与C++编译特性跨平台适配指南
c++·cmake
郝学胜_神的一滴24 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
郝学胜_神的一滴1 个月前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
郝学胜_神的一滴1 个月前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
郝学胜_神的一滴1 个月前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake