| find_package | |
| ------------ | |
| .. |FIND_XXX| replace:: find_package | |
| .. |FIND_ARGS_XXX| replace:: <PackageName> | |
| .. |FIND_XXX_REGISTRY_VIEW_DEFAULT| replace:: ``TARGET`` | |
| .. |CMAKE_FIND_ROOT_PATH_MODE_XXX| replace:: | |
| :variable:`CMAKE_FIND_ROOT_PATH_MODE_PACKAGE` | |
| .. only:: html | |
| .. contents:: | |
| .. note:: The :guide:`Using Dependencies Guide` provides a high-level | |
| introduction to this general topic. It provides a broader overview of | |
| where the ``find_package()`` command fits into the bigger picture, | |
| including its relationship to the :module:`FetchContent` module. | |
| The guide is recommended pre-reading before moving on to the details below. | |
| Find a package (usually provided by something external to the project), | |
| and load its package-specific details. Calls to this command can also | |
| be intercepted by :ref:`dependency providers <dependency_providers>`. | |
| Typical Usage | |
| ^^^^^^^^^^^^^ | |
| Most calls to ``find_package()`` typically have the following form: | |
| .. code-block:: cmake | |
| find_package(<PackageName> [<version>] [REQUIRED] [COMPONENTS <components>...]) | |
| The ``<PackageName>`` is the only mandatory argument. The ``<version>`` is | |
| often omitted, and ``REQUIRED`` should be given if the project cannot be | |
| configured successfully without the package. Some more complicated packages | |
| support components which can be selected with the ``COMPONENTS`` keyword, but | |
| most packages don't have that level of complexity. | |
| The above is a reduced form of the `basic signature`_. Where possible, | |
| projects should find packages using this form. This reduces complexity and | |
| maximizes the ways in which the package can be found or provided. | |
| Understanding the `basic signature`_ should be enough for general usage of | |
| ``find_package()``. Project maintainers who intend to provide a package | |
| configuration file should understand the bigger picture, as explained in | |
| :ref:`Full Signature` and all subsequent sections on this page. | |
| Search Modes | |
| ^^^^^^^^^^^^ | |
| The command has a few modes by which it searches for packages: | |
| .. _`Module mode`: | |
| **Module mode** | |
| In this mode, CMake searches for a file called ``Find<PackageName>.cmake``, | |
| looking first in the locations listed in the :variable:`CMAKE_MODULE_PATH`, | |
| then among the :ref:`Find Modules` provided by the CMake installation. | |
| If the file is found, it is read and processed by CMake. It is responsible | |
| for finding the package, checking the version, and producing any needed | |
| messages. Some Find modules provide limited or no support for versioning; | |
| check the Find module's documentation. | |
| The ``Find<PackageName>.cmake`` file is not typically provided by the | |
| package itself. Rather, it is normally provided by something external to | |
| the package, such as the operating system, CMake itself, or even the project | |
| from which the ``find_package()`` command was called. Being externally | |
| provided, :ref:`Find Modules` tend to be heuristic in nature and are | |
| susceptible to becoming out-of-date. They typically search for certain | |
| libraries, files and other package artifacts. | |
| Module mode is only supported by the | |
| :ref:`basic command signature <Basic Signature>`. | |
| .. _`Config mode`: | |
| **Config mode** | |
| In this mode, CMake searches for a file matching any of: | |
| * ``<PackageName>.cps`` | |
| * ``<lowercasePackageName>.cps`` | |
| * ``<lowercasePackageName>-config.cmake`` | |
| * ``<PackageName>Config.cmake`` | |
| If one of the latter two is found, CMake will also look respectively, for | |
| ``<lowercasePackageName>-config-version.cmake`` or | |
| ``<PackageName>ConfigVersion.cmake`` if version details were specified | |
| (see :ref:`version selection` for an explanation of how these separate | |
| version files are used). The latter two options are CMake-script package | |
| descriptions. The first two are |CPS|_ (CPS) package descriptions, which | |
| are more portable and include version information in the 'base' file. Aside | |
| from any explicitly noted exceptions, any references to "config files", | |
| "config mode", "package configuration files", and so forth refer equally to | |
| both CPS and CMake-script files. | |
| .. note:: | |
| Search is implemented in a manner that will tend to prefer |CPS| files | |
| over CMake-script config files in most cases. Specifying ``CONFIGS`` | |
| suppresses consideration of CPS files. | |
| In config mode, the command can be given a list of names to search for | |
| as package names. The locations where CMake searches for the config and | |
| version files is considerably more complicated than for Module mode | |
| (see :ref:`search procedure`). | |
| The config and version files are typically installed as part of the | |
| package, so they tend to be more reliable than Find modules. They usually | |
| contain direct knowledge of the package contents, so no searching or | |
| heuristics are needed within the config or version files themselves. | |
| Config mode is supported by both the :ref:`basic <Basic Signature>` and | |
| :ref:`full <Full Signature>` command signatures. | |
| **FetchContent redirection mode** | |
| .. versionadded:: 3.24 | |
| A call to ``find_package()`` can be redirected internally to a package | |
| provided by the :module:`FetchContent` module. To the caller, the behavior | |
| will appear similar to Config mode, except that the search logic is | |
| bypassed and the component information is not used. See | |
| :command:`FetchContent_Declare` and :command:`FetchContent_MakeAvailable` | |
| for further details. | |
| When not redirected to a package provided by :module:`FetchContent`, the | |
| command arguments determine whether Module or Config mode is used. When the | |
| `basic signature`_ is used, the command searches in Module mode first. | |
| If the package is not found, the search falls back to Config mode. | |
| A user may set the :variable:`CMAKE_FIND_PACKAGE_PREFER_CONFIG` variable | |
| to true to reverse the priority and direct CMake to search using Config mode | |
| first before falling back to Module mode. The basic signature can also be | |
| forced to use only Module mode with a ``MODULE`` keyword. If the | |
| `full signature`_ is used, the command only searches in Config mode. | |
| .. _`basic signature`: | |
| Basic Signature | |
| ^^^^^^^^^^^^^^^ | |
| .. code-block:: cmake | |
| find_package(<PackageName> [<version>] [EXACT] [QUIET] [MODULE] | |
| [REQUIRED|OPTIONAL] [[COMPONENTS] <component>...] | |
| [OPTIONAL_COMPONENTS <component>...] | |
| [REGISTRY_VIEW {64|32|64_32|32_64|HOST|TARGET|BOTH}] | |
| [GLOBAL] | |
| [NO_POLICY_SCOPE] | |
| [BYPASS_PROVIDER] | |
| [UNWIND_INCLUDE]) | |
| The basic signature is supported by both Module and Config modes. | |
| The ``MODULE`` keyword implies that only Module mode can be used to find | |
| the package, with no fallback to Config mode. | |
| Regardless of the mode used, a ``<PackageName>_FOUND`` variable will be | |
| set to indicate whether the package was found. When the package is found, | |
| package-specific information may be provided through other variables and | |
| :ref:`Imported Targets` documented by the package itself. The | |
| ``QUIET`` option disables informational messages, including those indicating | |
| that the package cannot be found if it is not ``REQUIRED``. The ``REQUIRED`` | |
| option stops processing with an error message if the package cannot be found. | |
| A package-specific list of required components may be listed after the | |
| ``COMPONENTS`` keyword. If any of these components are not able to be | |
| satisfied, the package overall is considered to be not found. If the | |
| ``REQUIRED`` option is also present, this is treated as a fatal error, | |
| otherwise execution still continues. As a form of shorthand, if the | |
| ``REQUIRED`` option is present, the ``COMPONENTS`` keyword can be omitted | |
| and the required components can be listed directly after ``REQUIRED``. | |
| The :variable:`CMAKE_FIND_REQUIRED` variable can be enabled to make this call | |
| ``REQUIRED`` by default. This behavior can be overridden by providing the | |
| ``OPTIONAL`` keyword. As with the ``REQUIRED`` option, a list of components | |
| can be listed directly after ``OPTIONAL``, which is equivalent to listing | |
| them after the ``COMPONENTS`` keyword. When the ``OPTIONAL`` keyword is given, | |
| the warning output when a package is not found is suppressed. | |
| Additional optional components may be listed after ``OPTIONAL_COMPONENTS``. | |
| If these cannot be satisfied, the package overall can still be considered | |
| found, as long as all required components are satisfied. | |
| The set of available components and their meaning are defined by the | |
| target package: | |
| * For CMake-script package configuration files, it is formally up to the target | |
| package how to interpret the component information given to it, but it should | |
| follow the expectations stated above. For calls where no components are | |
| specified, there is no single expected behavior and target packages should | |
| clearly define what occurs in such cases. Common arrangements include | |
| assuming it should find all components, no components or some well-defined | |
| subset of the available components. | |
| * |CPS| packages consist of a root configuration file and zero or more | |
| appendices, each of which provide components and may have dependencies. | |
| CMake always attempts to load the root configuration file. Appendices are | |
| only loaded if their dependencies can be satisfied, and if they either | |
| provide requested components, or if no components were requested. If the | |
| dependencies of an appendix providing a required component cannot be | |
| satisfied, the package is considered not found. Otherwise, that appendix | |
| is ignored. | |
| .. versionadded:: 3.24 | |
| The ``REGISTRY_VIEW`` keyword specifies which registry views should be | |
| queried. This keyword is only meaningful on ``Windows`` platforms and will | |
| be ignored on all others. Formally, it is up to the target package how to | |
| interpret the registry view information given to it. | |
| .. versionadded:: 3.24 | |
| Specifying the ``GLOBAL`` keyword will promote all imported targets to | |
| a global scope in the importing project. Alternatively, this functionality | |
| can be enabled by setting the :variable:`CMAKE_FIND_PACKAGE_TARGETS_GLOBAL` | |
| variable. | |
| .. _FIND_PACKAGE_VERSION_FORMAT: | |
| The ``<version>`` argument requests a version with which the package found | |
| should be compatible. There are two possible forms in which it may be | |
| specified: | |
| * A single version with the format ``major[.minor[.patch[.tweak]]]``, where | |
| each component is a numeric value. | |
| * A version range with the format ``versionMin...[<]versionMax`` where | |
| ``versionMin`` and ``versionMax`` have the same format and constraints on | |
| components being integers as the single version. By default, both end points | |
| are included. By specifying ``<``, the upper end point will be excluded. | |
| Version ranges are only supported with CMake 3.19 or later. | |
| .. note:: | |
| With the exception of CPS packages, version support is currently provided | |
| only on a package-by-package basis. When a version range is specified but | |
| the package is only designed to expect a single version, the package will | |
| ignore the upper end point of the range and only take the single version at | |
| the lower end of the range into account. Non-CPS packages that do support | |
| version ranges do so in a manner that is determined by the individual | |
| package. See the `Version Selection`_ section below for details and | |
| important caveats. | |
| The ``EXACT`` option requests that the version be matched exactly. This option | |
| is incompatible with the specification of a version range. | |
| If no ``<version>`` and/or component list is given to a recursive invocation | |
| inside a find-module, the corresponding arguments are forwarded | |
| automatically from the outer call (including the ``EXACT`` flag for | |
| ``<version>``). | |
| See the :command:`cmake_policy` command documentation for discussion | |
| of the ``NO_POLICY_SCOPE`` option. | |
| .. versionadded:: 3.24 | |
| The ``BYPASS_PROVIDER`` keyword is only allowed when ``find_package()`` is | |
| being called by a :ref:`dependency provider <dependency_providers>`. | |
| It can be used by providers to call the built-in ``find_package()`` | |
| implementation directly and prevent that call from being re-routed back to | |
| itself. Future versions of CMake may detect attempts to use this keyword | |
| from places other than a dependency provider and halt with a fatal error. | |
| .. versionadded:: 4.2 | |
| The ``UNWIND_INCLUDE`` keyword is only allowed when ``find_package()`` is | |
| being called within a parent call to ``find_package()``. When a call to | |
| ``find_package(UNWIND_INCLUDE)`` fails to find the desired package, it begins | |
| an "unwind" state. In this state further calls to ``find_package()`` and | |
| :command:`include()` are forbidden, and all parent :command:`include()` | |
| commands will immediately invoke :command:`return()` when their scope is | |
| reached. This "unwinding" will continue until the parent ``find_package()`` | |
| is returned to. | |
| ``UNWIND_INCLUDE`` is only intended to be used by calls to ``find_package()`` | |
| generated by :command:`install(EXPORT_PACKAGE_DEPENDENCIES)`, but may be | |
| useful to those who wish to manually manage their dependencies in a similar | |
| manner. | |
| .. _`full signature`: | |
| Full Signature | |
| ^^^^^^^^^^^^^^ | |
| .. code-block:: cmake | |
| find_package(<PackageName> [version] [EXACT] [QUIET] | |
| [REQUIRED|OPTIONAL] [[COMPONENTS] <component>...] | |
| [OPTIONAL_COMPONENTS <component>...] | |
| [CONFIG|NO_MODULE] | |
| [GLOBAL] | |
| [NO_POLICY_SCOPE] | |
| [BYPASS_PROVIDER] | |
| [NAMES <name>...] | |
| [CONFIGS <config>...] | |
| [HINTS <path>...] | |
| [PATHS <path>...] | |
| [REGISTRY_VIEW {64|32|64_32|32_64|HOST|TARGET|BOTH}] | |
| [PATH_SUFFIXES <suffix>...] | |
| [NO_DEFAULT_PATH] | |
| [NO_PACKAGE_ROOT_PATH] | |
| [NO_CMAKE_PATH] | |
| [NO_CMAKE_ENVIRONMENT_PATH] | |
| [NO_SYSTEM_ENVIRONMENT_PATH] | |
| [NO_CMAKE_PACKAGE_REGISTRY] | |
| [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing. | |
| [NO_CMAKE_SYSTEM_PATH] | |
| [NO_CMAKE_INSTALL_PREFIX] | |
| [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY] | |
| [CMAKE_FIND_ROOT_PATH_BOTH | | |
| ONLY_CMAKE_FIND_ROOT_PATH | | |
| NO_CMAKE_FIND_ROOT_PATH]) | |
| The ``CONFIG`` option, the synonymous ``NO_MODULE`` option, or the use | |
| of options not specified in the `basic signature`_ all enforce pure Config | |
| mode. In pure Config mode, the command skips Module mode search and | |
| proceeds at once with Config mode search. | |
| Config mode search attempts to locate a configuration file provided by the | |
| package to be found. A cache entry called ``<PackageName>_DIR`` is created to | |
| hold the directory containing the file. By default, the command searches for | |
| a package with the name ``<PackageName>``. If the ``NAMES`` option is given, | |
| the names following it are used instead of ``<PackageName>``. The names are | |
| also considered when determining whether to redirect the call to a package | |
| provided by :module:`FetchContent`. | |
| The command searches for a file whose name, for each package name specified, | |
| matches any of: | |
| * ``<PackageName>Config.cmake`` | |
| * ``<lowercasePackageName>-config.cmake`` | |
| * ``<PackageName>.cps`` | |
| * ``<lowercasePackageName>.cps`` | |
| A replacement set of possible configuration file names may be given | |
| using the ``CONFIGS`` option. The :ref:`search procedure` is specified below. | |
| Once found, any :ref:`version constraint <version selection>` is checked, | |
| and if satisfied, the configuration file is read and processed by CMake. | |
| Since the file is provided by the package it already knows the | |
| location of package contents. The full path to the configuration file | |
| is stored in the CMake variable ``<PackageName>_CONFIG``. | |
| .. note:: | |
| Because CPS files are not permitted to have names that do *not* match the | |
| package name, specifying ``CONFIGS`` will suppress searching for CPS files. | |
| All configuration files which have been considered by CMake while | |
| searching for the package with an appropriate version are stored in the | |
| ``<PackageName>_CONSIDERED_CONFIGS`` variable, and the associated versions | |
| in the ``<PackageName>_CONSIDERED_VERSIONS`` variable. | |
| If the package configuration file cannot be found, CMake will generate | |
| an error describing the problem unless the ``QUIET`` argument is | |
| specified. If ``REQUIRED`` is specified and the package is not found, a | |
| fatal error is generated and the configure step stops executing. If | |
| ``<PackageName>_DIR`` has been set to a directory not containing a | |
| configuration file, or if the requested version is not compatible | |
| with the package found in that directory (see :ref:`version selection`), | |
| CMake will ignore it and search from scratch. | |
| Package maintainers providing package configuration files are encouraged to | |
| name and install them such that the :ref:`search procedure` outlined below | |
| will find them without requiring use of additional options. | |
| .. _`search procedure`: | |
| Config Mode Search Procedure | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| .. note:: | |
| When Config mode is used, this search procedure is applied regardless of | |
| whether the :ref:`full <full signature>` or :ref:`basic <basic signature>` | |
| signature was given. | |
| .. versionadded:: 3.24 | |
| All calls to ``find_package()`` (even in Module mode) first look for a config | |
| package file in the :variable:`CMAKE_FIND_PACKAGE_REDIRECTS_DIR` directory. | |
| The :module:`FetchContent` module, or even the project itself, may write files | |
| to that location to redirect ``find_package()`` calls to content already | |
| provided by the project. If no config package file is found in that location, | |
| the search proceeds with the logic described below. | |
| CMake constructs a set of possible installation prefixes for the | |
| package. Under each prefix several directories are searched for a | |
| configuration file. The tables below show the directories searched. | |
| Each entry is meant for installation trees following Windows (``W``), UNIX | |
| (``U``), or Apple (``A``) conventions: | |
| ==================================================================== ========== | |
| Entry Convention | |
| ==================================================================== ========== | |
| ``<prefix>/<name>/cps/`` [#p2]_ W | |
| ``<prefix>/<name>/*/cps/`` [#p2]_ W | |
| ``<prefix>/cps/<name>/`` [#p2]_ W | |
| ``<prefix>/cps/<name>/*/`` [#p2]_ W | |
| ``<prefix>/cps/`` [#p2]_ W | |
| ``<prefix>/`` W | |
| ``<prefix>/(cmake|CMake)/`` W | |
| ``<prefix>/<name>*/`` W | |
| ``<prefix>/<name>*/(cmake|CMake)/`` W | |
| ``<prefix>/<name>*/(cmake|CMake)/<name>*/`` [#p1]_ W | |
| ``<prefix>/(lib/<arch>|lib*|share)/cps/<name>/`` [#p2]_ U | |
| ``<prefix>/(lib/<arch>|lib*|share)/cps/<name>/*/`` [#p2]_ U | |
| ``<prefix>/(lib/<arch>|lib*|share)/cps/`` [#p2]_ U | |
| ``<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/`` U | |
| ``<prefix>/(lib/<arch>|lib*|share)/<name>*/`` U | |
| ``<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/`` U | |
| ``<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/`` W/U | |
| ``<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/`` W/U | |
| ``<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/`` W/U | |
| ==================================================================== ========== | |
| .. [#p1] .. versionadded:: 3.25 | |
| .. [#p2] .. versionadded:: 4.3 | |
| On systems supporting macOS :prop_tgt:`FRAMEWORK` and :prop_tgt:`BUNDLE`, the | |
| following directories are searched for Frameworks or Application Bundles | |
| containing a configuration file: | |
| =============================================================== ========== | |
| Entry Convention | |
| =============================================================== ========== | |
| ``<prefix>/<name>.framework/Versions/*/Resources/CPS/`` [#p3]_ A | |
| ``<prefix>/<name>.framework/Resources/CPS/`` [#p3]_ A | |
| ``<prefix>/<name>.framework/Resources/`` A | |
| ``<prefix>/<name>.framework/Resources/CMake/`` A | |
| ``<prefix>/<name>.framework/Versions/*/Resources/`` A | |
| ``<prefix>/<name>.framework/Versions/*/Resources/CMake/`` A | |
| ``<prefix>/<name>.app/Contents/Resources/CPS/`` [#p3]_ A | |
| ``<prefix>/<name>.app/Contents/Resources/`` A | |
| ``<prefix>/<name>.app/Contents/Resources/CMake/`` A | |
| =============================================================== ========== | |
| .. [#p3] .. versionadded:: 4.3 | |
| When searching the above paths, ``find_package`` will only look for ``.cps`` | |
| files in search paths which contain ``/cps/``, and will only look for | |
| ``.cmake`` files otherwise. (This only applies to the paths as specified and | |
| does not consider the contents of ``<prefix>`` or ``<name>``.) | |
| In all cases the ``<name>`` is treated as case-insensitive and corresponds | |
| to any of the names specified (``<PackageName>`` or names given by ``NAMES``). | |
| If at least one compiled language has been enabled, the architecture-specific | |
| ``lib/<arch>`` and ``lib*`` directories may be searched based on the compiler's | |
| target architecture, in the following order: | |
| ``lib/<arch>`` | |
| Searched if the :variable:`CMAKE_LIBRARY_ARCHITECTURE` variable is set. | |
| ``lib64`` | |
| Searched on 64 bit platforms (:variable:`CMAKE_SIZEOF_VOID_P` is 8) and the | |
| :prop_gbl:`FIND_LIBRARY_USE_LIB64_PATHS` property is set to ``TRUE``. | |
| ``lib32`` | |
| Searched on 32 bit platforms (:variable:`CMAKE_SIZEOF_VOID_P` is 4) and the | |
| :prop_gbl:`FIND_LIBRARY_USE_LIB32_PATHS` property is set to ``TRUE``. | |
| ``libx32`` | |
| Searched on platforms using the x32 ABI | |
| if the :prop_gbl:`FIND_LIBRARY_USE_LIBX32_PATHS` property is set to ``TRUE``. | |
| ``lib`` | |
| Always searched. | |
| .. versionchanged:: 3.24 | |
| On ``Windows`` platform, it is possible to include registry queries as part | |
| of the directories specified through ``HINTS`` and ``PATHS`` keywords, using | |
| a :ref:`dedicated syntax <Find Using Windows Registry>`. Such specifications | |
| will be ignored on all other platforms. | |
| .. versionadded:: 3.24 | |
| ``REGISTRY_VIEW`` can be specified to manage ``Windows`` registry queries | |
| specified as part of ``PATHS`` and ``HINTS``. | |
| .. include:: include/FIND_XXX_REGISTRY_VIEW.rst | |
| If ``PATH_SUFFIXES`` is specified, the suffixes are appended to each | |
| (``W``) or (``U``) directory entry one-by-one. | |
| This set of directories is intended to work in cooperation with | |
| projects that provide configuration files in their installation trees. | |
| Directories above marked with (``W``) are intended for installations on | |
| Windows where the prefix may point at the top of an application's | |
| installation directory. Those marked with (``U``) are intended for | |
| installations on UNIX platforms where the prefix is shared by multiple | |
| packages. This is merely a convention, so all (``W``) and (``U``) directories | |
| are still searched on all platforms. Directories marked with (``A``) are | |
| intended for installations on Apple platforms. The | |
| :variable:`CMAKE_FIND_FRAMEWORK` and :variable:`CMAKE_FIND_APPBUNDLE` | |
| variables determine the order of preference. | |
| .. warning:: | |
| Setting :variable:`CMAKE_FIND_FRAMEWORK` or :variable:`CMAKE_FIND_APPBUNDLE` | |
| to values other than ``FIRST`` (the default) will cause CMake to search for | |
| |CPS| files in an order that is different from the order set forth in the | |
| specification. | |
| The set of installation prefixes is constructed using the following | |
| steps. If ``NO_DEFAULT_PATH`` is specified all ``NO_*`` options are | |
| enabled. | |
| 1. Search prefixes unique to the current ``<PackageName>`` being found. | |
| See policy :policy:`CMP0074`. | |
| .. versionadded:: 3.12 | |
| Specifically, search prefixes specified by the following variables, | |
| in order: | |
| a. :variable:`<PackageName>_ROOT` CMake variable, | |
| where ``<PackageName>`` is the case-preserved package name. | |
| b. :variable:`<PACKAGENAME>_ROOT` CMake variable, | |
| where ``<PACKAGENAME>`` is the upper-cased package name. | |
| See policy :policy:`CMP0144`. | |
| .. versionadded:: 3.27 | |
| c. :envvar:`<PackageName>_ROOT` environment variable, | |
| where ``<PackageName>`` is the case-preserved package name. | |
| d. :envvar:`<PACKAGENAME>_ROOT` environment variable, | |
| where ``<PACKAGENAME>`` is the upper-cased package name. | |
| See policy :policy:`CMP0144`. | |
| .. versionadded:: 3.27 | |
| The package root variables are maintained as a stack so if | |
| called from within a find module, root paths from the parent's find | |
| module will also be searched after paths for the current package. | |
| This can be skipped if ``NO_PACKAGE_ROOT_PATH`` is passed or by setting | |
| the :variable:`CMAKE_FIND_USE_PACKAGE_ROOT_PATH` to ``FALSE``. | |
| 2. Search paths specified in CMake-specific cache variables. These | |
| are intended to be used on the command line with a :option:`-DVAR=VALUE <cmake -D>`. | |
| The values are interpreted as :ref:`semicolon-separated lists <CMake Language Lists>`. | |
| This can be skipped if ``NO_CMAKE_PATH`` is passed or by setting the | |
| :variable:`CMAKE_FIND_USE_CMAKE_PATH` to ``FALSE``: | |
| * :variable:`CMAKE_PREFIX_PATH` | |
| * :variable:`CMAKE_FRAMEWORK_PATH` | |
| * :variable:`CMAKE_APPBUNDLE_PATH` | |
| 3. Search paths specified in CMake-specific environment variables. | |
| These are intended to be set in the user's shell configuration, | |
| and therefore use the host's native path separator | |
| (``;`` on Windows and ``:`` on UNIX). | |
| This can be skipped if ``NO_CMAKE_ENVIRONMENT_PATH`` is passed or by setting | |
| the :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH` to ``FALSE``: | |
| * ``<PackageName>_DIR`` | |
| * :envvar:`CMAKE_PREFIX_PATH` | |
| * :envvar:`CMAKE_FRAMEWORK_PATH` | |
| * :envvar:`CMAKE_APPBUNDLE_PATH` | |
| 4. Search paths specified by the ``HINTS`` option. These should be paths | |
| computed by system introspection, such as a hint provided by the | |
| location of another item already found. Hard-coded guesses should | |
| be specified with the ``PATHS`` option. | |
| 5. Search the standard system environment variables. This can be | |
| skipped if ``NO_SYSTEM_ENVIRONMENT_PATH`` is passed or by setting the | |
| :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH` to ``FALSE``. Path entries | |
| ending in ``/bin`` or ``/sbin`` are automatically converted to their | |
| parent directories: | |
| * ``PATH`` | |
| 6. Search paths stored in the CMake :ref:`User Package Registry`. | |
| This can be skipped if ``NO_CMAKE_PACKAGE_REGISTRY`` is passed or by | |
| setting the variable :variable:`CMAKE_FIND_USE_PACKAGE_REGISTRY` | |
| to ``FALSE`` or the deprecated variable | |
| :variable:`CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY` to ``TRUE``. | |
| See the :manual:`cmake-packages(7)` manual for details on the user | |
| package registry. | |
| 7. Search CMake variables defined in the Platform files for the | |
| current system. The searching of :variable:`CMAKE_INSTALL_PREFIX` and | |
| :variable:`CMAKE_STAGING_PREFIX` can be | |
| skipped if ``NO_CMAKE_INSTALL_PREFIX`` is passed or by setting the | |
| :variable:`CMAKE_FIND_USE_INSTALL_PREFIX` to ``FALSE``. All these locations | |
| can be skipped if ``NO_CMAKE_SYSTEM_PATH`` is passed or by setting the | |
| :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH` to ``FALSE``: | |
| * :variable:`CMAKE_SYSTEM_PREFIX_PATH` | |
| * :variable:`CMAKE_SYSTEM_FRAMEWORK_PATH` | |
| * :variable:`CMAKE_SYSTEM_APPBUNDLE_PATH` | |
| The platform paths that these variables contain are locations that | |
| typically include installed software. An example being ``/usr/local`` for | |
| UNIX based platforms. | |
| 8. Search paths stored in the CMake :ref:`System Package Registry`. | |
| This can be skipped if ``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` is passed | |
| or by setting the :variable:`CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY` | |
| variable to ``FALSE`` or the deprecated variable | |
| :variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` to ``TRUE``. | |
| See the :manual:`cmake-packages(7)` manual for details on the system | |
| package registry. | |
| 9. Search paths specified by the ``PATHS`` option. These are typically | |
| hard-coded guesses. | |
| The :variable:`CMAKE_IGNORE_PATH`, :variable:`CMAKE_IGNORE_PREFIX_PATH`, | |
| :variable:`CMAKE_SYSTEM_IGNORE_PATH` and | |
| :variable:`CMAKE_SYSTEM_IGNORE_PREFIX_PATH` variables can also cause some | |
| of the above locations to be ignored. | |
| Paths are searched in the order described above. The first viable package | |
| configuration file found is used, even if a newer version of the package | |
| resides later in the list of search paths. | |
| For search paths which contain glob expressions (``*``), directories matching | |
| the glob are searched in natural, descending order by default. This behavior | |
| can be overridden by setting variables :variable:`CMAKE_FIND_PACKAGE_SORT_ORDER` | |
| and :variable:`CMAKE_FIND_PACKAGE_SORT_DIRECTION` accordingly. Those variables | |
| determine the order in which CMake considers glob matches. For example, if the | |
| file system contains the package configuration files | |
| :: | |
| <prefix>/example-1.2/example-config.cmake | |
| <prefix>/example-1.10/example-config.cmake | |
| <prefix>/share/example-2.0/example-config.cmake | |
| then ``find_package(example)`` will (when the aforementioned variables are | |
| unset) pick ``example-1.10`` (assuming both ``example-1.2`` and ``example-1.10`` | |
| are viable). Note however that ``find_package`` will *not* find ``example-2.0``, | |
| because one of the other two will be found first. | |
| To control the order in which ``find_package`` searches directories that match | |
| a glob expression, use :variable:`CMAKE_FIND_PACKAGE_SORT_ORDER` and | |
| :variable:`CMAKE_FIND_PACKAGE_SORT_DIRECTION`. | |
| For instance, to cause the above example to select ``example-1.2``, | |
| one can set | |
| .. code-block:: cmake | |
| set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL) | |
| set(CMAKE_FIND_PACKAGE_SORT_DIRECTION ASC) | |
| before calling ``find_package``. | |
| .. versionadded:: 3.16 | |
| Added the ``CMAKE_FIND_USE_<CATEGORY>`` variables to globally disable | |
| various search locations. | |
| .. versionchanged:: 4.0 | |
| The variables :variable:`CMAKE_FIND_PACKAGE_SORT_ORDER` and | |
| :variable:`CMAKE_FIND_PACKAGE_SORT_DIRECTION` now also control the order | |
| in which ``find_package`` searches directories matching the glob expression | |
| in the search paths ``<prefix>/<name>.framework/Versions/*/Resources/`` | |
| and ``<prefix>/<name>.framework/Versions/*/Resources/CMake``. In previous | |
| versions of CMake, this order was unspecified. | |
| .. versionchanged:: 4.2 | |
| When encountering multiple viable matches, ``find_package`` now picks the | |
| one with the most recent version by default. In previous versions of CMake, | |
| the result was unspecified. Accordingly, the default of | |
| :variable:`CMAKE_FIND_PACKAGE_SORT_ORDER` has changed from ``NONE`` to | |
| ``NATURAL`` and :variable:`CMAKE_FIND_PACKAGE_SORT_DIRECTION` | |
| now defaults to ``DEC`` (descending) instead of ``ASC`` (ascending). | |
| .. include:: include/FIND_XXX_ROOT.rst | |
| .. include:: include/FIND_XXX_ORDER.rst | |
| By default the value stored in the result variable will be the path at | |
| which the file is found. The :variable:`CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS` | |
| variable may be set to ``TRUE`` before calling ``find_package`` in order | |
| to resolve symbolic links and store the real path to the file. | |
| Every non-REQUIRED ``find_package`` call can be disabled or made REQUIRED: | |
| * Setting the :variable:`CMAKE_DISABLE_FIND_PACKAGE_<PackageName>` variable | |
| to ``TRUE`` disables the package. This also disables redirection to a | |
| package provided by :module:`FetchContent`. | |
| * Setting the :variable:`CMAKE_REQUIRE_FIND_PACKAGE_<PackageName>` variable | |
| to ``TRUE`` makes the package REQUIRED. | |
| Setting both variables to ``TRUE`` simultaneously is an error. | |
| The :variable:`CMAKE_REQUIRE_FIND_PACKAGE_<PackageName>` variable takes priority | |
| over the ``OPTIONAL`` keyword in determining whether a package is required. | |
| .. _`version selection`: | |
| Config Mode Version Selection | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| .. note:: | |
| When Config mode is used, this version selection process is applied | |
| regardless of whether the :ref:`full <full signature>` or | |
| :ref:`basic <basic signature>` signature was given. | |
| When the ``<version>`` argument is given, Config mode will only find a | |
| version of the package that claims compatibility with the requested | |
| version (see :ref:`format specification <FIND_PACKAGE_VERSION_FORMAT>`). If | |
| the ``EXACT`` option is given, only a version of the package claiming an exact | |
| match of the requested version may be found. CMake does not establish any | |
| convention for the meaning of version numbers. | |
| .. _`cmake script version selection`: | |
| CMake-script | |
| """""""""""" | |
| For CMake-script package configuration files, package version numbers are | |
| checked by "version" files provided by the packages themselves or by | |
| :module:`FetchContent`. For a candidate package configuration file | |
| ``<config-file>.cmake`` the corresponding version file is located next | |
| to it and named either ``<config-file>-version.cmake`` or | |
| ``<config-file>Version.cmake``. If no such version file is available | |
| then the configuration file is assumed to not be compatible with any | |
| requested version. A basic version file containing generic version | |
| matching code can be created using the | |
| :module:`CMakePackageConfigHelpers` module. When a version file | |
| is found it is loaded to check the requested version number. The | |
| version file is loaded in a nested scope in which the following | |
| variables have been defined: | |
| ``PACKAGE_FIND_NAME`` | |
| The ``<PackageName>`` | |
| ``PACKAGE_FIND_VERSION`` | |
| Full requested version string | |
| ``PACKAGE_FIND_VERSION_MAJOR`` | |
| Major version if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MINOR`` | |
| Minor version if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_PATCH`` | |
| Patch version if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_TWEAK`` | |
| Tweak version if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_COUNT`` | |
| Number of version components, 0 to 4 | |
| When a version range is specified, the above version variables will hold | |
| values based on the lower end of the version range. This is to preserve | |
| compatibility with packages that have not been implemented to expect version | |
| ranges. In addition, the version range will be described by the following | |
| variables: | |
| ``PACKAGE_FIND_VERSION_RANGE`` | |
| Full requested version range string | |
| ``PACKAGE_FIND_VERSION_RANGE_MIN`` | |
| This specifies whether the lower end point of the version range should be | |
| included or excluded. Currently, the only supported value for this variable | |
| is ``INCLUDE``. | |
| ``PACKAGE_FIND_VERSION_RANGE_MAX`` | |
| This specifies whether the upper end point of the version range should be | |
| included or excluded. The supported values for this variable are | |
| ``INCLUDE`` and ``EXCLUDE``. | |
| ``PACKAGE_FIND_VERSION_MIN`` | |
| Full requested version string of the lower end point of the range | |
| ``PACKAGE_FIND_VERSION_MIN_MAJOR`` | |
| Major version of the lower end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MIN_MINOR`` | |
| Minor version of the lower end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MIN_PATCH`` | |
| Patch version of the lower end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MIN_TWEAK`` | |
| Tweak version of the lower end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MIN_COUNT`` | |
| Number of version components of the lower end point, 0 to 4 | |
| ``PACKAGE_FIND_VERSION_MAX`` | |
| Full requested version string of the upper end point of the range | |
| ``PACKAGE_FIND_VERSION_MAX_MAJOR`` | |
| Major version of the upper end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MAX_MINOR`` | |
| Minor version of the upper end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MAX_PATCH`` | |
| Patch version of the upper end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MAX_TWEAK`` | |
| Tweak version of the upper end point if requested, else 0 | |
| ``PACKAGE_FIND_VERSION_MAX_COUNT`` | |
| Number of version components of the upper end point, 0 to 4 | |
| Regardless of whether a single version or a version range is specified, the | |
| variable ``PACKAGE_FIND_VERSION_COMPLETE`` will be defined and will hold | |
| the full requested version string as specified. | |
| The version file checks whether it satisfies the requested version and | |
| sets these variables: | |
| ``PACKAGE_VERSION`` | |
| Full provided version string | |
| ``PACKAGE_VERSION_EXACT`` | |
| True if version is exact match | |
| ``PACKAGE_VERSION_COMPATIBLE`` | |
| True if version is compatible | |
| ``PACKAGE_VERSION_UNSUITABLE`` | |
| True if unsuitable as any version | |
| These variables are checked by the ``find_package`` command to determine | |
| whether the configuration file provides an acceptable version. They | |
| are not available after the ``find_package`` call returns. If the version | |
| is acceptable, the following variables are set: | |
| ``<PackageName>_VERSION`` | |
| Full provided version string | |
| ``<PackageName>_VERSION_MAJOR`` | |
| Major version if provided, else 0 | |
| ``<PackageName>_VERSION_MINOR`` | |
| Minor version if provided, else 0 | |
| ``<PackageName>_VERSION_PATCH`` | |
| Patch version if provided, else 0 | |
| ``<PackageName>_VERSION_TWEAK`` | |
| Tweak version if provided, else 0 | |
| ``<PackageName>_VERSION_COUNT`` | |
| Number of version components, 0 to 4 | |
| and the corresponding package configuration file is loaded. | |
| .. note:: | |
| While the exact behavior of version matching is determined by the individual | |
| package, many packages use :command:`write_basic_package_version_file` to | |
| supply this logic. The version check scripts this produces have some notable | |
| caveats with respect to version ranges: | |
| * The upper end of a version range acts as a hard limit on what versions will | |
| be accepted. Thus, while a request for version ``1.4.0`` might be | |
| satisfied by a package whose version is ``1.6.0`` and which advertises | |
| 'same major version' compatibility, the same package will be rejected if | |
| the requested version range is ``1.4.0...1.5.0``. | |
| * Both ends of the version range must match the package's advertised | |
| compatibility level. For example, if a package advertises 'same major and | |
| minor version' compatibility, requesting the version range | |
| ``1.4.0...<1.5.5`` or ``1.4.0...1.5.0`` will result in that package being | |
| rejected, even if the package version is ``1.4.1``. | |
| As a result, it is not possible to use a version range to extend the range | |
| of compatible package versions that will be accepted. | |
| .. _`cps version selection`: | |
| |CPS| | |
| """"" | |
| For |CPS| package configuration files, package version numbers are checked by | |
| CMake according to the set of recognized version schemas. At present, the | |
| following schemas are recognized: | |
| ``simple`` | |
| Version numbers are a tuple of integers followed by an optional trailing | |
| segment which is ignored with respect to version comparisons. | |
| ``custom`` | |
| The mechanism for interpreting version numbers is unspecified. The version | |
| strings must match exactly for the package to be accepted. | |
| Refer to |cps-version_schema|_ for a more detailed explanation of each schema | |
| and how comparisons for each are performed. Note that the specification may | |
| include schemas that are not supported by CMake. | |
| In addition to the package's ``version``, CPS allows packages to optionally | |
| specify a |cps-compat_version|_, which is the oldest version for which the | |
| package provides compatibility. That is, the package warrants that a consumer | |
| expecting the ``compat_version`` should be able to use the package, even if the | |
| package's actual version is newer. If not specified, the ``compat_version`` | |
| is implicitly equal to the package version, i.e. no backwards compatibility is | |
| provided. | |
| .. TODO Rework the preceding paragraph when COMPAT_VERSION has broader support | |
| in CMake. | |
| When a package uses a recognized schema, CMake will determine the package's | |
| acceptability according to the following rules: | |
| * If ``EXACT`` was specified, or if the package does not supply a | |
| ``compat_version``, the package's ``version`` must equal the requested | |
| version. | |
| * Otherwise: | |
| * The package's ``version`` must be greater than or equal to the requested | |
| (minimum) version, and | |
| * the package's ``compat_version`` must be less than or equal to the | |
| requested (minimum) version, and | |
| * if a requested maximum version was given, it must be greater than (or equal | |
| to, depending on whether the maximum version is specified as inclusive or | |
| exclusive) the package's ``version``. | |
| .. note:: | |
| This implementation of range matching was chosen in order to most closely | |
| match the behavior of :command:`write_basic_package_version_file`, albeit | |
| without the case where an overly broad range matches nothing. | |
| For packages using the ``simple`` version schema, if the version is acceptable, | |
| the following variables are set: | |
| ``<PackageName>_VERSION`` | |
| Full provided version string | |
| ``<PackageName>_VERSION_MAJOR`` | |
| Major version if provided, else 0 | |
| ``<PackageName>_VERSION_MINOR`` | |
| Minor version if provided, else 0 | |
| ``<PackageName>_VERSION_PATCH`` | |
| Patch version if provided, else 0 | |
| ``<PackageName>_VERSION_TWEAK`` | |
| Tweak version if provided, else 0 | |
| ``<PackageName>_VERSION_COUNT`` | |
| Number of version components, non-negative | |
| Package File Interface Variables | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| When loading a find module or CMake-script package configuration file, | |
| ``find_package`` defines variables to provide information about the call | |
| arguments (and restores their original state before returning): | |
| ``CMAKE_FIND_PACKAGE_NAME`` | |
| The ``<PackageName>`` which is searched for | |
| ``<PackageName>_FIND_REQUIRED`` | |
| True if ``REQUIRED`` option was given | |
| ``<PackageName>_FIND_QUIETLY`` | |
| True if ``QUIET`` option was given | |
| ``<PackageName>_FIND_REGISTRY_VIEW`` | |
| The requested view if ``REGISTRY_VIEW`` option was given | |
| ``<PackageName>_FIND_VERSION`` | |
| Full requested version string | |
| ``<PackageName>_FIND_VERSION_MAJOR`` | |
| Major version if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MINOR`` | |
| Minor version if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_PATCH`` | |
| Patch version if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_TWEAK`` | |
| Tweak version if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_COUNT`` | |
| Number of version components, 0 to 4 | |
| ``<PackageName>_FIND_VERSION_EXACT`` | |
| True if ``EXACT`` option was given | |
| ``<PackageName>_FIND_COMPONENTS`` | |
| List of specified components (required and optional) | |
| ``<PackageName>_FIND_REQUIRED_<c>`` | |
| True if component ``<c>`` is required, | |
| false if component ``<c>`` is optional | |
| When a version range is specified, the above version variables will hold | |
| values based on the lower end of the version range. This is to preserve | |
| compatibility with packages that have not been implemented to expect version | |
| ranges. In addition, the version range will be described by the following | |
| variables: | |
| ``<PackageName>_FIND_VERSION_RANGE`` | |
| Full requested version range string | |
| ``<PackageName>_FIND_VERSION_RANGE_MIN`` | |
| This specifies whether the lower end point of the version range is | |
| included or excluded. Currently, ``INCLUDE`` is the only supported value. | |
| ``<PackageName>_FIND_VERSION_RANGE_MAX`` | |
| This specifies whether the upper end point of the version range is | |
| included or excluded. The possible values for this variable are | |
| ``INCLUDE`` or ``EXCLUDE``. | |
| ``<PackageName>_FIND_VERSION_MIN`` | |
| Full requested version string of the lower end point of the range | |
| ``<PackageName>_FIND_VERSION_MIN_MAJOR`` | |
| Major version of the lower end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MIN_MINOR`` | |
| Minor version of the lower end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MIN_PATCH`` | |
| Patch version of the lower end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MIN_TWEAK`` | |
| Tweak version of the lower end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MIN_COUNT`` | |
| Number of version components of the lower end point, 0 to 4 | |
| ``<PackageName>_FIND_VERSION_MAX`` | |
| Full requested version string of the upper end point of the range | |
| ``<PackageName>_FIND_VERSION_MAX_MAJOR`` | |
| Major version of the upper end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MAX_MINOR`` | |
| Minor version of the upper end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MAX_PATCH`` | |
| Patch version of the upper end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MAX_TWEAK`` | |
| Tweak version of the upper end point if requested, else 0 | |
| ``<PackageName>_FIND_VERSION_MAX_COUNT`` | |
| Number of version components of the upper end point, 0 to 4 | |
| Regardless of whether a single version or a version range is specified, the | |
| variable ``<PackageName>_FIND_VERSION_COMPLETE`` will be defined and will hold | |
| the full requested version string as specified. | |
| In Module mode the loaded find module is responsible to honor the | |
| request detailed by these variables; see the find module for details. | |
| In Config mode ``find_package`` handles ``REQUIRED``, ``QUIET``, and | |
| ``<version>`` options automatically but leaves it to the package | |
| configuration file to handle components in a way that makes sense | |
| for the package. The package configuration file may set | |
| ``<PackageName>_FOUND`` to false to tell ``find_package`` that component | |
| requirements are not satisfied. | |
| CPS Transitive Requirements | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| A |CPS| package description consists of one or more components which may in | |
| turn depend on other components either internal or external to the package. | |
| When external components are required, the providing package is noted as | |
| a package-level requirement of the package. Additionally, the set of required | |
| components is typically noted in said external package requirement. | |
| Where a CMake-script package description would use the | |
| :command:`find_dependency` command to handle transitive dependencies, CMake | |
| handles transitive dependencies for CPS itself using an internally nested | |
| ``find_package`` call. This call can resolve CPS package dependencies via | |
| *either* another CPS package, or via a CMake-script package. The manner in | |
| which the CPS component dependencies are handled is subject to some caveats. | |
| When the candidate for resolving a transitive dependency is another CPS | |
| package, things are simple; ``COMPONENTS`` and CPS "components" are directly | |
| comparable (and are effectively synonymous with CMake "imported targets"). | |
| CMake-script packages, however, are encouraged to (and often do) check that | |
| required components were found, whether or not the package describes separate | |
| components. Additionally, even those that do describe components typically do | |
| not have the same correlation to imported targets that is normal for CPS. As | |
| a result, passing the set of required components declared by a CPS package to | |
| ``COMPONENTS`` would result in spurious failures to resolve dependencies. | |
| To address this, if a candidate for resolving a CPS transitive dependency is a | |
| CMake-script package, CMake passes the required components as declared by the | |
| consuming CPS package as ``OPTIONAL_COMPONENTS`` and performs a separate, | |
| internal check that the candidate package supplied the required imported | |
| targets. Those targets must be named ``<PackageName>::<ComponentName>``, in | |
| conformance with CPS convention, or the check will consider the package not | |
| found. | |
| .. _CPS: https://cps-org.github.io/cps/ | |
| .. |CPS| replace:: Common Package Specification | |
| .. _cps-compat_version: https://cps-org.github.io/cps/schema.html#compat-version | |
| .. |cps-compat_version| replace:: ``compat_version`` | |
| .. _cps-version_schema: https://cps-org.github.io/cps/schema.html#version-schema | |
| .. |cps-version_schema| replace:: ``version_schema`` |