安装¶
指定要在安装时运行的规则。
概要¶
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(RUNTIME_DEPENDENCY_SET <set-name> [...])
介绍¶
此命令为项目生成安装规则。在安装期间按顺序执行在源目录中调用 install() 命令指定的安装规则。
在 3.14 版本发生变更: 通过调用 add_subdirectory() 命令添加的子目录中的安装规则与父目录中的规则交错,以按照声明的顺序运行(请参阅策略:CMP0082)。
在 3.22 版本发生变更: 环境变量 CMAKE_INSTALL_MODE 可以覆盖 install() 的默认复制行为。
此命令有多个签名。其中一些定义了文件和目标的安装选项。此处涵盖了多个签名共有的选项,但它们仅对指定它们的签名有效。常见的选项有:
目的地指定磁盘上将安装文件的目录。参数可以是相对或绝对路径。
如果给出了相对路径,则相对于 CMAKE_INSTALL_PREFIX 变量的值进行解释。前缀可以在安装时使用 CMAKE_INSTALL_PREFIX 变量文档中解释的
DESTDIR机制重新定位。如果给出了绝对路径(带有前导斜杠或驱动器号),则将逐字使用。
由于
cpack安装程序生成器不支持绝对路径,因此最好始终使用相对路径。特别是,不需要通过在前面加上 CMAKE_INSTALL_PREFIX 来使路径成为绝对路径;如果 DESTINATION 是相对路径,则默认使用此前缀。权限指定安装文件的权限。有效权限为``OWNER_READ``、
OWNER_WRITE、OWNER_EXECUTE、GROUP_READ、GROUP_WRITE、GROUP_EXECUTE、WORLD_READ、WORLD_WRITE,WORLD_EXECUTE,SETUID和``SETGID``。在某些平台上没有意义的权限在这些平台上会被忽略。配置指定适用安装规则的构建配置列表(调试、发布等)。请注意,为此选项指定的值仅适用于
CONFIGURATIONS选项之后列出的选项。例如,要为调试和发布配置设置单独的安装路径,请执行以下操作:install(TARGETS target CONFIGURATIONS Debug RUNTIME DESTINATION Debug/bin) install(TARGETS target CONFIGURATIONS Release RUNTIME DESTINATION Release/bin)
请注意,
CONFIGURATIONS出现在RUNTIME DESTINATION之前。组件指定与安装规则关联的安装组件名称,例如
Runtime或Development。在特定于组件的安装期间,只会执行与给定组件名称关联的安装规则。在完整安装期间,所有组件都会安装,除非标有EXCLUDE_FROM_ALL。如果未提供COMPONENT,则会创建默认组件“Unspecified”。默认组件名称可以通过 CMAKE_INSTALL_DEFAULT_COMPONENT_NAME 变量控制。EXCLUDE_FROM_ALL在 3.6 版本加入.
指定该文件从完整安装中排除,仅作为组件特定安装的一部分安装
重命名为安装的文件指定一个名称,该名称可能与原始文件不同。只有在命令安装单个文件时才允许重命名。
可选的指定如果要安装的文件不存在则不报错。
在 3.1 版本加入: 安装文件的命令签名可能会在安装期间打印消息。使用 CMAKE_INSTALL_MESSAGE 变量来控制打印哪些消息。
在 3.11 版本加入: 许多 install() 变体隐式创建包含已安装文件的目录。如果设置了 CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS,将使用指定的权限创建这些目录。否则,它们将根据类 Unix 平台上的 uname 规则创建。 Windows 平台不受影响。
安装目标¶
install(TARGETS targets... [EXPORT <export-name>]
[RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>]
[[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>|CXX_MODULES_BMI]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[NAMELINK_COMPONENT <component>]
[OPTIONAL] [EXCLUDE_FROM_ALL]
[NAMELINK_ONLY|NAMELINK_SKIP]
] [...]
[INCLUDES DESTINATION [<dir> ...]]
)
TARGETS 形式指定了从项目安装目标的规则。有几种目标可以安装:ref:Output Artifacts:
存档此类目标工件包括:
*静态库*(标记为“FRAMEWORK”的 macOS 除外,见下文);
*DLL 导入库*(在包括 Cygwin 在内的所有基于 Windows 的系统上;它们具有扩展名
.lib,与进入RUNTIME的.dll库形成对比);在 AIX 上,为启用了
ENABLE_EXPORTS的可执行文件创建的*链接器导入文件*。
图书馆此类目标工件包括:
共享库,除了
DLL(这些进入``RUNTIME``,见下文),
在 macOS 上标记为 ``FRAMEWORK``(见下文)。
运行时此类目标工件包括:
*可执行文件*(标记为
MACOSX_BUNDLE的 macOS 除外,请参阅下面的BUNDLE);DLL(在包括 Cygwin 在内的所有基于 Windows 的系统上;请注意,随附的导入库属于“ARCHIVE”类型)。
对象在 3.9 版本加入.
与*对象库*关联的对象文件。
框架在 macOS 上,标有“FRAMEWORK”属性的静态库和共享库都被视为“FRAMEWORK”目标。
捆绑标有
MACOSX_BUNDLE属性的可执行文件在 macOS 上被视为BUNDLE目标。PUBLIC_HEADER与库关联的任何
PUBLIC_HEADER文件都安装在非 Apple 平台上由PUBLIC_HEADER参数指定的目标中。对于 Apple 平台上的FRAMEWORK库,此参数定义的规则将被忽略,因为相关文件已安装到框架文件夹内的适当位置。有关详细信息,请参阅PUBLIC_HEADER。PRIVATE_HEADER类似于
PUBLIC_HEADER,但用于PRIVATE_HEADER文件。有关详细信息,请参阅PRIVATE_HEADER。资源类似于
PUBLIC_HEADER和PRIVATE_HEADER,但用于RESOURCE文件。有关详细信息,请参阅:prop_tgt:RESOURCE。FILE_SET <设置>在 3.23 版本加入.
文件集由
target_sources(FILE_SET)命令定义。如果文件集<set>存在并且是PUBLIC或INTERFACE,则集合中的任何文件都安装在目标下(见下文)。相对于文件集的基本目录的目录结构被保留。例如,添加到文件集为“/blah/include/myproj/here.h”且基目录为“/blah/include”的文件将安装到“myproj/here.h”目的地下方。
CXX_MODULES_BMI
备注
实验性的。由
CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API控制类型为“CXX_MODULES”的文件集中来自“PUBLIC”源的 C++ 模块的任何模块文件都将安装到给定的“DESTINATION”。所有模块都直接放在目标中,因为没有目录结构是从模块名称派生的。空的``DESTINATION`` 可用于禁止安装这些文件(用于通用代码)。
对于给定的每个参数,它们后面的参数仅适用于参数中指定的目标或文件类型。如果未给出,则安装属性适用于所有目标类型。
对于常规可执行文件、静态库和共享库,不需要 DESTINATION 参数。对于这些目标类型,当省略 DESTINATION 时,默认目标将从 GNUInstallDirs 的适当变量中获取,或者如果未定义该变量,则设置为内置默认值。对于文件集以及通过 PUBLIC_HEADER 和 PRIVATE_HEADER 目标属性与已安装目标关联的公共和私有标头也是如此。必须始终为模块库、Apple 捆绑包和框架提供目的地。接口库和对象库可以省略目的地,但它们的处理方式不同(请参阅本节末尾对该主题的讨论)。
对于 DLL 平台上的共享库,如果既未指定 RUNTIME 也未指定 ARCHIVE 目的地,则 RUNTIME 和 ARCHIVE 组件都安装到它们的默认目的地。如果指定了 RUNTIME 或 ARCHIVE 目的地,则该组件将安装到该目的地,而不会安装其他组件。如果同时指定了 RUNTIME 和 ARCHIVE 目的地,那么这两个组件都将安装到它们各自的目的地。
下表显示了目标类型及其关联变量和在未指定目标时适用的内置默认值:
目标类型 |
GNUInstallDirs 变量 |
内置默认值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
希望遵循将标头安装到项目特定子目录的常见做法的项目可能更喜欢使用具有适当路径和基本目录的文件集。否则,他们必须提供一个``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是库的名称,lib<name>.so是一个“名称链接”,允许链接器在给定-l<name> 时找到库。NAMELINK_COMPONENT选项类似于COMPONENT选项,但它会更改共享库名称链接的安装组件(如果生成的话)。如果未指定,则默认为 COMPONENT 的值。在LIBRARY块之外使用此参数是错误的。考虑以下示例:
install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )
在这种情况下,如果您选择仅安装“开发”组件,则将在不安装库的情况下安装标头和名称链接。 (如果你不同时安装
Libraries组件,namelink 将是一个悬挂的符号链接,链接到库的项目将出现构建错误。)如果您只安装Libraries组件,只有库将被安装,没有标题和名称链接。此选项通常用于具有独立运行时和开发包的包管理器。例如,在 Debian 系统上,库应该在运行时包中,标头和名称链接应该在开发包中。
NAMELINK_ONLY安装库目标时,此选项会导致仅安装名称链接。在版本化共享库没有名称链接的平台上,或者当库没有版本化时,
NAMELINK_ONLY选项不安装任何东西。在LIBRARY块之外使用此参数是错误的。当给出
NAMELINK_ONLY时,NAMELINK_COMPONENT或COMPONENT可用于指定名称链接的安装组件,但通常应首选COMPONENT。NAMELINK_SKIP类似于``NAMELINK_ONLY``,但它有相反的效果:它会导致在安装库目标时安装名称链接以外的库文件。当
NAMELINK_ONLY或NAMELINK_SKIP都没有给出时,这两个部分都会被安装。在版本化共享库没有符号链接的平台上,或者当库没有版本化时,NAMELINK_SKIP安装库。在LIBRARY块之外使用此参数是错误的。如果指定了“NAMELINK_SKIP”,则“NAMELINK_COMPONENT”无效。不建议将
NAMELINK_SKIP与NAMELINK_COMPONENT结合使用。
install(TARGETS) 命令也可以在顶层接受以下选项:
出口此选项将已安装的目标文件与名为“<export-name>”的导出相关联。它必须出现在任何目标选项之前。要实际安装导出文件本身,请调用 install(EXPORT),如下所述。请参阅
EXPORT_NAME目标属性的文档以更改导出目标的名称。如果使用 EXPORT 并且目标包括 PUBLIC 或 INTERFACE 文件集,则所有这些都必须使用 FILE_SET 参数指定。与目标关联的所有“PUBLIC”或“INTERFACE”文件集都包含在导出中。
包括目的地此选项指定一个目录列表,当通过 install(EXPORT) 命令导出时,这些目录将被添加到
<targets>的 INTERFACE_INCLUDE_DIRECTORIES 目标属性中。如果指定了相对路径,它将被视为相对于$<INSTALL_PREFIX>。RUNTIME_DEPENDENCY_SET在 3.21 版本加入.
此选项会导致将已安装的可执行文件、共享库和模块目标的所有运行时依赖项添加到指定的运行时依赖项集中。然后可以使用 install(RUNTIME_DEPENDENCY_SET) 命令安装这个集合。
这个关键字和``RUNTIME_DEPENDENCIES`` 关键字是互斥的。
RUNTIME_DEPENDENCIES在 3.21 版本加入.
此选项会导致已安装的可执行文件、共享库和模块目标的所有运行时依赖项与目标本身一起安装。
RUNTIME、LIBRARY、FRAMEWORK和通用参数用于确定这些依赖项安装的属性(DESTINATION、COMPONENT等) .RUNTIME_DEPENDENCIES在语义上等同于以下一对调用:install(TARGETS ... RUNTIME_DEPENDENCY_SET <set-name>) install(RUNTIME_DEPENDENCY_SET <set-name> args...)
其中
<set-name>将是随机生成的集合名称。args...可能包括以下任何受 install(RUNTIME_DEPENDENCY_SET) 命令支持的关键字:目录PRE_INCLUDE_REGEXESPRE_EXCLUDE_REGEXESPOST_INCLUDE_REGEXESPOST_EXCLUDE_REGEXESPOST_INCLUDE_FILESPOST_EXCLUDE_FILES
RUNTIME_DEPENDENCIES和RUNTIME_DEPENDENCY_SET关键字是互斥的。
可以在对该命令的“TARGETS”形式的单个调用中指定一组或多组属性。目标可以多次安装到不同位置。考虑假设目标“myExe”、“mySharedLib”和“myStaticLib”。代码:
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)
将安装 myExe 到 <prefix>/bin 和 myStaticLib 到 <prefix>/lib/static。在非 DLL 平台上,mySharedLib 将安装到 <prefix>/lib 和 /some/full/path。在 DLL 平台上,mySharedLib DLL 将安装到``<prefix>/bin`` 和``/some/full/path``,它的导入库将安装到``<prefix>/lib/ static`` 和 /some/full/path。
接口库 可能会列在要安装的目标中。它们不安装任何工件,但将包含在关联的“EXPORT”中。如果列出了 对象库 但没有为其目标文件指定目的地,它们将被导出为 接口库。这足以满足在其实现中链接到对象库的其他目标的传递使用要求。
安装 EXCLUDE_FROM_ALL 目标属性设置为 TRUE 的目标具有未定义的行为。
在 3.3 版本加入: 作为 DESTINATION 参数给出的安装目的地可以使用语法为 $<...> 的“生成器表达式”。请参阅 cmake-generator-expressions(7) 手册了解可用的表达式。
在 3.13 版本加入: install(TARGETS) 可以安装在其他目录中创建的目标。当使用这样的跨目录安装规则时,从子目录运行``make install``(或类似的)将不能保证来自其他目录的目标是最新的。您可以使用 target_link_libraries() 或 add_dependencies() 来确保在运行特定于子目录的安装规则之前构建此类目录外目标。
安装导入的运行时工件¶
在 3.21 版本加入.
install(IMPORTED_RUNTIME_ARTIFACTS targets...
[RUNTIME_DEPENDENCY_SET <set-name>]
[[LIBRARY|RUNTIME|FRAMEWORK|BUNDLE]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL] [EXCLUDE_FROM_ALL]
] [...]
)
IMPORTED_RUNTIME_ARTIFACTS 形式指定了安装导入目标的运行时工件的规则。如果项目想要在其安装中捆绑外部可执行文件或模块,则可以这样做。 LIBRARY、RUNTIME、FRAMEWORK 和 BUNDLE 参数与它们在 TARGETS 模式下的语义相同。仅安装导入目标的运行时工件(除了 FRAMEWORK 库、 MACOSX_BUNDLE 可执行文件和 BUNDLE CFBundles。)例如,与未安装 DLL。对于 FRAMEWORK 库、 MACOSX_BUNDLE 可执行文件和 BUNDLE CFBundles,将安装整个目录。
RUNTIME_DEPENDENCY_SET 选项导致导入的可执行文件、共享库和模块库``targets`` 的运行时工件被添加到``<set-name>`` 运行时依赖集。然后可以使用 install(RUNTIME_DEPENDENCY_SET) 命令安装这个集合。
安装文件¶
备注
如果安装头文件,请考虑使用由 target_sources(FILE_SET) 定义的文件集。文件集将标头与目标相关联,并且它们作为目标的一部分安装。
install(<FILES|PROGRAMS> files...
TYPE <type> | DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[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 的 files... 列表可以使用语法为 $<...> 的“生成器表达式”。请参阅 cmake-generator-expressions(7) 手册了解可用的表达式。但是,如果任何项目以生成器表达式开头,则它必须评估为完整路径。
必须提供 TYPE 或 DESTINATION,但不能同时提供两者。 TYPE 参数指定正在安装的文件的通用文件类型。然后将通过从 GNUInstallDirs 中获取相应的变量来自动设置目的地,或者如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参见下表。如果项目希望显式定义安装目标,则项目可以提供一个``DESTINATION`` 参数而不是文件类型。
|
GNUInstallDirs 变量 |
内置默认值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
希望遵循将标头安装到项目特定子目录中的常见做法的项目将需要提供目的地而不是依赖上述内容。使用文件集作为标头而不是``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) 手册了解可用的表达式。
安装目录¶
备注
要安装标头的目录子树,请考虑使用由 target_sources(FILE_SET) 定义的文件集。文件集不仅保留目录结构,它们还将标头与目标相关联并作为目标的一部分进行安装。
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 形式将一个或多个目录的内容安装到给定的目的地。目录结构被逐字复制到目的地。每个目录名称的最后一个组成部分附加到目标目录,但可以使用尾部斜杠来避免这种情况,因为它使最后一个组成部分为空。作为相对路径给出的目录名称根据当前源目录进行解释。如果没有给出输入目录名称,将创建目标目录,但不会将任何内容安装到其中。 FILE_PERMISSIONS 和 DIRECTORY_PERMISSIONS 选项指定给予目标中的文件和目录的权限。如果指定了 USE_SOURCE_PERMISSIONS 而未指定 FILE_PERMISSIONS,文件权限将从源目录结构中复制。如果没有指定权限,文件将被赋予命令的 FILES 形式中指定的默认权限,目录将被赋予命令的 PROGRAMS 形式中指定的默认权限。
在 3.1 版本加入: MESSAGE_NEVER 选项禁用文件安装状态输出。
可以使用“PATTERN”或“REGEX”选项以精细的粒度控制目录的安装。这些“匹配”选项指定通配模式或正则表达式以匹配输入目录中遇到的目录或文件。它们可用于将某些选项(见下文)应用于遇到的文件和目录的子集。每个输入文件或目录(带正斜杠)的完整路径与表达式匹配。 PATTERN 将只匹配完整的文件名:与模式匹配的完整路径部分必须出现在文件名的末尾,并且前面有一个斜杠。 REGEX 将匹配完整路径的任何部分,但它可以使用 / 和 $ 来模拟 PATTERN 行为。默认情况下,安装所有文件和目录,无论它们是否匹配。 FILES_MATCHING 选项可以在第一个匹配选项之前给出,以禁用与任何表达式都不匹配的文件(但不是目录)的安装。例如,代码
install(DIRECTORY src/ DESTINATION doc/myproj
FILES_MATCHING PATTERN "*.png")
将从源代码树中提取并安装图像。
某些选项可能遵循 PATTERN 或 REGEX 表达式,如 string(REGEX) 中所述,并且仅应用于匹配它们的文件或目录。 EXCLUDE 选项将跳过匹配的文件或目录。 PERMISSIONS 选项覆盖匹配文件或目录的权限设置。例如代码
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”目录。
必须提供 TYPE 或 DESTINATION,但不能同时提供两者。 TYPE 参数指定正在安装的列出目录中文件的通用文件类型。然后将通过从 GNUInstallDirs 中获取相应的变量来自动设置目的地,或者如果未定义该变量,则使用内置默认值。有关支持的文件类型及其对应的变量和内置默认值,请参见下表。如果项目希望显式定义安装目标,则项目可以提供一个``DESTINATION`` 参数而不是文件类型。
|
GNUInstallDirs 变量 |
内置默认值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
请注意,某些类型的内置默认值使用 DATAROOT 目录作为前缀。 DATAROOT 前缀的计算类似于类型,CMAKE_INSTALL_DATAROOTDIR 作为变量,share 作为内置默认值。你不能使用 DATAROOT 作为 TYPE 参数;请改用``DATA``。
为了使包符合分发文件系统布局策略,如果项目必须指定一个``DESTINATION``,建议他们使用以适当的 GNUInstallDirs 变量开头的路径。这允许包维护者通过设置适当的缓存变量来控制安装目的地。
在 3.4 版本加入: 作为 DESTINATION 参数给出的安装目的地可以使用语法为 $<...> 的“生成器表达式”。请参阅 cmake-generator-expressions(7) 手册了解可用的表达式。
在 3.5 版本加入: 给 DIRECTORY 的 dirs... 列表也可以使用“生成器表达式”。
自定义安装逻辑¶
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> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]
[CXX_MODULES_DIRECTORY <directory>]
[EXPORT_LINK_INTERFACE_LIBRARIES]
[COMPONENT <component>]
[EXCLUDE_FROM_ALL])
install(EXPORT_ANDROID_MK <export-name> DESTINATION <dir> [...])
EXPORT 形式生成并安装一个 CMake 文件,其中包含将目标从安装树导入另一个项目的代码。使用上面记录的 install(TARGETS) 签名的 EXPORT 选项,目标安装与导出 <export-name> 相关联。 NAMESPACE 选项将在将目标名称写入导入文件时将 <namespace> 添加到目标名称之前。默认情况下,生成的文件将被称为 <export-name>.cmake 但可以使用 FILE 选项指定不同的名称。赋予 FILE 选项的值必须是带有 .cmake 扩展名的文件名。如果给出了 CONFIGURATIONS 选项,那么只有在安装了指定配置之一时才会安装该文件。此外,生成的导入文件将仅引用匹配的目标配置。 EXPORT_LINK_INTERFACE_LIBRARIES 关键字(如果存在)会导致匹配``(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?`` 的属性的内容被导出,当策略:policy:CMP0022 为``NEW ``。
备注
安装的``<export-name>.cmake`` 文件可能会附带额外的每个配置``<export-name>-*.cmake`` 文件以通过通配加载。不要将与包名称相同的导出名称与安装“<package-name>-config.cmake”文件结合使用,否则后者可能会被 glob 错误匹配并加载。
当给出 COMPONENT 选项时,列出的 <component> 隐式依赖于导出集中提到的所有组件。导出的 <name>.cmake 文件将要求每个导出的组件都存在,以便正确构建依赖项目。例如,一个项目可以定义组件“Runtime”和“Development”,共享库进入“Runtime”组件,静态库和头文件进入“Development”组件。导出集通常也是“开发”组件的一部分,但它会从“运行时”和“开发”组件中导出目标。因此,如果安装了 Development 组件,则需要安装 Runtime 组件,反之则不需要。如果在没有安装“运行时”组件的情况下安装了“开发”组件,则尝试链接它的依赖项目将出现构建错误。包管理器,例如 APT 和 RPM,通常通过将“运行时”组件列为包元数据中“开发”组件的依赖项来处理此问题,确保在标头和 CMake 导出时始终安装库文件存在。
在 3.7 版本加入: 除了 cmake 语言文件,EXPORT_ANDROID_MK 模式可用于指定导出到 android ndk 构建系统。此模式接受与正常导出模式相同的选项。 Android NDK 支持使用预建库,包括静态库和共享库。这允许 cmake 构建项目的库,并使它们可用于具有传递依赖性的 ndk 构建系统,包括使用库所需的标志和定义。
CXX_MODULES_DIRECTORY
备注
实验性的。由
CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API控制指定一个子目录来存储导出集中目标的 C++ 模块信息。该目录将填充文件,这些文件将必要的目标属性信息添加到相关目标。请注意,如果没有此信息,作为导出集中目标的一部分的 C++ 模块将不支持在使用目标中导入。
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_targets() 命令以及 PRE_INSTALL_SCRIPT 和 POST_INSTALL_SCRIPT 目标属性。它还替换了 install_files() 和 install_programs() 命令的 FILES 形式。这些安装规则相对于 install_targets()、 install_files() 和 install_programs() 命令生成的规则的处理顺序未定义。
安装运行时依赖¶
在 3.21 版本加入.
install(RUNTIME_DEPENDENCY_SET <set-name>
[[LIBRARY|RUNTIME|FRAMEWORK]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[NAMELINK_COMPONENT <component>]
[OPTIONAL] [EXCLUDE_FROM_ALL]
] [...]
[PRE_INCLUDE_REGEXES regexes...]
[PRE_EXCLUDE_REGEXES regexes...]
[POST_INCLUDE_REGEXES regexes...]
[POST_EXCLUDE_REGEXES regexes...]
[POST_INCLUDE_FILES files...]
[POST_EXCLUDE_FILES files...]
[DIRECTORIES directories...]
)
安装先前由一个或多个`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)`(对于那些提供非空目录、正则表达式或文件列表的子参数)。它们都支持 :manual:`generator expressions。
DIRECTORIES <目录>PRE_INCLUDE_REGEXES <正则表达式>PRE_EXCLUDE_REGEXES <正则表达式>POST_INCLUDE_REGEXES <正则表达式>POST_EXCLUDE_REGEXES <正则表达式>POST_INCLUDE_FILES <文件>POST_EXCLUDE_FILES <文件>
生成的安装脚本¶
备注
不建议使用此功能。请考虑改用 cmake --install。
install() 命令在构建目录中生成一个文件 cmake_install.cmake,生成的安装目标和 CPack 在内部使用该文件。您也可以使用 cmake -P 手动调用此脚本。该脚本接受几个变量:
组件设置此变量以仅安装一个 CPack 组件,而不是安装所有组件。例如,如果您只想安装“开发”组件,请运行“cmake -DCOMPONENT=Development -P cmake_install.cmake”。
BUILD_TYPE如果您使用的是多配置生成器,请设置此变量以更改构建类型。例如,要使用“Debug”配置进行安装,请运行“cmake -DBUILD_TYPE=Debug -P cmake_install.cmake”。
DESTDIR这是一个环境变量而不是 CMake 变量。它允许您更改 UNIX 系统上的安装前缀。有关详细信息,请参见:envvar:DESTDIR。