列出文件
- cmake file命令详解
- 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)
<a name="WpH4h"></a>
## 获取文件名、目录等信息
<a name="LDgln"></a>
### get_filename_component
1. [CMake中文文档](https://runebook.dev/zh-CN/docs/cmake/command/get_filename_component)
get_filename_component(
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)
例子:
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
```shell
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../" ABSOLUTE)
# 当前路径,往前走一个目录
正则表达式
get_filenames_component虽然方便,但如果你不得不使用旧版CMake的时候,可使用正则表达式
set(fp "E:/cpp/cmake_study/9command/file/glal.core.h")
#E:/cpp/cmake_study/9command/file/glal.core.h
STRING(REGEX REPLACE "(.+)/.+" "\\1" DIR ${fp})
#E:/cpp/cmake_study/9command/file
string(REGEX REPLACE "\\.[^.]*$" "" MYFILE_WITHOUT_EXT ${fp})
#E:/cpp/cmake_study/9command/file/glal.core
STRING(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${fp})
# glal.core
STRING(REGEX REPLACE ".+/(.+)" "\\1" FILE_NAME_WITH_EXT ${fp})
# glal.core.h
拷贝
# 拷贝文件到exe所在的目录
# 1 拷贝文件夹里的文件
file(COPY ${OPENCV_DLL_DIR}/ DESTINATION ${EXECUTABLE_OUTPUT_PATH})
# 2 拷贝bin文件
file(COPY ${OPENCV_DLL_DIR} DESTINATION ${EXECUTABLE_OUTPUT_PATH})
我们经常会遇到
- 将第三方库文件复制到项目运行时文件夹
- 或者将子项目生成的库文件复制到项目运行时文件夹的情况
file copy
将 文件、目录和符号链接 复制到 目标文件夹
- 输入路径:相对于当前源目录的相对路径
- 输出目录:相对于当前构建目录的相对路径
- 复制会保留输入文件的时间戳,并优化文件(如果该文件存在具有相同时间戳的目标文件中)
- 复制将保留输入权限,除非给出明确的权限或
NO_SOURCE_PERMISSIONS
(默认为USE_SOURCE_PERMISSIONS
)file(<COPY|INSTALL> <files>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FOLLOW_SYMLINK_CHAIN]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions>...]] [...])
至于其他选项,请参考install (DIRECTORY)命令。即使使用后面的可选项,来选择文件的子集,复制目录也会保留其内容的结构。
INSTALL与COPY略有不同:它打印状态消息(取决于CMAKE_INSTALL_MESSAGE
变量),并且默认为NO_SOURCE_PERMISSIONS
。 install
命令生成的安装脚本使用此签名(以及一些未记录的内部使用选项)。
符号链接
关于符号链接
- 如果指定了
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中
附
符号链接
符号链接(软链接)是一类特殊的文件,其包含一条以绝对路径(或相对路径)的形式指向其他文件或者目录的引用。
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作
- 某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作
特点
- 一个符号链接文件仅包含有一个文本字符串,其被操作系统解释为一条指向另一个文件或者目录的路径
- 它是一个独立文件,其存在并不依赖于目标文件
- 如果删除一个符号链接,它指向的目标文件不受影响
- 如果目标文件被移动、重命名或者删除,任何指向它的符号链接仍然存在,但是它们将会指向一个不复存在的文件。这种情况被有时被称为被遗弃