New in version v21.06.00.

Allow projects to find or build arbitrary projects via CPM with built-in tracking of these dependencies for correct export support.

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

Generate a CPM FindPackage call and associate this with the listed build and install export set for correct export generation.

Since the visibility of CMake’s targets differ between targets built locally and those imported, rapids_cpm_find() promotes imported targets to be global so users have consistency. List all targets used by your project in GLOBAL_TARGET.


Requires rapids_cpm_init() to be called before usage


Name of the package to find.


Version of the package you would like CPM to find.


New in version v22.10.00.

A list of required components that are required to be found for this package to be considered valid when doing a local search.


Which targets from this package should be made global. This information will be propagated to any associated export set.

Changed in version v21.10.00: If any targets listed in GLOBAL_TARGET exist when rapids_cpm_find() is called no calls to CPM will be executed. This is done for the following reasons:

  • Removes the need for the calling code to do the conditional checks

  • Allows BUILD_EXPORT_SET and INSTALL_EXPORT_SET tracking to happen correctly when targets had already been brought it by non-CPM means.


Record that a CPMFindPackage(<PackageName> ...) call needs to occur as part of our build directory export set.


Record a find_dependency(<PackageName> ...) call needs to occur as part of our install directory export set.


Required placeholder to be provided before any extra arguments that need to be passed down to CPMFindPackage().


A PATCH_COMMAND will always trigger usage of CPMAddPackage() instead of CPMFindPackage(). This is true even if the patch command is empty.

Result Variables

<PackageName>_SOURCE_DIR is set to the path to the source directory of <PackageName>. <PackageName>_BINARY_DIR is set to the path to the build directory of <PackageName>. <PackageName>_ADDED is set to a true value if <PackageName> has not been added before.


Adding an export set to rapids_cpm_find() has different behavior for build and install. Build exports a respective CPM call, since we presume other CPM packages don’t generate a correct build directory config module. While install exports a find_dependency call as we expect projects to have a valid install setup.

If you need different behavior you will need to use rapids_export_package() or rapids_export_cpm().

If CPM_<PackageName>_SOURCE is set, we use CPMAddPackage() instead of CPMFindPackage(). CPMAddPackage() always adds the package at the desired CPM_<PackageName>_SOURCE location, and won’t attempt to locate it via find_package() first.


Example on how to use rapids_cpm_find() to include common projects

# fmt
rapids_cpm_find(fmt 8.0.1
    GITHUB_REPOSITORY fmtlib/fmt
    GIT_TAG 8.0.1

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


The rapids_cpm_package_override() command provides a way for projects to override the default values for any rapids_cpm_find(), rapids_cpm_*, CPM, and FetchContent() package.

By default when an override for a project is provided no local search for that project will occur. This is done to make sure that the requested modified version is used.