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_READOWNER_WRITEOWNER_EXECUTEGROUP_READGROUP_WRITEGROUP_EXECUTEWORLD_READWORLD_WRITEWORLD_EXECUTESETUIDSETGID。在某些平台上无意义的权限会被忽略。

如果此选项在单次调用中多次使用,其权限列表会累加。如果 install(TARGETS) 调用使用了 <artifact-kind> 参数,则每种构件类型会累积独立的权限列表。

CONFIGURATIONS <config>...

指定安装规则适用的构建配置列表(Debug, Release 等)。

如果此选项在单次调用中多次使用,其配置列表会累加。如果 install(TARGETS) 调用使用了 <artifact-kind> 参数,则每种构件类型会累积独立的配置列表。

COMPONENT <component>

指定与安装规则关联的安装组件名称,例如 RuntimeDevelopment。在特定组件安装期间,仅执行与给定组件名称关联的安装规则。在完整安装期间,除非标记为 EXCLUDE_FROM_ALL,否则会安装所有组件。如果未提供 COMPONENT,则会创建一个名为 "Unspecified" 的默认组件。默认组件名称可以通过 CMAKE_INSTALL_DEFAULT_COMPONENT_NAME 变量进行控制。

安装组件可以被 cmake --install 命令的 --component 选项以及 CPackComponent 模块使用。全局目标 list_install_components 会列出所有可用组件。

EXCLUDE_FROM_ALL

3.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_HEADERPRIVATE_HEADER,但用于 RESOURCE 文件。详见 RESOURCE

FILE_SET <set-name>

在版本 3.23 中添加。

文件集由 target_sources(FILE_SET) 命令定义。如果文件集 <set-name> 存在且为 PUBLICINTERFACE,则集中的任何文件都会安装在目的地(见下文)。相对于文件集基目录的目录结构会得到保留。例如,将文件 /blah/include/myproj/here.h 添加到基目录为 /blah/include 的文件集中,它将被安装到目的地之下的 myproj/here.h

CXX_MODULES_BMI

版本 3.28 新增。

文件集类型为 CXX_MODULESPUBLIC 源文件中的任何 C++ 模块文件都将安装到给定的 DESTINATION。所有模块都直接放置在目的地,因为不会从模块名称中推导目录结构。可以使用空的 DESTINATION 来禁止安装这些文件(用于通用代码)。

对于常规可执行文件、静态库和共享库,DESTINATION 参数不是必需的。对于这些目标类型,当省略 DESTINATION 时,默认目的地将取自 GNUInstallDirs 中的相应变量,如果未定义该变量,则设置为内置默认值。这同样适用于文件集,以及通过 PUBLIC_HEADERPRIVATE_HEADER 目标属性与已安装目标关联的公共和私有头文件。对于模块库、Apple 捆绑包和框架,必须始终提供目的地。接口库和对象库可以省略目的地,但处理方式不同(参见本节末尾对此主题的讨论)。

对于 DLL 平台上的共享库,如果未指定 RUNTIMEARCHIVE 目的地,则 RUNTIMEARCHIVE 组件都会安装到它们的默认目的地。如果指定了 RUNTIMEARCHIVE 目的地,则组件安装到该目的地,另一个组件不安装。如果同时指定了 RUNTIMEARCHIVE 目的地,则两个组件都安装到各自的目的地。

下表显示了未给定目的地时适用的目标类型及其相关变量和内置默认值:

目标类型

GNUInstallDirs 变量

内置默认值

RUNTIME

${CMAKE_INSTALL_BINDIR}

bin

LIBRARY

${CMAKE_INSTALL_LIBDIR}

lib

ARCHIVE

${CMAKE_INSTALL_LIBDIR}

lib

PRIVATE_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

PUBLIC_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

FILE_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_COMPONENT

3.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 系统上,库通常包含在运行时包中,而头文件和命名链接则包含在开发包中。

有关创建版本化共享库的详细信息,请参阅 VERSIONSOVERSION 目标属性。

NAMELINK_ONLY

此选项导致在安装库目标时仅安装命名链接。在版本化共享库没有命名链接的平台或库未版本化的平台上,NAMELINK_ONLY 选项不会安装任何内容。在 LIBRARY 块之外使用此参数是错误的。

3.27 版本变更:此参数也适用于 ARCHIVE 块,用于管理在 macOS 上为启用了 ENABLE_EXPORTS 的共享库创建的链接器导入文件。

当给定 NAMELINK_ONLY 时,可以使用 NAMELINK_COMPONENTCOMPONENT 来指定命名链接的安装组件,但通常应优先使用 COMPONENT

NAMELINK_SKIP

类似于 NAMELINK_ONLY,但作用相反:它导致在安装库目标时安装除命名链接之外的库文件。当既未给出 NAMELINK_ONLY 也未给出 NAMELINK_SKIP 时,两者都会被安装。在版本化共享库没有符号链接或库未版本化的平台上,NAMELINK_SKIP 会安装该库。在 LIBRARY 块之外使用此参数是错误的。

3.27 版本变更:此参数也适用于 ARCHIVE 块,用于管理在 macOS 上为启用了 ENABLE_EXPORTS 的共享库创建的链接器导入文件。

如果指定了 NAMELINK_SKIP,则 NAMELINK_COMPONENT 无效。不建议将 NAMELINK_SKIPNAMELINK_COMPONENT 结合使用。

install(TARGETS) 命令还可以在顶层接受以下选项:

EXPORT

此选项将已安装的目标文件与名为 <export-name> 的导出关联起来。它必须出现在任何目标选项之前。要实际安装导出文件本身,请调用下文记录的 install(EXPORT)。参阅 EXPORT_NAME 目标属性文档以更改导出目标的名称。

如果使用了 EXPORT 且目标包含 PUBLICINTERFACE 文件集,则所有这些文件集都必须用 FILE_SET 参数指定。与目标关联的所有 PUBLICINTERFACE 文件集都包含在导出中。

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 版本新增。

此选项导致已安装的可执行文件、共享库和模块目标的所有运行时依赖项与目标本身一起安装。RUNTIMELIBRARYFRAMEWORK 和通用参数用于确定这些依赖项安装的属性(DESTINATIONCOMPONENT 等)。

RUNTIME_DEPENDENCIES 在语义上等同于以下一对调用:

install(TARGETS ... RUNTIME_DEPENDENCY_SET <set-name>)
install(RUNTIME_DEPENDENCY_SET <set-name> <arg>...)

其中 <set-name> 将是一个随机生成的集合名称。<arg>... 可以包含 install(RUNTIME_DEPENDENCY_SET) 命令支持的以下任何关键字:

  • DIRECTORIES

  • PRE_INCLUDE_REGEXES

  • PRE_EXCLUDE_REGEXES

  • POST_INCLUDE_REGEXES

  • POST_EXCLUDE_REGEXES

  • POST_INCLUDE_FILES

  • POST_EXCLUDE_FILES

RUNTIME_DEPENDENCIESRUNTIME_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 形式指定了安装导入目标运行时构件的规则。如果项目希望在其安装中捆绑外部可执行文件或模块,可以这样做。LIBRARYRUNTIMEFRAMEWORKBUNDLE 参数具有与 TARGETS 模式中相同的语义。仅安装导入目标的运行时构件(FRAMEWORK 库、MACOSX_BUNDLE 可执行文件和 BUNDLE CFBundles 的情况除外)。例如,不安装与 DLL 关联的头文件和导入库。对于 FRAMEWORK 库、MACOSX_BUNDLE 可执行文件和 BUNDLE CFBundles,将安装整个目录。

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_WRITEOWNER_READGROUP_READWORLD_READ 权限。

PROGRAMS 形式与 FILES 形式相同,不同之处在于已安装文件的默认权限还包括 OWNER_EXECUTEGROUP_EXECUTEWORLD_EXECUTE。此形式旨在安装非目标的程序,例如 shell 脚本。使用 TARGETS 形式来安装在项目内构建的目标。

赋予 FILESPROGRAMS 的文件列表可以使用语法为 $<...> 的“生成器表达式”。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。但是,如果任何项以生成器表达式开头,则必须将其解析为完整路径。

可选的 RENAME <name> 参数用于指定与原始文件名不同的已安装文件名。仅当命令安装单个文件时才允许重命名。

必须提供 TYPEDESTINATION,但不能同时提供。 TYPE 参数指定正在安装的文件的通用文件类型。目的地将自动通过从 GNUInstallDirs 中获取相应变量来设置,如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参阅下表。如果项目希望明确定义安装目的地,可以提供 DESTINATION 参数而不是文件类型。

TYPE 参数

GNUInstallDirs 变量

内置默认值

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

LIBEXEC

${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 形式将一个或多个目录的内容安装到给定的目的地。目录结构被逐字复制到目的地。

必须提供 TYPEDESTINATION,但不能同时提供。如果未给定权限,文件将被赋予命令 FILES 形式中指定的默认权限,目录将被赋予命令 PROGRAMS 形式中指定的默认权限。

选项包括

<dir>...

要安装的目录列表。

每个目录名称的最后一个组件都会附加到目标目录,但可以使用尾随斜杠来避免这种情况,因为它会使最后一个组件为空。作为相对路径给出的目录名是相对于当前源目录解析的。如果未给定输入目录名,则将创建目标目录,但不会向其中安装任何内容。

3.5 版本新增:<dir>... 列表可以使用语法为 $<...> 的“生成器表达式”。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。

TYPE <type>

指定正在安装的列出目录中文件的通用文件类型。目的地将自动通过从 GNUInstallDirs 中获取相应变量来设置,如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参阅下表。如果项目希望明确定义安装目的地,可以提供 DESTINATION 参数而不是文件类型。

TYPE 参数

GNUInstallDirs 变量

内置默认值

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

LIBEXEC

${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 关键字(如果存在)会导致在策略 CMP0022NEW 时,导出匹配 (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? 的属性内容。

注意

已安装的 <export-name>.cmake 文件可能附带额外的每个配置 <export-name>-*.cmake 文件,由 glob 匹配加载。请勿将导出名称与包名称相同,并结合安装 <package-name>-config.cmake 文件,否则后者可能会被 glob 错误地匹配并加载。

当给定 COMPONENT 选项时,列出的 <component> 隐式依赖于导出集中的所有组件。导出的 <name>.cmake 文件将要求存在每个已导出的组件,以便相关项目能够正确构建。例如,项目可能会定义 RuntimeDevelopment 组件,共享库进入 Runtime 组件,静态库和头文件进入 Development 组件。导出集通常也是 Development 组件的一部分,但它会导出 RuntimeDevelopment 组件中的目标。因此,如果安装了 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() 调用按以下顺序写入:

  1. export(SETUP) 中列出的任何包依赖项都按照它们首次指定的顺序写入,无论它们是否包含导出目标的 INTERFACE 依赖项。

  2. 包含导出目标的 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>

包的版本号(VERSIONCOMPAT_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 中添加。

一个 系统软件包数据交换 (SPDX) 许可证表达式,用于描述任何未另外指定许可证的组件的许可证。

DESCRIPTION <description-string>

在 4.1 版本中新增。

项目的说明性描述。建议此描述为一个相对简短的字符串,通常不超过几个字。

HOMEPAGE_URL <url-string>

在 4.1 版本中新增。

项目的说明性权威主页 URL。

默认情况下,如果指定的 <sbom-name> 与当前的 CMake PROJECT_NAME 匹配,则包元数据将继承自项目。PROJECT <project-name> 选项可用于指定从不同的项目继承元数据。如果指定了 NO_PROJECT_METADATA,则禁用包元数据的自动继承。无论如何,install 命令中指定的任何元数据值都将具有优先权。

如果指定了 APPENDIX,则指定的各目标将被导出为所命名包的附录,而不是生成顶层包规范。附录可用于将较少使用的目标(及其外部依赖项)与包的其余部分分离开来。这使得使用者能够忽略他们不使用的目标的传递依赖项,并允许单个逻辑“包”由多个构建树生成的构件组成。

附录不允许更改基础包元数据;因此,不得将 PROJECTVERSIONCOMPAT_VERSIONVERSION_SCHEMADEFAULT_TARGETSDEFAULT_CONFIGURATIONSAPPENDIX 组合使用。此外,强烈建议在主包和任何附录之间保持 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_SCRIPTPOST_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 序列化(spdxspdx-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> 与当前的 CMake PROJECT_NAME 匹配,则 sbom 元数据将继承自项目。PROJECT <project-name> 选项可用于指定从不同的项目继承元数据。如果指定了 NO_PROJECT_METADATA,则禁用 sbom 元数据的自动继承。无论如何,install 命令中指定的任何元数据值都将具有优先权。

请注意,对于在 LINK_LIBRARIESINTERFACE_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.hmyStaticLib.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