install¶
指定在安装时运行的规则。
概要¶
install(TARGETS <target>... [...]) install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...]) install({FILES | PROGRAMS} <file>... [...]) install(DIRECTORY <dir>... [...]) install(SCRIPT <file> [...]) install(CODE <code> [...]) install(EXPORT <export-name> [...]) install(PACKAGE_INFO <package-name> [...]) install(RUNTIME_DEPENDENCY_SET <set-name> [...]) install(SBOM <sbom-name> [...])
简介¶
此命令为项目生成安装规则。在源目录中通过调用 install() 命令指定的安装规则,会在安装过程中按顺序执行。
3.14 版本变更:通过调用 add_subdirectory() 命令添加的子目录中的安装规则,会与父目录中的规则交错执行,从而按声明顺序运行(参见策略 CMP0082)。
3.22 版本变更:环境变量 CMAKE_INSTALL_MODE 可以覆盖 install() 的默认复制行为。
3.31 版本变更:项目可以启用 INSTALL_PARALLEL 来开启并行安装。使用并行安装时,通过调用 add_subdirectory() 添加的子目录将独立安装,且不同子目录中添加的安装规则的运行顺序不再得到保证。
通用选项¶
此命令有多种语法形式。其中一些定义了文件和目标的安装选项。此处涵盖了适用于多种语法形式的通用选项,但它们仅在指定了这些选项的语法形式中有效。通用选项如下:
DESTINATION <dir>指定文件安装到的磁盘目录。
<dir>应为相对路径。允许使用绝对路径,但不推荐。当提供相对路径时,它是相对于
CMAKE_INSTALL_PREFIX变量的值进行解析的。可以使用DESTDIR机制在安装时重定位前缀,该机制在CMAKE_INSTALL_PREFIX变量文档中有说明。由于绝对路径无法与
cmake --install命令的--prefix选项或cpack安装程序生成器配合使用,因此强烈建议始终使用相对路径以获得包维护者的最佳支持。特别地,无需通过预置CMAKE_INSTALL_PREFIX来使路径成为绝对路径;如果DESTINATION是相对路径,则默认使用此前缀。如果给出了绝对路径(带有前导斜杠或驱动器号),则按原样使用。
3.31 版本变更:
<dir>将根据与cmake_path()命令相同的 归一化规则 进行归一化。PERMISSIONS <permission>...指定已安装文件的权限。有效的权限包括
OWNER_READ、OWNER_WRITE、OWNER_EXECUTE、GROUP_READ、GROUP_WRITE、GROUP_EXECUTE、WORLD_READ、WORLD_WRITE、WORLD_EXECUTE、SETUID和SETGID。在某些平台上无意义的权限会被忽略。如果此选项在单次调用中多次使用,其权限列表会累加。如果
install(TARGETS)调用使用了 <artifact-kind> 参数,则每种构件类型会累积独立的权限列表。CONFIGURATIONS <config>...指定安装规则适用的构建配置列表(Debug, Release 等)。
如果此选项在单次调用中多次使用,其配置列表会累加。如果
install(TARGETS)调用使用了 <artifact-kind> 参数,则每种构件类型会累积独立的配置列表。COMPONENT <component>指定与安装规则关联的安装组件名称,例如
Runtime或Development。在特定组件安装期间,仅执行与给定组件名称关联的安装规则。在完整安装期间,除非标记为EXCLUDE_FROM_ALL,否则会安装所有组件。如果未提供COMPONENT,则会创建一个名为 "Unspecified" 的默认组件。默认组件名称可以通过CMAKE_INSTALL_DEFAULT_COMPONENT_NAME变量进行控制。安装组件可以被
cmake --install命令的--component选项以及CPackComponent模块使用。全局目标list_install_components会列出所有可用组件。EXCLUDE_FROM_ALL3.6 版本新增。
指定文件在完整安装中被排除,仅作为特定组件安装的一部分进行安装。
OPTIONAL指定如果待安装文件不存在,不视为错误。
3.1 版本新增:安装文件的命令语法可以在安装期间打印消息。使用 CMAKE_INSTALL_MESSAGE 变量来控制打印哪些消息。
3.11 版本新增:许多 install() 变体隐式创建包含已安装文件的目录。如果设置了 CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS,则这些目录将以指定的权限创建。否则,它们将按照类 Unix 平台上的 uname 规则创建。Windows 平台不受影响。
语法形式¶
- install(TARGETS <target>... [...])¶
安装目标 输出构件 及相关文件
install(TARGETS <target>... [EXPORT <export-name>] [RUNTIME_DEPENDENCIES <arg>...|RUNTIME_DEPENDENCY_SET <set-name>] [<artifact-option>...] [<artifact-kind> <artifact-option>...]... [INCLUDES DESTINATION [<dir> ...]] )
其中
<artifact-option>...组可能包含[DESTINATION <dir>] [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [COMPONENT <component>] [NAMELINK_COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] [NAMELINK_ONLY|NAMELINK_SKIP]
第一个
<artifact-option>...组适用于在同一调用中稍后未指定专用组的目标 输出构件。每个
<artifact-kind> <artifact-option>...组适用于指定构件类型的 输出构件ARCHIVE此类目标构件包括:
静态库(除非在 macOS 上标记为
FRAMEWORK,见下文);DLL 导入库(在所有 Windows 系统上,包括 Cygwin;其扩展名为
.lib,与进入RUNTIME的.dll库形成对比);在 AIX 上,为启用了
ENABLE_EXPORTS的可执行文件创建的 链接器导入文件。在 macOS 上,为启用了
ENABLE_EXPORTS的共享库创建的 链接器导入文件(除非标记为FRAMEWORK,见下文)。
LIBRARY此类目标构件包括:
共享库,除以下情况外:
DLL(这些进入
RUNTIME,见下文),在 macOS 上标记为
FRAMEWORK时(见下文)。
RUNTIME此类目标构件包括:
可执行文件(除非在 macOS 上标记为
MACOSX_BUNDLE,见下文的BUNDLE);DLL(在所有基于 Windows 的系统上,包括 Cygwin;注意附带的导入库属于
ARCHIVE类型)。
OBJECTS版本 3.9 中添加。
与 对象库 相关联的对象文件。
FRAMEWORK在 macOS 上,标记为
FRAMEWORK属性的静态库和共享库都被视为FRAMEWORK目标。BUNDLE在 macOS 上,标记为
MACOSX_BUNDLE属性的可执行文件被视为BUNDLE目标。PUBLIC_HEADER任何与库关联的
PUBLIC_HEADER文件都会安装在非 Apple 平台上由PUBLIC_HEADER参数指定的目的地。此参数定义的规则在 Apple 平台上的FRAMEWORK库中被忽略,因为相关文件会安装在框架文件夹内的适当位置。详见PUBLIC_HEADER。PRIVATE_HEADER类似于
PUBLIC_HEADER,但用于PRIVATE_HEADER文件。详见PRIVATE_HEADER。RESOURCE类似于
PUBLIC_HEADER和PRIVATE_HEADER,但用于RESOURCE文件。详见RESOURCE。FILE_SET <set-name>在版本 3.23 中添加。
文件集由
target_sources(FILE_SET)命令定义。如果文件集<set-name>存在且为PUBLIC或INTERFACE,则集中的任何文件都会安装在目的地(见下文)。相对于文件集基目录的目录结构会得到保留。例如,将文件/blah/include/myproj/here.h添加到基目录为/blah/include的文件集中,它将被安装到目的地之下的myproj/here.h。CXX_MODULES_BMI版本 3.28 新增。
文件集类型为
CXX_MODULES的PUBLIC源文件中的任何 C++ 模块文件都将安装到给定的DESTINATION。所有模块都直接放置在目的地,因为不会从模块名称中推导目录结构。可以使用空的DESTINATION来禁止安装这些文件(用于通用代码)。
对于常规可执行文件、静态库和共享库,
DESTINATION参数不是必需的。对于这些目标类型,当省略DESTINATION时,默认目的地将取自GNUInstallDirs中的相应变量,如果未定义该变量,则设置为内置默认值。这同样适用于文件集,以及通过PUBLIC_HEADER和PRIVATE_HEADER目标属性与已安装目标关联的公共和私有头文件。对于模块库、Apple 捆绑包和框架,必须始终提供目的地。接口库和对象库可以省略目的地,但处理方式不同(参见本节末尾对此主题的讨论)。对于 DLL 平台上的共享库,如果未指定
RUNTIME或ARCHIVE目的地,则RUNTIME和ARCHIVE组件都会安装到它们的默认目的地。如果指定了RUNTIME或ARCHIVE目的地,则组件安装到该目的地,另一个组件不安装。如果同时指定了RUNTIME和ARCHIVE目的地,则两个组件都安装到各自的目的地。下表显示了未给定目的地时适用的目标类型及其相关变量和内置默认值:
目标类型
GNUInstallDirs 变量
内置默认值
RUNTIME${CMAKE_INSTALL_BINDIR}binLIBRARY${CMAKE_INSTALL_LIBDIR}libARCHIVE${CMAKE_INSTALL_LIBDIR}libPRIVATE_HEADER${CMAKE_INSTALL_INCLUDEDIR}includePUBLIC_HEADER${CMAKE_INSTALL_INCLUDEDIR}includeFILE_SET(类型HEADERS)${CMAKE_INSTALL_INCLUDEDIR}include希望遵循将头文件安装到特定于项目的子目录这一常见做法的项目,可能更倾向于使用带有适当路径和基目录的文件集。否则,他们必须提供
DESTINATION,而不能依赖上述规则(参见下文的下一个示例)。为了使包符合分发文件系统布局策略,如果项目必须指定
DESTINATION,强烈建议使用以适当的相对GNUInstallDirs变量开头的路径。这允许包维护者通过设置适当的缓存变量来控制安装目的地。以下示例显示了一个静态库被安装到GNUInstallDirs提供的默认目的地,但其头文件安装到了一个特定于项目的子目录中,且未使用文件集。add_library(mylib STATIC ...) set_target_properties(mylib PROPERTIES PUBLIC_HEADER mylib.h) include(GNUInstallDirs) install(TARGETS mylib PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj )
除了上面列出的 通用选项 之外,每个目标还可以接受以下附加参数:
NAMELINK_COMPONENT3.12 版本新增。
在某些平台上,带版本的共享库具有如下符号链接:
lib<name>.so -> lib<name>.so.1
其中
lib<name>.so.1是库的 soname,lib<name>.so是允许链接器在给定-l<name>时找到库的“命名链接”。NAMELINK_COMPONENT选项类似于COMPONENT选项,但它改变了生成的共享库命名链接的安装组件。如果未指定,它默认为COMPONENT的值。在LIBRARY块之外使用此参数是错误的。3.27 版本变更:此参数也适用于
ARCHIVE块,用于管理在 macOS 上为启用了ENABLE_EXPORTS的共享库创建的链接器导入文件。参阅 示例:为每个构件组件安装目标 中使用
NAMELINK_COMPONENT的示例。此选项通常用于具有独立运行时和开发包的包管理器。例如,在 Debian 系统上,库通常包含在运行时包中,而头文件和命名链接则包含在开发包中。
NAMELINK_ONLY此选项导致在安装库目标时仅安装命名链接。在版本化共享库没有命名链接的平台或库未版本化的平台上,
NAMELINK_ONLY选项不会安装任何内容。在LIBRARY块之外使用此参数是错误的。3.27 版本变更:此参数也适用于
ARCHIVE块,用于管理在 macOS 上为启用了ENABLE_EXPORTS的共享库创建的链接器导入文件。当给定
NAMELINK_ONLY时,可以使用NAMELINK_COMPONENT或COMPONENT来指定命名链接的安装组件,但通常应优先使用COMPONENT。NAMELINK_SKIP类似于
NAMELINK_ONLY,但作用相反:它导致在安装库目标时安装除命名链接之外的库文件。当既未给出NAMELINK_ONLY也未给出NAMELINK_SKIP时,两者都会被安装。在版本化共享库没有符号链接或库未版本化的平台上,NAMELINK_SKIP会安装该库。在LIBRARY块之外使用此参数是错误的。3.27 版本变更:此参数也适用于
ARCHIVE块,用于管理在 macOS 上为启用了ENABLE_EXPORTS的共享库创建的链接器导入文件。如果指定了
NAMELINK_SKIP,则NAMELINK_COMPONENT无效。不建议将NAMELINK_SKIP与NAMELINK_COMPONENT结合使用。
install(TARGETS)命令还可以在顶层接受以下选项:EXPORT此选项将已安装的目标文件与名为
<export-name>的导出关联起来。它必须出现在任何目标选项之前。要实际安装导出文件本身,请调用下文记录的install(EXPORT)。参阅EXPORT_NAME目标属性文档以更改导出目标的名称。如果使用了
EXPORT且目标包含PUBLIC或INTERFACE文件集,则所有这些文件集都必须用FILE_SET参数指定。与目标关联的所有PUBLIC或INTERFACE文件集都包含在导出中。INCLUDES DESTINATION此选项指定一组目录,当通过
install(EXPORT)命令导出时,这些目录将被添加到<targets>的INTERFACE_INCLUDE_DIRECTORIES目标属性中。如果指定了相对路径,则将其视为相对于$<INSTALL_PREFIX>。与其他各种
install()子命令的DESTINATION参数不同,INCLUDES DESTINATION之后给出的路径按原样使用。它们不会被归一化,也不假定已归一化,尽管建议以归一化形式给出(参见 归一化)。RUNTIME_DEPENDENCY_SET <set-name>3.21 版本新增。
此选项导致已安装的可执行文件、共享库和模块目标的所有运行时依赖项被添加到指定的运行时依赖项集中。此集合随后可以使用
install(RUNTIME_DEPENDENCY_SET)命令进行安装。此关键字与
RUNTIME_DEPENDENCIES关键字互斥。RUNTIME_DEPENDENCIES <arg>...3.21 版本新增。
此选项导致已安装的可执行文件、共享库和模块目标的所有运行时依赖项与目标本身一起安装。
RUNTIME、LIBRARY、FRAMEWORK和通用参数用于确定这些依赖项安装的属性(DESTINATION、COMPONENT等)。RUNTIME_DEPENDENCIES在语义上等同于以下一对调用:install(TARGETS ... RUNTIME_DEPENDENCY_SET <set-name>) install(RUNTIME_DEPENDENCY_SET <set-name> <arg>...)
其中
<set-name>将是一个随机生成的集合名称。<arg>...可以包含install(RUNTIME_DEPENDENCY_SET)命令支持的以下任何关键字:DIRECTORIESPRE_INCLUDE_REGEXESPRE_EXCLUDE_REGEXESPOST_INCLUDE_REGEXESPOST_EXCLUDE_REGEXESPOST_INCLUDE_FILESPOST_EXCLUDE_FILES
RUNTIME_DEPENDENCIES和RUNTIME_DEPENDENCY_SET关键字互斥。
接口库 可以列在要安装的目标中。它们不安装任何构件,但会被包含在关联的
EXPORT中。如果列出了 对象库 但未为其目标文件指定目的地,它们将作为 接口库 导出。这足以满足在实现中链接到这些对象库的其他目标的传递使用要求。安装目标属性
EXCLUDE_FROM_ALL设置为TRUE的目标具有未定义的行为。3.3 版本新增:作为
DESTINATION参数给出的安装目的地可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。3.13 版本新增:
install(TARGETS)可以安装在其他目录中创建的目标。当使用此类跨目录安装规则时,从子目录运行make install(或类似命令)不能保证来自其他目录的目标是最新的。您可以使用target_link_libraries()或add_dependencies()来确保在运行子目录特定安装规则之前构建此类目录外目标。
- install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])¶
3.21 版本新增。
安装导入目标的运行时构件
install(IMPORTED_RUNTIME_ARTIFACTS <target>... [RUNTIME_DEPENDENCY_SET <set-name>] [[LIBRARY|RUNTIME|FRAMEWORK|BUNDLE] [DESTINATION <dir>] [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] ]... )
IMPORTED_RUNTIME_ARTIFACTS形式指定了安装导入目标运行时构件的规则。如果项目希望在其安装中捆绑外部可执行文件或模块,可以这样做。LIBRARY、RUNTIME、FRAMEWORK和BUNDLE参数具有与 TARGETS 模式中相同的语义。仅安装导入目标的运行时构件(FRAMEWORK库、MACOSX_BUNDLE可执行文件和BUNDLECFBundles 的情况除外)。例如,不安装与 DLL 关联的头文件和导入库。对于FRAMEWORK库、MACOSX_BUNDLE可执行文件和BUNDLECFBundles,将安装整个目录。RUNTIME_DEPENDENCY_SET选项导致导入的可执行文件、共享库和模块库targets的运行时构件被添加到<set-name>运行时依赖项集中。此集合随后可以使用install(RUNTIME_DEPENDENCY_SET)命令进行安装。
- install(FILES <file>... [...])¶
- install(PROGRAMS <program>... [...])¶
注意
如果安装头文件,请考虑改用
target_sources(FILE_SET)定义的文件集。文件集将头文件与目标关联,并作为目标的一部分进行安装。安装文件或程序
install(<FILES|PROGRAMS> <file>... TYPE <type> | DESTINATION <dir> [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [COMPONENT <component>] [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
FILES形式指定了为项目安装文件的规则。作为相对路径给出的文件名是相对于当前源目录解析的。如果未给出PERMISSIONS参数,此形式安装的文件默认被授予OWNER_WRITE、OWNER_READ、GROUP_READ和WORLD_READ权限。PROGRAMS形式与FILES形式相同,不同之处在于已安装文件的默认权限还包括OWNER_EXECUTE、GROUP_EXECUTE和WORLD_EXECUTE。此形式旨在安装非目标的程序,例如 shell 脚本。使用TARGETS形式来安装在项目内构建的目标。赋予
FILES或PROGRAMS的文件列表可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。但是,如果任何项以生成器表达式开头,则必须将其解析为完整路径。可选的
RENAME <name>参数用于指定与原始文件名不同的已安装文件名。仅当命令安装单个文件时才允许重命名。必须提供
TYPE或DESTINATION,但不能同时提供。TYPE参数指定正在安装的文件的通用文件类型。目的地将自动通过从GNUInstallDirs中获取相应变量来设置,如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参阅下表。如果项目希望明确定义安装目的地,可以提供DESTINATION参数而不是文件类型。TYPE参数GNUInstallDirs 变量
内置默认值
BIN${CMAKE_INSTALL_BINDIR}binSBIN${CMAKE_INSTALL_SBINDIR}sbinLIB${CMAKE_INSTALL_LIBDIR}libINCLUDE${CMAKE_INSTALL_INCLUDEDIR}includeSYSCONF${CMAKE_INSTALL_SYSCONFDIR}etcSHAREDSTATE${CMAKE_INSTALL_SHARESTATEDIR}comLOCALSTATE${CMAKE_INSTALL_LOCALSTATEDIR}varRUNSTATE${CMAKE_INSTALL_RUNSTATEDIR}<LOCALSTATE dir>/runDATA${CMAKE_INSTALL_DATADIR}<DATAROOT dir>INFO${CMAKE_INSTALL_INFODIR}<DATAROOT dir>/infoLOCALE${CMAKE_INSTALL_LOCALEDIR}<DATAROOT dir>/localeMAN${CMAKE_INSTALL_MANDIR}<DATAROOT dir>/manDOC${CMAKE_INSTALL_DOCDIR}<DATAROOT dir>/docLIBEXEC${CMAKE_INSTALL_LIBEXECDIR}libexec希望遵循将头文件安装到特定于项目的子目录这一常见做法的项目需要提供目的地,而不是依赖上述规则。使用文件集安装头文件而不是
install(FILES)会更好(参见target_sources(FILE_SET))。请注意,某些类型的内置默认值使用
DATAROOT目录作为前缀。DATAROOT前缀的计算方式与类型类似,以CMAKE_INSTALL_DATAROOTDIR作为变量,以share作为内置默认值。您不能将DATAROOT用作TYPE参数;请改用DATA。为了使包符合分发文件系统布局策略,如果项目必须指定
DESTINATION,强烈建议使用以适当的相对GNUInstallDirs变量开头的路径。这允许包维护者通过设置适当的缓存变量来控制安装目的地。以下示例演示了如何遵循此建议,同时将图像安装到特定于项目的文档子目录中。include(GNUInstallDirs) install(FILES logo.png DESTINATION ${CMAKE_INSTALL_DOCDIR}/myproj )
3.4 版本新增:作为
DESTINATION参数给出的安装目的地可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。3.20 版本新增:作为
RENAME参数给出的安装重命名可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。3.31 版本新增:
TYPE参数现在支持LIBEXEC类型。
- install(DIRECTORY <dir>... [...])¶
注意
要安装头文件的目录子树,请考虑改用
target_sources(FILE_SET)定义的文件集。文件集不仅保留目录结构,还将头文件与目标关联,并作为目标的一部分进行安装。安装一个或多个目录的内容
install(DIRECTORY <dir>... TYPE <type> | DESTINATION <dir> [FILE_PERMISSIONS <permission>...] [DIRECTORY_PERMISSIONS <permission>...] [USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER] [CONFIGURATIONS <config>...] [COMPONENT <component>] [EXCLUDE_FROM_ALL] [FILES_MATCHING] [<match-rule> <match-option>...]... )
DIRECTORY形式将一个或多个目录的内容安装到给定的目的地。目录结构被逐字复制到目的地。必须提供
TYPE或DESTINATION,但不能同时提供。如果未给定权限,文件将被赋予命令 FILES 形式中指定的默认权限,目录将被赋予命令 PROGRAMS 形式中指定的默认权限。选项包括
<dir>...要安装的目录列表。
每个目录名称的最后一个组件都会附加到目标目录,但可以使用尾随斜杠来避免这种情况,因为它会使最后一个组件为空。作为相对路径给出的目录名是相对于当前源目录解析的。如果未给定输入目录名,则将创建目标目录,但不会向其中安装任何内容。
3.5 版本新增:源
<dir>...列表可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。TYPE <type>指定正在安装的列出目录中文件的通用文件类型。目的地将自动通过从
GNUInstallDirs中获取相应变量来设置,如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参阅下表。如果项目希望明确定义安装目的地,可以提供DESTINATION参数而不是文件类型。TYPE参数GNUInstallDirs 变量
内置默认值
BIN${CMAKE_INSTALL_BINDIR}binSBIN${CMAKE_INSTALL_SBINDIR}sbinLIB${CMAKE_INSTALL_LIBDIR}libINCLUDE${CMAKE_INSTALL_INCLUDEDIR}includeSYSCONF${CMAKE_INSTALL_SYSCONFDIR}etcSHAREDSTATE${CMAKE_INSTALL_SHARESTATEDIR}comLOCALSTATE${CMAKE_INSTALL_LOCALSTATEDIR}varRUNSTATE${CMAKE_INSTALL_RUNSTATEDIR}<LOCALSTATE dir>/runDATA${CMAKE_INSTALL_DATADIR}<DATAROOT dir>INFO${CMAKE_INSTALL_INFODIR}<DATAROOT dir>/infoLOCALE${CMAKE_INSTALL_LOCALEDIR}<DATAROOT dir>/localeMAN${CMAKE_INSTALL_MANDIR}<DATAROOT dir>/manDOC${CMAKE_INSTALL_DOCDIR}<DATAROOT dir>/docLIBEXEC${CMAKE_INSTALL_LIBEXECDIR}libexec请注意,某些类型的内置默认值使用
DATAROOT目录作为前缀。DATAROOT前缀的计算方式与类型类似,以CMAKE_INSTALL_DATAROOTDIR作为变量,以share作为内置默认值。您不能将DATAROOT用作TYPE参数;请改用DATA。3.31 版本新增:
LIBEXEC类型。DESTINATION <dir>目标目录,如 通用选项 中记录的那样。
为了使包符合分发文件系统布局策略,如果项目必须指定
DESTINATION,强烈建议使用以适当的相对GNUInstallDirs变量开头的路径。这允许包维护者通过设置适当的缓存变量来控制安装目的地。3.4 版本新增:目的地
<dir>可以使用语法为$<...>的“生成器表达式”。有关可用表达式,请参阅cmake-generator-expressions(7)手册。FILE_PERMISSIONS <permission>...指定授予目的地中文件的权限,其中
<permission>名称记录在 通用选项 中。DIRECTORY_PERMISSIONS <permission>...指定授予目的地中目录的权限,其中
<permission>名称记录在 通用选项 中。USE_SOURCE_PERMISSIONS如果指定了此项而未指定
FILE_PERMISSIONS,则文件权限将从源目录结构中复制。MESSAGE_NEVER版本 3.1 中新增。
禁用文件安装状态输出。
FILES_MATCHING此选项可以在第一个
<match-rule>之前给出,以禁用未被任何表达式匹配的文件(但不是目录)的安装。例如,以下代码:install(DIRECTORY src/ DESTINATION doc/myproj FILES_MATCHING PATTERN "*.png")
将从源树中提取并安装图像。
<match-rule> <match-option>...可以使用匹配输入目录中遇到的目录或文件的规则,以高精度控制目录的安装。它们可用于将某些选项(见下文)应用于所遇到的文件和目录的子集。除非给出了上述
FILES_MATCHING选项,否则所有文件和目录无论是否匹配都会被安装。每个输入文件或目录的完整路径(使用正斜杠)都可以由
<match-rule>匹配:PATTERN <pattern>使用 glob 模式匹配完整文件名。完整路径中匹配模式的部分必须出现在文件名末尾,并且前面必须有一个斜杠(它不是模式的一部分)。
REGEX <regex>使用 正则表达式 匹配文件完整路径的任何部分。可以使用
/和$将匹配限制在路径末尾。
每个
<match-rule>后面可以跟<match-option>参数。匹配选项适用于规则匹配的文件或目录。匹配选项包括:EXCLUDE将匹配的文件或目录从安装中排除。
PERMISSIONS <permission>...覆盖匹配文件或目录的权限设置。
例如,以下代码:
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/icons,并将scripts目录安装到share/myproj。图标将获得默认文件权限,脚本将被赋予特定权限,并且任何CVS目录都将被排除。
- install(SCRIPT <file> [...])¶
- install(CODE <code> [...])¶
在安装期间调用 CMake 脚本或代码
install([[SCRIPT <file>] [CODE <code>]] [ALL_COMPONENTS | COMPONENT <component>] [EXCLUDE_FROM_ALL])
SCRIPT形式将在安装期间调用给定的 CMake 脚本文件。如果脚本文件名是相对路径,它将相对于当前源目录解析。CODE形式将在安装期间调用给定的 CMake 代码。代码作为双引号字符串内的单个参数指定。例如,以下代码:install(CODE "message(\"Sample install message.\")")
将在安装期间打印一条消息。
3.21 版本新增:当给定
ALL_COMPONENTS选项时,自定义安装脚本代码将为特定组件安装的每个组件执行。此选项与COMPONENT选项互斥。3.14 版本新增:
<file>或<code>可以使用语法为$<...>的“生成器表达式”(对于<file>,这是指它们在文件名中的使用,而不是文件内容)。有关可用表达式,请参阅cmake-generator-expressions(7)手册。
- install(EXPORT <export-name> [...])¶
安装一个为相关项目导出目标的 CMake 文件
install(EXPORT <export-name> DESTINATION <dir> [NAMESPACE <namespace>] [FILE <name>.cmake] [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [CXX_MODULES_DIRECTORY <directory>] [EXPORT_LINK_INTERFACE_LIBRARIES] [COMPONENT <component>] [EXCLUDE_FROM_ALL] [EXPORT_PACKAGE_DEPENDENCIES]) install(EXPORT_ANDROID_MK <export-name> DESTINATION <dir> [...])
EXPORT形式生成并安装一个 CMake 文件,其中包含从安装树导入目标到另一个项目中的代码。目标安装通过使用上述记录的install(TARGETS)语法的EXPORT选项与导出<export-name>关联。NAMESPACE选项将在写入导入文件时将<namespace>预置到目标名称中。默认情况下,生成的文件将被称为<export-name>.cmake,但FILE选项可用于指定不同的名称。FILE选项给出的值必须是带有.cmake扩展名的文件名。如果给出了
CONFIGURATIONS选项,则仅在安装命名配置之一时安装该文件。此外,生成的导入文件将仅引用匹配的目标配置。参阅CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>变量,以将相关项目的配置映射到已安装的配置。EXPORT_LINK_INTERFACE_LIBRARIES关键字(如果存在)会导致在策略CMP0022为NEW时,导出匹配(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?的属性内容。注意
已安装的
<export-name>.cmake文件可能附带额外的每个配置<export-name>-*.cmake文件,由 glob 匹配加载。请勿将导出名称与包名称相同,并结合安装<package-name>-config.cmake文件,否则后者可能会被 glob 错误地匹配并加载。当给定
COMPONENT选项时,列出的<component>隐式依赖于导出集中的所有组件。导出的<name>.cmake文件将要求存在每个已导出的组件,以便相关项目能够正确构建。例如,项目可能会定义Runtime和Development组件,共享库进入Runtime组件,静态库和头文件进入Development组件。导出集通常也是Development组件的一部分,但它会导出Runtime和Development组件中的目标。因此,如果安装了Development组件,则需要安装Runtime组件,反之则不然。如果安装了Development组件而没有Runtime组件,试图链接它的相关项目将出现构建错误。包管理器(如 APT 和 RPM)通常通过在包元数据中将Runtime组件列为Development组件的依赖项来处理此问题,从而确保在存在头文件和 CMake 导出文件时始终安装该库。3.7 版本新增:除了 cmake 语言文件外,
EXPORT_ANDROID_MK模式还可用于指定对 android ndk 构建系统的导出。此模式接受与普通导出模式相同的选项。Android NDK 支持使用静态和共享预构建库。这允许 cmake 构建项目库并将其提供给 ndk 构建系统,其中包括使用库所需的传递依赖项、包含标志和定义。CXX_MODULES_DIRECTORY版本 3.28 新增。
指定一个子目录,用于存储导出集中目标的 C++ 模块信息。此目录将填充一些文件,这些文件将必要的目标属性信息添加到相关目标中。请注意,没有此信息,导出集中的任何 C++ 模块都将不支持在消费目标中导入。
EXPORT_PACKAGE_DEPENDENCIES注意
实验性。受
CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES控制。指定应导出
find_dependency()调用。如果指定了此参数,CMake 将检查导出集中的所有目标并收集它们的INTERFACE链接目标。如果任何此类目标是通过find_package()找到的,或者设置了EXPORT_FIND_PACKAGE_NAME属性,且此类包依赖项未通过向export(SETUP)传递ENABLED OFF而被禁用,则会写入一个find_dependency()调用,其中包含目标的相应包名称、REQUIRED参数以及export(SETUP)的EXTRA_ARGS参数指定的任何额外参数。任何通过向export(SETUP)传递ENABLED ON而手动指定的包依赖项也会被添加,即使导出的目标不依赖于来自它们的任何目标。find_dependency()调用按以下顺序写入:在
export(SETUP)中列出的任何包依赖项都按照它们首次指定的顺序写入,无论它们是否包含导出目标的INTERFACE依赖项。包含导出目标的
INTERFACE链接依赖项且从未在export(SETUP)中指定的任何包依赖项,都按它们首次找到的顺序写入。
EXPORT形式有助于外部项目使用由当前项目构建和安装的目标。例如,以下代码: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 命令加载此文件,并使用导入的目标名称mp_myexe从安装树引用myexe可执行文件,就好像该目标是在其自己的树中构建的一样。
- install(PACKAGE_INFO <package-name> [...])¶
Added in version 4.3.
安装一个 通用包规范 ("CPS") 文件,为相关项目导出目标。
install(PACKAGE_INFO <package-name> EXPORT <export-name> [PROJECT <project-name>|NO_PROJECT_METADATA] [APPENDIX <appendix-name>] [DESTINATION <dir>] [LOWER_CASE_FILE] [VERSION <version> [COMPAT_VERSION <version>] [VERSION_SCHEMA <string>]] [DEFAULT_TARGETS <target>...] [DEFAULT_CONFIGURATIONS <config>...] [LICENSE <license-string>] [DEFAULT_LICENSE <license-string>] [DESCRIPTION <description-string>] [HOMEPAGE_URL <url-string>] [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [CXX_MODULES_DIRECTORY <directory>] [COMPONENT <component>] [EXCLUDE_FROM_ALL])
PACKAGE_INFO形式用于生成并安装通用包规范(Common Package Specification)文件,该文件描述了已安装的目标,以便其他项目可以使用它们。目标安装通过上述文档中install(TARGETS)签名的EXPORT选项与导出<export-name>关联。与install(EXPORT)不同,此信息不是以 CMake 代码形式表达的,因此可以被除 CMake 之外的工具使用。当导入到另一个 CMake 项目时,导入的目标将带有<package-name>::前缀。默认情况下,生成的文件名为<package-name>[-<appendix-name>].cps。如果指定了LOWER_CASE_FILE,则磁盘上的包名(包括文件名和安装目标路径)将首先转换为小写。如果未指定
DESTINATION,则使用特定于平台的默认值。可以使用多个选项来指定包元数据
VERSION <version>包的版本。
<version>应符合指定的模式。有关当使用者请求包时如何使用包版本的更多信息,请参阅 版本选择 (CPS)。COMPAT_VERSION <version>包提供兼容性的最旧版本。
如果未指定,则
COMPAT_VERSION隐式地等于包的VERSION,这意味着不提供向后兼容性。VERSION_SCHEMA <schema>包的版本号(
VERSION和COMPAT_VERSION)所遵循的模式。如果未提供此选项,尽管不会将模式写入.cps文件,但 CPS 规范在这种情况下假定模式为simple。有关详细信息和官方支持的模式列表,请参阅version_schema,但请注意,该规范可能包含 CMake 不支持的模式。find_package()所支持的模式列表,请参阅 版本选择 (CPS)。
DEFAULT_TARGETS <target>...当使用者请求链接到包名,而不是特定组件时,应使用的目标。
DEFAULT_CONFIGURATIONS <config>...如果不存在与使用者配置完全匹配或映射的情况,使用者应优先选择的配置顺序列表。如果未指定,CMake 将以未指定的顺序回退到包可用的配置。
LICENSE <license-string>版本 4.2 中添加。
一个 系统软件包数据交换 (SPDX) 许可证表达式,用于描述整个项目的许可证,包括随项目分发的文档、资源或其他材料,以及软件构件。有关常用许可证及其标识符的列表,请参阅 SPDX 许可证列表。
单个组件的许可证取自其各自目标的
SPDX_LICENSE属性。DEFAULT_LICENSE <license-string>版本 4.2 中添加。
DESCRIPTION <description-string>在 4.1 版本中新增。
项目的说明性描述。建议此描述为一个相对简短的字符串,通常不超过几个字。
HOMEPAGE_URL <url-string>在 4.1 版本中新增。
项目的说明性权威主页 URL。
默认情况下,如果指定的
<sbom-name>与当前的 CMakePROJECT_NAME匹配,则包元数据将继承自项目。PROJECT <project-name>选项可用于指定从不同的项目继承元数据。如果指定了NO_PROJECT_METADATA,则禁用包元数据的自动继承。无论如何,install命令中指定的任何元数据值都将具有优先权。如果指定了
APPENDIX,则指定的各目标将被导出为所命名包的附录,而不是生成顶层包规范。附录可用于将较少使用的目标(及其外部依赖项)与包的其余部分分离开来。这使得使用者能够忽略他们不使用的目标的传递依赖项,并允许单个逻辑“包”由多个构建树生成的构件组成。附录不允许更改基础包元数据;因此,不得将
PROJECT、VERSION、COMPAT_VERSION、VERSION_SCHEMA、DEFAULT_TARGETS或DEFAULT_CONFIGURATIONS与APPENDIX组合使用。此外,强烈建议在主包和任何附录之间保持LOWER_CASE_FILE的使用一致。注意
由于 CPS 旨在跨多种构建工具实现可移植性,因此可能不支持 CMake 脚本导出中允许的所有功能。特别是,目前对接口属性中生成器表达式的支持仅限于依赖于配置的表达式。
注意
这是为项目生成通用包规范包信息的推荐方式。对于那些用户在修改项目的构建文件时无法要求获得 CPS 包信息的经销商,可以使用
CMAKE_INSTALL_EXPORTS_AS_PACKAGE_INFO变量从install(EXPORT)调用中生成.cps文件。请参阅该变量的文档以了解用法和注意事项。
- install(RUNTIME_DEPENDENCY_SET <set-name> [...])¶
3.21 版本新增。
安装运行时依赖项集
install(RUNTIME_DEPENDENCY_SET <set-name> [[LIBRARY|RUNTIME|FRAMEWORK] [DESTINATION <dir>] [PERMISSIONS <permission>...] [CONFIGURATIONS <config>...] [COMPONENT <component>] [NAMELINK_COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] ]... [PRE_INCLUDE_REGEXES <regex>...] [PRE_EXCLUDE_REGEXES <regex>...] [POST_INCLUDE_REGEXES <regex>...] [POST_EXCLUDE_REGEXES <regex>...] [POST_INCLUDE_FILES <file>...] [POST_EXCLUDE_FILES <file>...] [DIRECTORIES <dir>...] )
安装先前由一个或多个
install(TARGETS)或install(IMPORTED_RUNTIME_ARTIFACTS)命令创建的运行时依赖项集。属于运行时依赖项集的目标的依赖项在 DLL 平台上安装到RUNTIME目标路径和组件中,在非 DLL 平台上安装到LIBRARY目标路径和组件中。macOS 框架安装在FRAMEWORK目标路径和组件中。除非目标本身使用install(TARGETS)安装,否则在构建树内构建的目标及其自身的依赖项永远不会作为运行时依赖项安装。生成的安装脚本会在构建树文件上调用
file(GET_RUNTIME_DEPENDENCIES)以计算运行时依赖项。构建树可执行文件作为EXECUTABLES参数传递,构建树共享库作为LIBRARIES参数传递,构建树模块作为MODULES参数传递。在 macOS 上,如果其中一个可执行文件是MACOSX_BUNDLE,则该可执行文件将作为BUNDLE_EXECUTABLE参数传递。在 macOS 上,运行时依赖项集中最多只能有一个这样的包可执行文件。MACOSX_BUNDLE属性对其他平台没有影响。请注意,file(GET_RUNTIME_DEPENDENCIES)仅支持收集 Windows、Linux 和 macOS 平台的运行时依赖项,因此install(RUNTIME_DEPENDENCY_SET)具有相同的限制。以下子参数将作为相应的参数转发给
file(GET_RUNTIME_DEPENDENCIES)(对于那些提供非空目录、正则表达式或文件列表的参数)。它们都支持生成器表达式。DIRECTORIES <dir>...PRE_INCLUDE_REGEXES <regex>...PRE_EXCLUDE_REGEXES <regex>...POST_INCLUDE_REGEXES <regex>...POST_EXCLUDE_REGEXES <regex>...POST_INCLUDE_FILES <file>...POST_EXCLUDE_FILES <file>...
注意
此命令取代了 install_targets() 命令以及 PRE_INSTALL_SCRIPT 和 POST_INSTALL_SCRIPT 目标属性。它还替换了 install_files() 和 install_programs() 命令的 FILES 形式。这些安装规则相对于由 install_targets()、install_files() 和 install_programs() 命令生成的安装规则的处理顺序是未定义的。
- install(SBOM <sbom-name> [...])¶
Added in version 4.3.
注意
实验性功能。受
CMAKE_EXPERIMENTAL_GENERATE_SBOM控制。安装描述项目的软件物料清单 (SBOM)
install(SBOM <sbom-name> EXPORT <export-name> [PROJECT <project-name>|NO_PROJECT_METADATA] [DESTINATION <dir>] [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [LICENSE <license-string>] [DESCRIPTION <description-string>] [HOMEPAGE_URL <url-string>] [PACKAGE_URL <url-string>] [FORMAT <string>])
SBOM形式为给定项目生成软件物料清单 (SBOM) 文件,并将其作为项目安装的一部分进行安装。软件物料清单是项目目标、链接库以及相关元数据(如版本和许可证信息)的机器可读描述。CMake 目前使用 系统软件包数据交换 3.0 规范的 JSON-LD 表示形式生成 SBOM 文件(由FORMAT选项选择),但该接口旨在允许在未来的 CMake 版本中支持额外的 SBOM 格式或模式版本。目标安装通过上述文档中
install(TARGETS)签名的EXPORT选项与导出<export-name>关联。如果未指定DESTINATION,则使用特定于平台的默认值。可以使用多个选项来指定包元数据
VERSION <version>包版本,表示为一系列非负整数组件,即 <major>[.<minor>[.<patch>[.<tweak>]]]。有关更多信息,请参阅
project(VERSION)。FORMAT <string>导出 SBOM 的格式,必须为
<format>[-<version>][+<representation>]形式的表达式。CMake 目前支持 系统软件包数据交换 v3.0.1 的 JSON-LD 序列化(spdx或spdx-3.0.1+json),如果未指定FORMAT,这也是默认设置。
HOMEPAGE_URL <url-string>项目的说明性权威主页 URL。
PACKAGE_URL <url-string>项目的权威包 URL 说明。
LICENSE <license-string>一个 系统软件包数据交换 (SPDX) 许可证表达式,用于描述整个项目的许可证,包括随项目分发的文档、资源或其他材料,以及软件构件。有关常用许可证及其标识符的列表,请参阅 SPDX 许可证列表。
单个组件的许可证取自其各自目标的
SPDX_LICENSE属性。DESCRIPTION <description-string>项目的说明性描述。建议此描述为一个相对简短的字符串,通常不超过几个字。
默认情况下,如果指定的
<package-name>与当前的 CMakePROJECT_NAME匹配,则 sbom 元数据将继承自项目。PROJECT <project-name>选项可用于指定从不同的项目继承元数据。如果指定了NO_PROJECT_METADATA,则禁用 sbom 元数据的自动继承。无论如何,install命令中指定的任何元数据值都将具有优先权。请注意,对于在
LINK_LIBRARIES或INTERFACE_LINK_LIBRARIES属性中包含生成器表达式的目标,除非这些生成器表达式由LINK_ONLY保护,否则无法为其生成 SBOM 文件。
示例¶
示例:安装带有每构件组件的目标¶
考虑一个定义了具有不同构件类型的目标的项目
add_executable(myExe myExe.c)
add_library(myStaticLib STATIC myStaticLib.c)
target_sources(myStaticLib PUBLIC FILE_SET HEADERS FILES myStaticLib.h)
add_library(mySharedLib SHARED mySharedLib.c)
target_sources(mySharedLib PUBLIC FILE_SET HEADERS FILES mySharedLib.h)
set_property(TARGET mySharedLib PROPERTY SOVERSION 1)
我们可以使用 <artifact-kind> 参数调用 install(TARGETS),为每种类型的构件指定不同的选项
install(TARGETS
myExe
mySharedLib
myStaticLib
RUNTIME # Following options apply to runtime artifacts.
COMPONENT Runtime
LIBRARY # Following options apply to library artifacts.
COMPONENT Runtime
NAMELINK_COMPONENT Development
ARCHIVE # Following options apply to archive artifacts.
COMPONENT Development
DESTINATION lib/static
FILE_SET HEADERS # Following options apply to file set HEADERS.
COMPONENT Development
)
这将
将
myExe安装到<prefix>/bin(默认的 RUNTIME 构件安装路径),作为Runtime组件的一部分。在非 DLL 平台上
将
libmySharedLib.so.1安装到<prefix>/lib(默认的 LIBRARY 构件安装路径),作为Runtime组件的一部分。将
libmySharedLib.so“namelink”(符号链接)安装到<prefix>/lib(默认的 LIBRARY 构件安装路径),作为Development组件的一部分。
在 DLL 平台上
将
mySharedLib.dll安装到<prefix>/bin(默认的 RUNTIME 构件安装路径),作为Runtime组件的一部分。将
mySharedLib.lib安装到<prefix>/lib/static(指定的 ARCHIVE 构件安装路径),作为Development组件的一部分。
将
myStaticLib安装到<prefix>/lib/static(指定的 ARCHIVE 构件安装路径),作为Development组件的一部分。将
mySharedLib.h和myStaticLib.h安装到<prefix>/include(HEADERS 类型文件集的默认路径),作为Development组件的一部分。
示例:将目标安装到特定于配置的路径¶
每个 install(TARGETS) 调用将给定的目标 输出构件 安装到最多一个 DESTINATION,但安装规则本身可以通过 CONFIGURATIONS 选项进行过滤。为了为每个配置安装到不同的路径,需要每个配置调用一次。例如,代码
install(TARGETS myExe
CONFIGURATIONS Debug
RUNTIME
DESTINATION Debug/bin
)
install(TARGETS myExe
CONFIGURATIONS Release
RUNTIME
DESTINATION Release/bin
)
将在 Debug 配置中把 myExe 安装到 <prefix>/Debug/bin,在 Release 配置中安装到 <prefix>/Release/bin。
生成的安装脚本¶
注意
不建议使用此功能。请考虑改用 cmake --install。
install() 命令在构建目录内生成一个 cmake_install.cmake 文件,该文件由生成的安装目标和 CPack 在内部使用。您还可以使用 cmake -P 手动调用此脚本。此脚本接受多个变量
COMPONENT设置此变量以仅安装单个 CPack 组件,而不是安装所有组件。例如,如果您只想安装
Development组件,请运行cmake -DCOMPONENT=Development -P cmake_install.cmake。BUILD_TYPE如果您使用的是多配置生成器,请设置此变量以更改构建类型。例如,要以
Debug配置进行安装,请运行cmake -DBUILD_TYPE=Debug -P cmake_install.cmake。DESTDIR这是一个环境变量,而不是 CMake 变量。它允许您在 UNIX 系统上更改安装前缀。有关详细信息,请参阅
DESTDIR。