CMake的INSTALL FILES和INSTALL DIRECTORY有什么区别
在 CMake 中,install()
命令用于安装构建的目标文件、头文件、库等到指定的目标路径。install(FILES ...)
和 install(DIRECTORY ...)
都是 install()
命令的具体用法,它们的功能和适用场景不同。
以下是两者的详细区别和用法说明:
1. install(FILES ...)
功能
- 直接安装指定的文件到目标路径。
- 适用于安装单个文件(如头文件、配置文件等)。
语法
install(FILES file1 file2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])
参数说明
FILES
: 需要安装的文件列表。DESTINATION
: 安装的目标路径,相对于CMAKE_INSTALL_PREFIX
。- 可选参数:
PERMISSIONS
: 指定文件权限(如OWNER_READ
,OWNER_WRITE
等)。RENAME
: 重命名文件时使用。
示例
# 将头文件安装到目标 include 目录
install(FILES header1.h header2.h DESTINATION include)
# 将文件安装到目标路径并设置权限
install(FILES config.json DESTINATION etc
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
2. install(DIRECTORY ...)
功能
- 递归安装整个目录的内容到目标路径。
- 适用于安装文件夹及其子文件夹中的所有内容。
语法
install(DIRECTORY dir1 dir2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])
参数说明
DIRECTORY
: 需要安装的目录列表。DESTINATION
: 安装的目标路径,相对于CMAKE_INSTALL_PREFIX
。- 可选参数:
FILES_MATCHING
: 只安装符合指定模式的文件。PATTERN
和REGEX
: 用于过滤文件或目录的匹配模式。EXCLUDE
: 排除匹配的文件或目录。
示例
# 将目录的内容递归安装到目标路径
install(DIRECTORY my_include/ DESTINATION include)
# 只安装特定扩展名的文件(如 .h 文件)
install(DIRECTORY my_include/ DESTINATION include
FILES_MATCHING PATTERN "*.h"
)
# 排除特定目录
install(DIRECTORY my_project/ DESTINATION project
PATTERN "build" EXCLUDE
)
主要区别
特性 | install(FILES) | install(DIRECTORY) |
---|---|---|
用途 | 安装指定的单个或多个文件 | 安装整个目录及其内容 |
递归处理子目录 | 不支持 | 支持递归安装目录及其子目录 |
支持过滤和模式匹配 | 不支持 | 支持通过 PATTERN 或 REGEX 进行过滤 |
适用场景 | 安装头文件、配置文件、库文件等 | 安装包含多个文件或目录的资源(如源码、数据、文档等) |
排除内容 | 不支持 | 支持使用 EXCLUDE 排除匹配的文件或目录 |
使用建议
install(FILES)
: 当需要安装少量的特定文件时使用。install(DIRECTORY)
: 当需要递归安装整个目录(如头文件目录、资源目录)时使用,尤其是需要过滤或排除特定文件时。
示例:结合使用 FILES
和 DIRECTORY
# 将单个文件安装到配置目录
install(FILES config.json DESTINATION etc)
# 将整个头文件目录安装到目标 include 目录
install(DIRECTORY my_include/ DESTINATION include)
# 仅安装特定文件类型(如 .h 和 .cpp 文件),排除子目录中的文件
install(DIRECTORY my_src/ DESTINATION src
FILES_MATCHING PATTERN "*.h" PATTERN "*.cpp"
PATTERN "tests" EXCLUDE
)
总结
- 使用
install(FILES)
直接安装单个或多个文件,适合静态文件或非递归安装场景。 - 使用
install(DIRECTORY)
递归安装整个目录,适合安装复杂的目录结构或需要文件过滤的场景。