CMakeList: file()的文件搜索功能

简介

在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}")
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值