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
正则表达式匹配。
示例
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)