之前的示例中有提到使用cmake的install命令来自动安装库和头文件,但是只是使用到了install命令很基础很少的部分,其实该命令作用十分丰富,本篇文档用于说明该命令的详细使用方法。
install()命令为项目生成安装规则,通过在源目录中调用install()命令指定的安装规则将在安装过程中按顺序执行。此命令有多种格式,分别对应不同的安装目标,如:二进制文件、动态库、静态库以及文件、目录、脚本等。基本命令格式如下:
install(TARGETS ... [...])
install({FILES | PROGRAMS} ... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT [...])
install(CODE [...])
install(EXPORT -name> [...])
上述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
声明此步骤是可选的,即如果要安装的文件不存在,不必报错,程序将继续向后执行。
这里的目标文件包含很多中类型,比如动态库.so, 静态库.a,和执行二进制文件等。
install(TARGETS targets... [EXPORT ]
[[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
[DESTINATION ]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[NAMELINK_COMPONENT ]
[OPTIONAL] [EXCLUDE_FROM_ALL]
[NAMELINK_ONLY|NAMELINK_SKIP]
] [...]
[INCLUDES DESTINATION [ ...]]
)
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.so -> lib.so.1
NAMELINK_COMPONENT选项就用于管理这类链接符号,类似于COMPONENT选项,但是如果生成了共享库名称链接,它将更改共享库名称链接的安装组件。如果未指定,则默认为COMPONENT的值。此参数只在在LIBRARY模块中使用。
NAMELINK_ONLY
表示仅安装库的链接文件。
NAMELINK_SKIP
与NAMELINK_ONLY参数作用相反,表示跳过链接文件。
INCLUDES DESTINATION
此选项指定目录列表,当通过install(EXPORT)命令导出时,这些目录将添加到的INTERFACE_INCLUDE_DIRECTORIES目标属性中。如果指定了相对路径,则将其视为相对于$
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安装在
, myStaticLib安装在
和/some/full/path
路径中,mySharedLib安装在
路径中。其中CMAKE_INSTALL_PREFIX
指定。
这种方式用于说明为项目安装文件的规则。最常见的比如安装.so对应的头文件。
install(|PROGRAMS> files...
TYPE <type> | DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[RENAME ] [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} | |
DATA | ${CMAKE_INSTALL_DATADIR} | |
INFO | ${CMAKE_INSTALL_INFODIR} | |
LOCALE | ${CMAKE_INSTALL_LOCALEDIR} | |
MAN | ${CMAKE_INSTALL_MANDIR} | |
DOC | ${CMAKE_INSTALL_DOCDIR} |
include(GNUInstallDirs)
install(FILES mylib.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj
)
这类格式用于将一个或多个目录安装到目标路径中。其中目录的层级结构将被完整地拷贝到目标中。
install(DIRECTORY dirs...
TYPE <type> | DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ] [EXCLUDE_FROM_ALL]
[FILES_MATCHING]
[[PATTERN | 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)
不同于我们所熟知的shell、python脚本等,这里的脚本文件是指cmake在执行安装时调用的脚本。是符合cmake程序格式的规则文件。
install([[SCRIPT ] [CODE ]
]
[COMPONENT ] [EXCLUDE_FROM_ALL] [...])
SCRIPT
cmake安装时要执行的脚本文件。默认以相对路径表示。
CODE
cmake安装时要执行的代码,其格式是字符串表示的单句命令。
install(CODE "MESSAGE(\"Sample install message.\")")
在安装时打印信息"Sample install message."
这类命令格式用于将TARGETS所需的外部符号写入到一个CMake文件,并安装到项目中。
install(EXPORT -name> DESTINATION <dir>
[NAMESPACE ] [[FILE .cmake] |
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[EXPORT_LINK_INTERFACE_LIBRARIES]
[COMPONENT ]
[EXCLUDE_FROM_ALL])
install(EXPORT_ANDROID_MK -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
安装到
中,并将其代码导入到文件
和
。其他项目可以使用include命令来加载此文件来引用myexe可执行文件。
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系统中改变安装目录的前缀。
参见:cmake(3):编译库和可执行文件
install-CMake
https://blog.csdn.net/qq_38410730/article/details/102837401