Browse Source

Merge topic 'fetchcontent-redirect-version-exact'

48b380c961 FetchContent: Ignore EXACT for redirected find_package() calls

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7665
Brad King 3 years ago
parent
commit
64f4bb5728

+ 6 - 3
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

+ 4 - 1
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)

+ 4 - 0
Tests/RunCMake/FetchContent_find_package/PreferFetchContent.cmake

@@ -18,3 +18,7 @@ message(STATUS "Lowercase extra file was read")
 
 # This is expected to be re-routed to a FetchContent_MakeAvailable() call
 find_package(AddedProject REQUIRED)
+
+# Verify that find_package() version constraints are fully ignored by the
+# default-generated config version file
+find_package(AddedProject 1.2.3 EXACT REQUIRED)