列出文件

  1. cmake file命令详解
  2. cmake file官方文档 ```
    列出文件

    递归文件

    file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]…)

    非递归文件(当前目录下的文件)

    file(GLOB Sources *.cpp)

示例

file (GLOB Sources .cpp) file (GLOB Headers .h) file (GLOB Resources .qrc) file (GLOB UIs .ui)

  1. <a name="WpH4h"></a>
  2. ## 获取文件名、目录等信息
  3. <a name="LDgln"></a>
  4. ### get_filename_component
  5. 1. [CMake中文文档](https://runebook.dev/zh-CN/docs/cmake/command/get_filename_component)

get_filename_component( [CACHE])

  1. mode选项

DIRECTORY = Directory without file name NAME = File name without directory EXT = File name longest extension (.b.c from d/a.b.c) NAME_WE = File name with neither the directory nor the longest extension LAST_EXT = File name last extension (.c from d/a.b.c) NAME_WLE = File name with neither the directory nor the last extension PATH = Legacy alias for DIRECTORY (use for CMake <= 2.8.11)

  1. 例子:

E:/cpp/glal.core.dll

get_filename_component(dependlib_name ${dependlib_path} NAME_WE)

glal

get_filename_component(dependlib_name ${dependlib_path} NAME_WLE)

glal.core

  1. ```shell
  2. get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../" ABSOLUTE)
  3. # 当前路径,往前走一个目录

正则表达式

get_filenames_component虽然方便,但如果你不得不使用旧版CMake的时候,可使用正则表达式

  1. set(fp "E:/cpp/cmake_study/9command/file/glal.core.h")
  2. #E:/cpp/cmake_study/9command/file/glal.core.h
  3. STRING(REGEX REPLACE "(.+)/.+" "\\1" DIR ${fp})
  4. #E:/cpp/cmake_study/9command/file
  5. string(REGEX REPLACE "\\.[^.]*$" "" MYFILE_WITHOUT_EXT ${fp})
  6. #E:/cpp/cmake_study/9command/file/glal.core
  7. STRING(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${fp})
  8. # glal.core
  9. STRING(REGEX REPLACE ".+/(.+)" "\\1" FILE_NAME_WITH_EXT ${fp})
  10. # glal.core.h

拷贝

  1. # 拷贝文件到exe所在的目录
  2. # 1 拷贝文件夹里的文件
  3. file(COPY ${OPENCV_DLL_DIR}/ DESTINATION ${EXECUTABLE_OUTPUT_PATH})
  4. # 2 拷贝bin文件
  5. file(COPY ${OPENCV_DLL_DIR} DESTINATION ${EXECUTABLE_OUTPUT_PATH})

我们经常会遇到

  • 将第三方库文件复制到项目运行时文件夹
  • 或者将子项目生成的库文件复制到项目运行时文件夹的情况

file copy

文件、目录和符号链接 复制到 目标文件夹

  • 输入路径:相对于当前源目录的相对路径
  • 输出目录:相对于当前构建目录的相对路径
  • 复制会保留输入文件的时间戳,并优化文件(如果该文件存在具有相同时间戳的目标文件中)
  • 复制将保留输入权限,除非给出明确的权限或NO_SOURCE_PERMISSIONS(默认为USE_SOURCE_PERMISSIONS
    1. file(<COPY|INSTALL> <files>... DESTINATION <dir>
    2. [FILE_PERMISSIONS <permissions>...]
    3. [DIRECTORY_PERMISSIONS <permissions>...]
    4. [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
    5. [FOLLOW_SYMLINK_CHAIN]
    6. [FILES_MATCHING]
    7. [[PATTERN <pattern> | REGEX <regex>]
    8. [EXCLUDE] [PERMISSIONS <permissions>...]] [...])

至于其他选项,请参考install (DIRECTORY)命令。即使使用后面的可选项,来选择文件的子集,复制目录也会保留其内容的结构。

INSTALL与COPY略有不同:它打印状态消息(取决于CMAKE_INSTALL_MESSAGE变量),并且默认为NO_SOURCE_PERMISSIONSinstall命令生成的安装脚本使用此签名(以及一些未记录的内部使用选项)。

符号链接

关于符号链接

  • 如果指定了FOLLOW_SYMLINK_CHAIN,则copy将在给定路径上递归解析符号链接,直到找到真实文件为止,然后在目标位置为遇到的每个符号链接安装相应的符号链接
  • 对于已安装的每个符号链接,解析都会从目录中剥离,仅保留文件名,这意味着新符号链接指向与符号链接相同目录中的文件

此功能在某些Unix系统上很有用,在这些系统中,库是作为带有符号链接的版本号安装的,而较少特定的版本指向的是特定版本。FOLLOW_SYMLINK_CHAIN会将所有这些符号链接和库本身安装到目标目录中

例如,如果您具有以下的目录结构

  • /opt/foo/lib/libfoo.so.1.2.3
  • /opt/foo/lib/libfoo.so.1.2 -> libfoo.so.1.2.3
  • /opt/foo/lib/libfoo.so.1 -> libfoo.so.1.2
  • /opt/foo/lib/libfoo.so -> libfoo.so.1

file(COPY /opt/foo/lib/libfoo.so DESTINATION lib FOLLOW_SYMLINK_CHAIN)
这会将所有符号链接和libfoo.so.1.2.3本身安装到lib中

符号链接

符号链接(软链接)是一类特殊的文件,其包含一条以绝对路径(或相对路径)的形式指向其他文件或者目录的引用。

符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作

  • 某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作

特点

  • 一个符号链接文件仅包含有一个文本字符串,其被操作系统解释为一条指向另一个文件或者目录的路径
  • 它是一个独立文件,其存在并不依赖于目标文件
  • 如果删除一个符号链接,它指向的目标文件不受影响
  • 如果目标文件被移动、重命名或者删除,任何指向它的符号链接仍然存在,但是它们将会指向一个不复存在的文件。这种情况被有时被称为被遗弃

相关链接

  1. CMake 复制文件方法