CMake install
A brief introduction of CMake install command.
install用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等:
CMAKE_INSTALL_PREFIX
是用于定义安装位置的变量,默认为/usr/default
,你需要在调用时在命令行中指定该变量:
目标文件的安装
install(TARGETS targets... [EXPORT <export-name>] [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE| PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] [DESTINATION <dir>] [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [NAMELINK_COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] [NAMELINK_ONLY|NAMELINK_SKIP] ] [...] [INCLUDES DESTINATION [<dir> ...]]
)
参数中的TARGET可以是很多种目标文件,最常见的是通过add_executable
或者add_library
定义的目标文件,即可执行二进制、动态库、静态库。
DESTINATION
:指定磁盘上要安装文件的目录; PERMISSIONS
:指定安装文件的权限。有效权限是OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID; CONFIGURATION
S:指定安装规则适用的构建配置列表(DEBUG或RELEASE等); EXCLUDE_FROM_ALL
:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装; OPTIONAL
:如果要安装的文件不存在,则指定不是错误。 注意一下CONFIGURATIONS
参数,此选项指定的值仅适用于此选项之后列出的选项:例如,要为调试和发布配置设置单独的安装路径,请执行以下操作:
普通文件的安装
install(<FILES|PROGRAMS> files... TYPE <type> | DESTINATION <dir> [PERMISSIONS permissions...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
FILES|PROGRAMS
若为相对路径给出的文件名,将相对于当前源目录进行解释。其中,FILES为普通的文本文件,PROGRAMS指的是非目标文件的可执行程序(如脚本文件)。
如果未提供PERMISSIONS
参数,默认情况下,普通的文本文件将具有OWNER_WRITE,OWNER_READ,GROUP_READ和WORLD_READ权限,即644权限;而非目标文件的可执行程序将具有OWNER_EXECUTE, GROUP_EXECUTE,和WORLD_EXECUTE,即755权限。 DESTINATION
:指定磁盘上要安装文件的目录; PERMISSIONS
:指定安装文件的权限。有效权限是OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID; CONFIGURATIONS
:指定安装规则适用的构建配置列表(DEBUG或RELEASE等); EXCLUDE_FROM_ALL
:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装; OPTIONAL
:如果要安装的文件不存在,则指定不是错误; RENAME
:指定已安装文件的名称,该名称可能与原始文件不同。仅当命令安装了单个文件时,才允许重命名。
目录的安装
install(DIRECTORY dirs... TYPE <type> | DESTINATION <dir> [FILE_PERMISSIONS permissions...] [DIRECTORY_PERMISSIONS permissions...] [USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [EXCLUDE_FROM_ALL] [FILES_MATCHING] [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]] [...])
该命令将一个或多个目录的内容安装到给定的目的地,目录结构被逐个复制到目标位置。每个目录名称的最后一个组成部分都附加到目标目录中,但是可以使用后跟斜杠来避免这种情况,因为它将最后一个组成部分留空。这是什么意思呢?
比如,DIRECTORY
后面如果是abc
意味着abc
这个目录会安装在目标路径下,abc/
意味着abc
这个目录的内容会被安装在目标路径下,而abc
目录本身却不会被安装。即,如果目录名不以/结尾,那么这个目录将被安装为目标路径下的abc
,如果目录名以/
结尾,代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
FILE_PERMISSIONS
和DIRECTORY_PERMISSIONS
选项指定对目标中文件和目录的权限。如果指定了USE_SOURCE_PERMISSIONS
而未指定FILE_PERMISSIONS
,则将从源目录结构中复制文件权限。如果未指定权限,则将为文件提供在命令的FILES形式中指定的默认权限(644
权限),而目录将被赋予在命令的PROGRAMS
形式中指定的默认权限(755
权限)。
可以使用PATTERN
或REGEX
选项以精细的粒度控制目录的安装,可以指定一个通配模式或正则表达式以匹配输入目录中遇到的目录或文件。PATTERN
仅匹配完整的文件名,而REGEX
将匹配文件名的任何部分,但它可以使用/和$模拟PATTERN行为。
某些跟随PATTERN
或REGEX
表达式后的参数,仅应用于满足表达式的文件或目录。如:EXCLUDE
选项将跳过匹配的文件或目录。PERMISSIONS
选项将覆盖匹配文件或目录的权限设置。
这条命令的执行结果是:将icons
目录安装到share/myproj
,将scripts/
中的内容安装到share/myproj
,两个目录均不包含目录名为CVS
的子目录,对于scripts/*
的文件指定权限为OWNER_EXECUTE,OWNER_WRITE,OWNER_READ,GROUP_EXECUTE,GROUP_READ。
本文主要转载自cmake的install指令,略有省略,完整的指令信息请参考CMake官方文档。
Last updated