目录
- 安装
- 公共选项
- 安装目标
- 安装文件
- 安装目录
- 安装导出
- 导出
- 问题
安装
install的用法
公共选项
install有多个签名,这些签名公用的选项有以下:
- DESTINATION:指定文件要安装的目录,可以是相对路径或绝对路径。
- 相对路径:会使用 CMAKE_INSTALL_PREFIX 作为前缀路径,即
${CMAKE_INSTALL_PREFIX}/<your_path>
,指定路径不存在的话可以自动创建。如果在cpack中使用,路径使用CPACK_PACKAGING_INSTALL_PREFIX
- 绝对路径
- 相对路径:会使用 CMAKE_INSTALL_PREFIX 作为前缀路径,即
- COMPONENT:指定一个与安装规则相关联的安装组件名,如"lib", "runtime"等。如果在安装期间指定安装组件,就会只安装与相关的组件。举例说明:
install(
TARGETS cxx17 cxx17_test
RUNTIME DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/bin COMPONENT runtime
ARCHIVE DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/lib COMPONENT lib
)
这里编译生成了可执行文件和静态库,可以通过指定COMPOENNT只安装需要的lib,RUNTIME没有安装。
- PERMISSIONS:指定要安装的文件的权限,指定哪个权限就有哪个权限,可以指定多个,如
RUNTIME DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
- RENAME:对安装的文件重命令,仅在只有一个文件被安装的条件下才有效。但是以下示例并没有生效
-
install( TARGETS cxx17 ARCHIVE DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/lib PERMISSIONS GROUP_WRITE RENAME dasha)
- OPTIONAL:安装文件不存在不用报错,继续执行
- EXCLUDE_FROM_ALL
安装目标
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:静态库,如.a文件,.lib等
- LIBRARY:共享库,so
- RUNTIME:可执行文件
- PUBLIC_HEADER:如果给目标设置了PUBLIC_HEADER属性,可以通过该选项安装PUBLIC_HEADER属性指定的文件到目录文件
安装文件
install(<FILES|PROGRAMS> files...
TYPE <type> | DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
将FILES指定的文件安装到DESTINATION指定的路径。DESTINATION不存的话可以自动创建。
RENAME:如果FILES指定了多个文件,这里会报错,目前自测只有一个文件时可以在安装时重命名文件
安装目录
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 指定的一个或多个目录安装到DESTINATION指定的目录下。要注意的是指定到目录这一级还是目录下,拷贝的路径不一样
- FILE_PERMISSIONS和DIRECTORY_PERMISSIONS 指定安装之后的权限
- PATTERN和REGEX:指定用于过滤的正则表达式,PERMISSIONS用于指定经过滤后的文件权限
安装导出
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> [...])
导出
从构建树中导出以便外部项目使用
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>])
创建一个可能被外部项目包含的文件filename。如果提供了NAMESPACE,<namespace>
字符串会被添加到所有的targets名前。<export-name>
的安装路径由install(TARGETS)
命令的EXPORT指定。- 用法和上面类似,只是targets被逐一列出来。APPEND给定的话会在文件中追加而不是覆盖。
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])
export(PACKAGE <PackageName>)
保存当前的构建目录
问题
下面cmake代码:
add_library(cxx17 SHARED)
target_include_directories(
cxx17
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/inc
)
...
install(
TARGETS cxx17
EXPORT "${cxx17}Targets"
ARCHIVE DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT sha
PUBLIC_HEADER DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/include COMPONENT header
COMPONENT dev
)
...
export(TARGETS cxx17 FILE "${INSTALL_CMAKE_DIR}/${cxx17}Targets.cmake")
export(PACKAGE cxx17)
install(EXPORT "${cxx17}Targets" DESTINATION ${INSTALL_CMAKE_DIR})
运行cmake -H. -Bbuild时报错:
经验证,target_include_directories中要换成PRIVATE后就没问题了,原因暂时不知道