# CMake install

**install用于指定在安装时运行的规则。它可以用来安装很多内容，可以包括目标二进制、动态库、静态库以及文件、目录、脚本等**：

```
install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
```

`CMAKE_INSTALL_PREFIX`是用于定义安装位置的变量，默认为`/usr/default`，你需要在调用时在命令行中指定该变量：

```
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/test/with/cmake -H. -Bbuild/Release
```

### 目标文件的安装

> 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(TARGETS target
        CONFIGURATIONS Debug
        RUNTIME DESTINATION Debug/bin)
install(TARGETS target
        CONFIGURATIONS Release
        RUNTIME DESTINATION Release/bin)
```

### 普通文件的安装

> 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`选项将覆盖匹配文件或目录的权限设置。

```
install(DIRECTORY icons scripts/ DESTINATION share/myproj
        PATTERN "CVS" EXCLUDE
        PATTERN "scripts/*"
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ)
```

这条命令的执行结果是：将`icons`目录安装到`share/myproj`，将`scripts/`中的内容安装到`share/myproj`，两个目录均不包含目录名为`CVS`的子目录，对于`scripts/*`的文件指定权限为OWNER\_EXECUTE，OWNER\_WRITE，OWNER\_READ，GROUP\_EXECUTE，GROUP\_READ。

{% hint style="info" %}
本文主要转载自[cmake的install指令](https://blog.csdn.net/qq_38410730/article/details/102837401)，略有省略，完整的指令信息请参考[CMake官方文档](https://cmake.org/cmake/help/v3.21/command/install.html)。
{% endhint %}
