简介
在CMakeLists.txt文件中,file函数用于执行与文件和目录相关的操作。它是CMake语言中的一个内置函数,可以用于处理文件和目录。
file函数可以执行以下操作:
- 文件操作:通过file(READ …), file(WRITE …), file(APPEND …)等命令,可以读取、写入或追加文件的内容。
- 复制、移动和删除文件:通过file(COPY …), file(RENAME …), file(REMOVE …)等命令,可以复制、移动或删除文件。
- 目录操作:通过file(MAKE_DIRECTORY …), file(REMOVE_DIRECTORY …)等命令,可以创建或删除目录。
- 文件属性:通过file(GLOB …), file(GLOB_RECURSE …), file(STRINGS …)等命令,可以获取文件列表、递归地搜索文件、读取文件中的字符串等。
- 文件权限:通过file(CHMOD …), file(INSTALL …), file(DOWNLOAD …)等命令,可以设置文件的权限、安装文件到指定位置、下载文件等
一种常用方式,文件列表的获取
file(GLOB …):
这个命令用于在指定目录中进行文件匹配。它会匹配指定模式的所有文件,并将它们存储在指定的变量中。它只会在指定目录中进行搜索,不会递归地搜索子目录。
//匹配当前目录下所有的.cpp文件,并将它们存储在SOURCE_FILES变量中
file(GLOB SOURCE_FILES *.cpp)
file(GLOB_RECURSE …):
这个命令用于递归地搜索指定目录及其子目录中的文件。它会匹配指定模式的所有文件,并将它们存储在指定的变量中。它会在整个目录树中搜索文件,包括子目录和子目录的子目录。
//递归地搜索当前目录及其子目录中的所有.cpp文件,并将它们存储在SOURCE_FILES变量中
file(GLOB_RECURSE SOURCE_FILES *.cpp)
搜索路径的指定
相对路径:如果你想相对于CMakeLists.txt文件所在的目录进行搜索,可以直接在模式中使用相对路径。例如,如果要在CMakeLists.txt所在路径下的src目录下搜索文件,可以使用以下语句:
file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS
src/*.cpp
src/*.h
src/*.ui
src/*.glsl
src/*.qrc
src/*.pdf
src/*.ts
)
绝对路径:如果你想指定一个绝对路径作为搜索目录,可以直接在模式中使用绝对路径。例如,如果要搜索/path/to/directory目录下的文件,可以使用以下语句:
file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS
/path/to/directory/*.cpp
/path/to/directory/*.h
/path/to/directory/*.ui
/path/to/directory/*.glsl
/path/to/directory/*.qrc
/path/to/directory/*.pdf
/path/to/directory/*.ts
)
一个示例
可以搜索CMAKE_CURRENT_SOURCE_DIR路径下的所有文件,并按照原有文件的目录名称进行结构组合。
# 设置源文件在项目中的显示路径
function(retrieve_files dirname)
file(GLOB_RECURSE files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
"${dirname}/*.cpp"
"${dirname}/*.h"
"${dirname}/*.ui"
"${dirname}/*.glsl"
"${dirname}/*.qrc"
"${dirname}/*.pdf"
"${dirname}/*.ts"
)
foreach(filename ${files})
list(APPEND source_list "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
set(file_abs_path "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
get_filename_component(source_path "${filename}" PATH)
string(REPLACE "/" "\\" filter_dir "${source_path}")
source_group("${filter_dir}" FILES "${filename}")
endforeach()
endfunction()
retrieve_files("${CMAKE_CURRENT_SOURCE_DIR}")