cmake(8):install命令详解

1. 说明

之前的示例中有提到使用cmake的install命令来自动安装库和头文件,但是只是使用到了install命令很基础很少的部分,其实该命令作用十分丰富,本篇文档用于说明该命令的详细使用方法。

2. install命令详解

install()命令为项目生成安装规则,通过在源目录中调用install()命令指定的安装规则将在安装过程中按顺序执行。此命令有多种格式,分别对应不同的安装目标,如:二进制文件、动态库、静态库以及文件、目录、脚本等。基本命令格式如下:

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


2.1 通用参数说明

上述6种命令格式,有部分参数使用方式和意义相同,在这里统一说明,后续不再单独说明。

参数如下:
DESTINATION
用于指定安装路径,可以是绝对路径,也可以是相对路径。
如果使用的是相对路径,那么需要配合使用CMAKE_INSTALL_PREFIX变量来指定路径前缀,该变量可以在CMakeLists.txt文件中设置,也可以通过cmake命令指定。由于cpack不支持绝对路径,所以cmake官方建议使用相对路径.

PERMISSIONS
指定安装文件的权限,这些权限包括:OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE, GROUP_EXECUTE, WORLD_READ, WORLD_WRITE, WORLD_EXECUTE, SETUID, 和 SETGID

CONFIGURATIONS
指定安装规则适用的构建配置列表(DEBUG或RELEASE等).
注意:此参数需要在RUNTIME DESTINATION参数之前使用.

COMPONENT
指定与安装规则相关联的安装组件名称,如"runtime"或"development"。在对应组件的安装过程中,将仅执行与给定组件名称关联的安装规则。除非显示标记为EXCLUDE_FROM_ALL,否则将安装所有组件。如果未指定COMPONENT,则会创建默认组件“未Unspecified”。可以使用CMAKE_INSTALL_DEFAULT_COMPONENT_NAME变量来控制默认组件名称。

EXCLUDE_FROM_ALL
指定该文件从完整安装中排除,并且仅作为特定于组件的安装的一部分进行安装。

RENAME
重命名要安装的文件,此参数只在安装单个文件时有效。

OPTIONAL
声明此步骤是可选的,即如果要安装的文件不存在,不必报错,程序将继续向后执行。

2.2 安装目标文件

这里的目标文件包含很多中类型,比如动态库.so, 静态库.a,和执行二进制文件等。

用法

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> ...]]
        )

TARGETS
要安装的目标文件,它支持多种平台的多种文件格式,包括静/动态库,可执行文件等。
目标文件 内容 安装目录变量 默认安装文件夹

目标文件内容安装目录变量默认安装文件夹
ARCHIVE静态库${CMAKE_INSTALL_LIBDIR}lib
LIBRARY动态库${CMAKE_INSTALL_LIBDIR}lib
RUNTIME可执行二进制文件${CMAKE_INSTALL_BINDIR}bin
PUBLIC_HEADER与库关联的PUBLIC头文件${CMAKE_INSTALL_INCLUDEDIR}include
PRIVATE_HEADER与库关联的PRIVATE头文件${CMAKE_INSTALL_INCLUDEDIR}include

EXPORT
此参数用于将名为export-name的导出文件与TARGETS文件相关联,它必须出现在任何目标选项之前。

[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
用于指定TARGETS的文件类型。

NAMELINK_COMPONENT
有些平台的共享库具有版本控制符号,如Linux下:

lib<name>.so -> lib<name>.so.1

NAMELINK_COMPONENT选项就用于管理这类链接符号,类似于COMPONENT选项,但是如果生成了共享库名称链接,它将更改共享库名称链接的安装组件。如果未指定,则默认为COMPONENT的值。此参数只在在LIBRARY模块中使用。

NAMELINK_ONLY
表示仅安装库的链接文件。

NAMELINK_SKIP
与NAMELINK_ONLY参数作用相反,表示跳过链接文件。

INCLUDES DESTINATION
此选项指定目录列表,当通过install(EXPORT)命令导出时,这些目录将添加到的INTERFACE_INCLUDE_DIRECTORIES目标属性中。如果指定了相对路径,则将其视为相对于$ <INSTALL_PREFIX>的相对路径。

示例

install(TARGETS myExe mySharedLib myStaticLib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)

这个例子安装myExe, mySharedLib, myStaticLib三个文件,其中myExe安装在<perfix>/bin, myStaticLib安装在<perfix>/lib/static/some/full/path路径中,mySharedLib安装在<perfix>/lib路径中。其中<perfix>由CMAKE_INSTALL_PREFIX指定。

2.3 安装文件

这种方式用于说明为项目安装文件的规则。最常见的比如安装.so对应的头文件。

用法

install(<FILES|PROGRAMS> files...
        TYPE <type> | DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])

FILE
要安装的文件,由当前目录下的相对路径指定。如果没有显式指定PERMISSIONS参数,默认情况下文件的权限为:OWNER_WRITE, OWNER_READ, GROUP_READ, 和WORLD_READ

PROGRAMS
与FILE类型的文件类似,但是多了OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE权限。注意,虽然多了EXECUTE权限,但是这与TARGETS类型的操作是不一样的,比如shell 脚本。

TYPE
指定安装文件的类型。TYPE和DESTINATION 必须至少有一个被指定。
cmake支持的TYPE类型如下:

TYPE类型安装目录变量默认安装文件夹
BIN${CMAKE_INSTALL_BINDIR}bin
SBIN${CMAKE_INSTALL_SBINDIR}sbin
LIB${CMAKE_INSTALL_LIBDIR}lib
INCLUDE${CMAKE_INSTALL_INCLUDEDIR}include
SYSCONF${CMAKE_INSTALL_SYSCONFDIR}etc
SHAREDSTATE${CMAKE_INSTALL_SHARESTATEDIR}com
LOCALSTATE${CMAKE_INSTALL_LOCALSTATEDIR}var
RUNSTATE${CMAKE_INSTALL_RUNSTATEDIR}<LOCALSTATE dir>/run
DATA${CMAKE_INSTALL_DATADIR}<DATAROOT dir>
INFO${CMAKE_INSTALL_INFODIR}<DATAROOT dir>/info
LOCALE${CMAKE_INSTALL_LOCALEDIR}<DATAROOT dir>/locale
MAN${CMAKE_INSTALL_MANDIR}<DATAROOT dir>/man
DOC${CMAKE_INSTALL_DOCDIR}<DATAROOT dir>/doc

示例

include(GNUInstallDirs)
install(FILES mylib.h
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj
)


2.4 安装目录

这类格式用于将一个或多个目录安装到目标路径中。其中目录的层级结构将被完整地拷贝到目标中。

用法

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...]] [...])

FILE_PERMISSIONS
用于指定目录内文件的权限。

DIRECTORY_PERMISSIONS
用于指定目录权限。

USE_SOURCE_PERMISSIONS
拷贝的文件将与源文件的权限保持一致,但是优先使用FILE_PERMISSIONS参数。

MESSAGE_NEVER
不输出安装状态。

FILES_MATCHING
这个选项必须在PATTERN或者REGEX选项前给出,用以禁止安装不匹配的文件。即只安装符合匹配规则的文件。

PATTERN
模式匹配。

REGEX
正则表达式匹配。

示例

# 用以说明FILES_MATCHING 选项的用法
install(DIRECTORY src/ DESTINATION include/myproj
        FILES_MATCHING PATTERN "*.h")
        
install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
            GROUP_EXECUTE GROUP_READ)


2.5 安装脚本文件

不同于我们所熟知的shell、python脚本等,这里的脚本文件是指cmake在执行安装时调用的脚本。是符合cmake程序格式的规则文件。

用法

install([[SCRIPT <file>] [CODE <code>]]
        [COMPONENT <component>] [EXCLUDE_FROM_ALL] [...])

SCRIPT
cmake安装时要执行的脚本文件。默认以相对路径表示。

CODE
cmake安装时要执行的代码,其格式是字符串表示的单句命令。

示例

install(CODE "MESSAGE(\"Sample install message.\")")

在安装时打印信息"Sample install message."

2.6 安装Exports

这类命令格式用于将TARGETS所需的外部符号写入到一个CMake文件,并安装到项目中。

用法

install(EXPORT <export-name> DESTINATION <dir>
        [NAMESPACE <namespace>] [[FILE <name>.cmake]|
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [EXPORT_LINK_INTERFACE_LIBRARIES]
        [COMPONENT <component>]
        [EXCLUDE_FROM_ALL])
install(EXPORT_ANDROID_MK <export-name> DESTINATION <dir> [...])

NAMESPACE
命名空间,cmake将在目标文件前面加上。

FILE
默认情况下,导入的exports是.cmake文件,但是可以通过FILE选项来重命名。

EXPORT_ANDROID_MK
用于指定安卓ndk 编译系统。

示例

这个命令在外部项目需要到当前项目的符号时会非常有用,如:

install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)
install(EXPORT_ANDROID_MK myproj DESTINATION share/ndk-modules)

将可执行文件myexe安装到<prefix>/bin中,并将其代码导入到文件<prefix>/lib/myproj/myproj.cmake<prefix>/share/ndk-modules/Android.mk。其他项目可以使用include命令来加载此文件来引用myexe可执行文件。

3. 原理

install()命令会在编译目录中生成一个cmake_install.cmake的文件,该文件由安装程序或者CPack在安装时调用。也可以使用cmake -P命令来手动调用。
在使用命令手动调用时,有几个参数可供选择:

COMPONENT
将此变量设置为只安装一个CPack组件,而不是安装所有组件。例如,如果只想安装开发组件,请运行

cmake -DCOMPONENT=Development -p cmake_install.cmake.

BUILD_TYPE
如果多种配置生成器,可以使用此参数来指定编译类型。

cmake -DBUILD_TYPE=Debug -P cmake_install.cmake.

DESTDIR
这是一个环境变量,用于在UNIX系统中改变安装目录的前缀。

4. 示例

参见:cmake(3):编译库和可执行文件

参考链接

install-CMake
https://blog.csdn.net/qq_38410730/article/details/102837401

  • 14
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔底

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值