diff options
author | Craig Scott <craig.scott@crascit.com> | 2022-09-11 07:54:57 (GMT) |
---|---|---|
committer | Craig Scott <craig.scott@crascit.com> | 2022-09-11 08:36:31 (GMT) |
commit | 48b380c9613318b888473aa6f178d06de3f21e7e (patch) | |
tree | 181a1a2b988db2152ab087fedb8c5d9fa0907207 /Modules | |
parent | a2f9e674bb15d91af15cec815a5c40c0ecc2ee9f (diff) | |
download | CMake-48b380c9613318b888473aa6f178d06de3f21e7e.zip CMake-48b380c9613318b888473aa6f178d06de3f21e7e.tar.gz CMake-48b380c9613318b888473aa6f178d06de3f21e7e.tar.bz2 |
FetchContent: Ignore EXACT for redirected find_package() calls
When FetchContent_MakeAvailable() populates a dependency for which
find_package() integration is enabled, all future calls to find_package()
MUST succeed using the contents of the redirection directory. The
generated config version file was not handling calls where the EXACT
keyword was given, resulting in such calls rejecting the redirection
directory's contents and continuing its search. It is not allowed to do
that. Fix the generated file to also set PACKAGE_VERSION_EXACT to
true so that calls with EXACT now accept it, as was originally intended.
Fixes: #23950
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/FetchContent.cmake | 9 | ||||
-rw-r--r-- | Modules/FetchContent/package-config-version.cmake.in | 5 |
2 files changed, 10 insertions, 4 deletions
diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 20f0bd2..09a1512 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -303,13 +303,16 @@ Commands ``<lowercaseName>-extra.cmake`` or ``<name>Extra.cmake`` file with the ``OPTIONAL`` flag (so the files can be missing and won't generate a warning). Similarly, if no config version file exists, a very simple - one will be written which sets ``PACKAGE_VERSION_COMPATIBLE`` to true. + one will be written which sets ``PACKAGE_VERSION_COMPATIBLE`` and + ``PACKAGE_VERSION_EXACT`` to true. This ensures all future calls to + :command:`find_package()` for the dependency will use the redirected + config file, regardless of any version requirements. CMake cannot automatically determine an arbitrary dependency's version, - so it cannot set ``PACKAGE_VERSION`` or ``PACKAGE_VERSION_EXACT``. + so it cannot set ``PACKAGE_VERSION``. When a dependency is pulled in via :command:`add_subdirectory` in the next step, it may choose to overwrite the generated config version file in :variable:`CMAKE_FIND_PACKAGE_REDIRECTS_DIR` with one that also sets - ``PACKAGE_VERSION``, and if appropriate, ``PACKAGE_VERSION_EXACT``. + ``PACKAGE_VERSION``. The dependency may also write a ``<lowercaseName>-extra.cmake`` or ``<name>Extra.cmake`` file to perform custom processing or define any variables that their normal (installed) package config file would diff --git a/Modules/FetchContent/package-config-version.cmake.in b/Modules/FetchContent/package-config-version.cmake.in index 7f19094..9fcade7 100644 --- a/Modules/FetchContent/package-config-version.cmake.in +++ b/Modules/FetchContent/package-config-version.cmake.in @@ -1,5 +1,8 @@ # Automatically generated by CMake's FetchContent module. # Do not edit this file, it will be regenerated every time CMake runs. -# Version not available, assuming it is compatible +# Version not available, assuming it is compatible. We must also say it is an +# exact match to ensure find_package() calls with the EXACT keyword still get +# redirected. set(PACKAGE_VERSION_COMPATIBLE TRUE) +set(PACKAGE_VERSION_EXACT TRUE) |