export

导出目标或包,以便外部项目可以直接从当前项目的构建树中使用它们,而无需进行安装。

请参阅 install(EXPORT) 命令以从安装树中导出目标。

概要

export(TARGETS <target>... [...])
export(EXPORT <export-name> [...])
export(PACKAGE <PackageName>)
export(SETUP <export-name> [...])
export(PACKAGE_INFO <package-name> [...])
export(SBOM <sbom-name> [...])

导出目标

export(TARGETS <target>... [...])
export(TARGETS <target>... [NAMESPACE <namespace>]
       [APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES]
       [CXX_MODULES_DIRECTORY <directory>])

创建一个文件 <filename>,该文件可被外部项目包含,以从当前项目的构建树中导入由 <target>... 命名的目标。这在交叉编译期间非常有用,例如在一个项目中构建可在宿主平台上运行的实用工具可执行文件,然后将其导入到为目标平台编译的另一个项目中。

此命令创建的文件特定于构建树,永远不应被安装。请参阅 install(EXPORT) 命令以从安装树中导出目标。

选项包括

NAMESPACE <namespace>

<namespace> 字符串前置到写入文件的所有目标名称中。

APPEND

追加到文件而不是覆盖它。这可用于将多个目标增量导出到同一个文件。

EXPORT_LINK_INTERFACE_LIBRARIES

即使在策略 CMP0022 设置为 NEW 时,也将名为 (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? 的属性内容包含在导出中。这对于支持使用早于 2.8.12 版本的 CMake 的使用者非常有用。

CXX_MODULES_DIRECTORY <directory>

版本 3.28 新增。

将 C++ 模块属性导出到给定目录下的文件中。每个文件将根据目标的导出名称(不带任何命名空间)命名。这些文件将自动从导出文件中包含。

此签名要求所有目标必须显式列出。如果库目标包含在导出中,但其链接的目标未包含在内,则其行为是不确定的。请参阅 export(EXPORT) 签名,以像 install(EXPORT) 从安装树导出一样,自动从构建树导出相同的目标。

注意

如果 CMAKE_OSX_ARCHITECTURES 中列出了多个架构,Xcode 下的 对象库 (Object Libraries) 具有特殊处理。在这种情况下,它们将被导出为 接口库 (Interface Libraries),且客户端无法使用目标文件。这足以满足其他在实现中链接到这些对象库的目标的传递使用需求。

此命令从构建树中导出所有 构建配置 (Build Configurations)。请参阅 CMAKE_MAP_IMPORTED_CONFIG_<CONFIG> 变量,以将从属项目的配置映射到导出的配置。

将目标导出到 Android.mk

export(TARGETS <target>... ANDROID_MK <filename>)

3.7 版本中新增。

此签名通过创建引用预构建目标的 Android.mk 文件,将 CMake 构建的目标导出到 android ndk 构建系统。Android NDK 支持使用预构建库(静态库和共享库)。这允许 CMake 构建项目的库,并使它们可供 ndk 构建系统使用,同时完整包含使用这些库所需的传递依赖项、包含标志和定义。该签名接受一个目标列表,并将它们放入指定的 <filename>Android.mk 文件中。此签名仅在所有给定目标的策略 CMP0022 为 NEW 时才能使用。如果其中一个目标将该策略设置为 OLD,则会报错。

导出匹配 install(EXPORT) 的目标

export(EXPORT <export-name> [...])
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>]
       [CXX_MODULES_DIRECTORY <directory>] [EXPORT_PACKAGE_DEPENDENCIES])

创建一个文件 <filename>,该文件可被外部项目包含,以从当前项目的构建树中导入目标。这与 export(TARGETS) 签名相同,只是目标无需显式列出。相反,它导出与安装导出 <export-name> 关联的目标。目标安装可以使用 install(TARGETS) 命令的 EXPORT 选项与导出 <export-name> 关联。

EXPORT_PACKAGE_DEPENDENCIES

注意

实验性。受 CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES 控制。

指定应导出 find_dependency() 调用。有关其工作原理的详细信息,请参阅 install(EXPORT)

将目标导出到通用包规范 (Common Package Specification)

export(PACKAGE_INFO <package-name> [...])
export(PACKAGE_INFO <package-name> EXPORT <export-name>
       [PROJECT <project-name>|NO_PROJECT_METADATA]
       [APPENDIX <appendix-name>]
       [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>]
       [CXX_MODULES_DIRECTORY <directory>])

Added in version 4.3.

创建一个符合 通用包规范 (Common Package Specification) 的文件,该文件可被外部项目包含,以从当前项目的构建树中导入由 <target>... 命名的目标。请参阅 install(PACKAGE_INFO) 命令以从安装树中导出目标。导入的目标隐式位于 <package-name> 命名空间中。

默认文件名是 <package-name>[-<appendix-name>].cps。如果给出了 LOWER_CASE_FILE 选项,文件名将使用转换为小写的包名。

有关其他选项的描述,请参阅 install(PACKAGE_INFO)

导出软件物料清单 (SBOM) 文档

export(SBOM <sbom-name> [...])
export(SBOM <sbom-name> EXPORT <export-name>
       [FORMAT <string>]
       [PROJECT <project-name>|NO_PROJECT_METADATA]
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [LICENSE <license-string>]
       [DESCRIPTION <description-string>]
       [HOMEPAGE_URL <url-string>]
       [PACKAGE_URL <url-string>])

Added in version 4.3.

注意

实验性功能。受 CMAKE_EXPERIMENTAL_GENERATE_SBOM 控制。

生成一份软件物料清单 (SBOM) 文档,描述导出 <export-name> 中的目标及其在构建树中的依赖项。

有关支持的 SBOM 格式和其它选项的描述,请参阅 install(SBOM)

导出包

export(PACKAGE <PackageName>)
export(PACKAGE <PackageName>)

将当前的构建目录存储在 CMake 用户包注册表中,以供包 <PackageName> 使用。find_package() 命令在搜索包 <PackageName> 时可能会考虑此目录。这有助于从属项目在无需用户干预的情况下找到并使用来自当前项目构建树的包。请注意,此命令创建的包注册表条目仅在使用适用于构建树的包配置文件(<PackageName>Config.cmake)时才有效。在某些情况下(例如打包或系统级安装),不建议写入用户包注册表。

3.1 版本变更: 如果启用了 CMAKE_EXPORT_NO_PACKAGE_REGISTRY 变量,则 export(PACKAGE) 命令将不执行任何操作。

3.15 版本变更: 默认情况下,export(PACKAGE) 命令不执行任何操作(请参阅策略 CMP0090),因为填充用户包注册表会对源树和构建树之外产生影响。设置 CMAKE_EXPORT_PACKAGE_REGISTRY 变量以将构建目录添加到 CMake 用户包注册表中。

配置导出

export(SETUP <export-name> [...])
export(SETUP <export-name>
       [PACKAGE_DEPENDENCY <dep>
        [ENABLED (<bool-true>|<bool-false>|AUTO)]
        [EXTRA_ARGS <args>...]
       ] [...]
       [TARGET <target>
        [XCFRAMEWORK_LOCATION <location>]
       ] [...]
       )

在版本 3.29 中添加。

配置导出的参数。参数如下:

PACKAGE_DEPENDENCY <dep>

注意

实验性。受 CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES 控制。

指定要配置的包依赖项。这会改变在 export(EXPORT)install(EXPORT) 期间写入 find_dependency() 调用方式。<dep> 是要导出的包的名称。此参数接受以下附加参数:

ENABLED

手动控制是否导出依赖项。它接受以下值:

<bool-true>

任何 CMake 识别为“真”的值。始终导出该依赖项,即使没有导出的目标依赖于它。这可用于手动将 find_dependency() 调用添加到导出中。

<bool-false>

任何 CMake 识别为“假”的值。从不导出该依赖项,即使有导出的目标依赖于它。

AUTO

仅当导出的目标依赖于它时,才导出该依赖项。

EXTRA_ARGS <args>

指定在 REQUIRED 参数之后传递给 find_dependency() 的附加参数。

TARGET <target>

指定在此导出中配置的目标。此参数接受以下附加参数:

XCFRAMEWORK_LOCATION

指定包含该目标库的 .xcframework 的位置。如果指定,生成的代码将检查 .xcframework 是否存在,如果存在,它将使用 .xcframework 作为其导入位置,而不是已安装的库。