rapids_cpm_find

添加于版本 v21.06.00。

允许项目通过 CPM 查找或构建任意项目,并内置这些依赖项的跟踪,以实现正确的导出支持。

rapids_cpm_find(<PackageName> <version>
                [COMPONENTS <components...>]
                [GLOBAL_TARGETS <targets...>]
                [BUILD_EXPORT_SET <export-name>]
                [INSTALL_EXPORT_SET <export-name>]
                <CPM_ARGS>
                  all normal CPM options
              )

生成一个 CPM FindPackage 调用,并将其与列出的构建和安装导出集关联,以实现正确的导出生成。

由于 CMake 目标的可见性在本地构建的目标和导入的目标之间有所不同,rapids_cpm_find() 会将导入的目标提升为全局目标,以便用户获得一致性。在 GLOBAL_TARGET 中列出项目使用的所有目标。

注意

需要在使用前调用 rapids_cpm_init()

PackageName

要查找的包的名称。

version

您希望 CPM 查找的包的版本。

COMPONENTS

添加于版本 v22.10.00。

一个必需组件列表,在执行本地搜索时,这些组件必须找到才能使该包被认为是有效的。

GLOBAL_TARGETS

应将此包中的哪些目标设为全局。此信息将传播到任何相关的导出集。

在版本 v21.10.00 中更改: 如果在调用 rapids_cpm_find()GLOBAL_TARGET 中列出的任何目标已存在,则不会执行任何 CPM 调用。这样做是为了以下原因:

  • 消除了调用代码进行条件检查的需要。

  • 允许 BUILD_EXPORT_SETINSTALL_EXPORT_SET 跟踪在目标已通过非 CPM 方式引入时正确进行。

BUILD_EXPORT_SET

记录一个 CPMFindPackage(<PackageName> ...) 调用需要作为我们的构建目录导出集的一部分发生。

INSTALL_EXPORT_SET

记录一个 find_dependency(<PackageName> ...) 调用需要作为我们的安装目录导出集的一部分发生。

BUILD_PATCH_ONLY

即使存在补丁命令,也不要求下载包。这是为了启用仅影响构建过程而不影响运行时功能的补丁。

CPM_ARGS

必需的占位符,用于在需要传递给 CPMFindPackage() 的任何额外参数之前提供。

注意

除非指定了 BUILD_PATCH_ONLY,否则 PATCH_COMMAND 将始终触发使用 CPMAddPackage() 而非 CPMFindPackage()即使补丁命令为空也是如此。

结果变量

<PackageName>_SOURCE_DIR 设置为 <PackageName> 的源码目录路径。<PackageName>_BINARY_DIR 设置为 <PackageName> 的构建目录路径。<PackageName>_ADDED 如果 <PackageName> 之前未添加过,则设置为真值。

注意

将导出集添加到 rapids_cpm_find() 对于构建和安装有不同的行为。构建导出相应的 CPM 调用,因为我们认为其他 CPM 包不会生成正确的构建目录配置模块。而安装导出 find_dependency 调用,因为我们期望项目有一个有效的安装设置。

如果需要不同的行为,您需要使用 rapids_export_package()rapids_export_cpm()

如果设置了 CPM_<PackageName>_SOURCE,我们将使用 CPMAddPackage() 而非 CPMFindPackage()CPMAddPackage() 始终在指定的 CPM_<PackageName>_SOURCE 位置添加包,并且不会首先尝试通过 find_package() 查找它。

示例

关于如何使用 rapids_cpm_find() 包含常用项目的示例。

# fmt
rapids_cpm_find(fmt 8.0.1
  GLOBAL_TARGETS fmt::fmt
  CPM_ARGS
    GITHUB_REPOSITORY fmtlib/fmt
    GIT_TAG 8.0.1
    GIT_SHALLOW TRUE
)

# google benchmark, no GIT_TAG required since it uses `v<Version>` tags
rapids_cpm_find(benchmark 1.5.2
  CPM_ARGS
      GIT_REPOSITORY  https://github.com/google/benchmark.git
      GIT_SHALLOW     TRUE
      OPTIONS         "BENCHMARK_ENABLE_TESTING OFF"
                      "BENCHMARK_ENABLE_INSTALL OFF"
)

覆盖

rapids_cpm_package_override() 命令提供了一种方式,让项目可以覆盖任何 rapids_cpm_find()rapids_cpm_*CPMFetchContent() 包的默认值。

默认情况下,当为一个项目提供覆盖时,不会对该项目进行本地搜索。这样做是为了确保使用了请求的修改版本。