From 5eb173a0fd308b835def6a32789c9451efb2be13 Mon Sep 17 00:00:00 2001
From: Tim Kaune <tim.kaune@gmx.de>
Date: Wed, 21 Feb 2024 14:16:07 +0100
Subject: [PATCH] Automatically propagate minimum required CMake version

The package config and tests take the minimum required CMake version
from the main project.

Also introduce the maximum supported CMake version for policy management.
---
 CMakeLists.txt                                  | 15 +++++++++++----
 packaging/CMakeLists.txt                        | 17 ++++++++++++++---
 ...e => LoadStaticSharedTargetsConfig.cmake.in} | 17 ++++++++++++-----
 tests/CMakeLists.txt                            | 14 ++++++++++++--
 tests/helpers/test_case_wrapper.cmake           | 10 ++++++++++
 5 files changed, 59 insertions(+), 14 deletions(-)
 rename packaging/{LoadStaticSharedTargetsConfig.cmake => LoadStaticSharedTargetsConfig.cmake.in} (69%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9136e61..ef48ac0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,10 +25,17 @@ SOFTWARE.
 
 cmake_minimum_required(VERSION 3.25)
 
-# If CMake >=3.24 is used, set policies up to v3.24 to NEW
-# if (NOT ${CMAKE_VERSION} VERSION_LESS 3.24)
-#     cmake_policy(VERSION 3.24)
-# endif()
+set(CMAKE_MAXIMUM_SUPPORTED_VERSION 3.28)
+
+# If CMAKE_VERSION <= CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up
+# to CMAKE_VERSION to NEW
+if (${CMAKE_VERSION} VERSION_LESS_EQUAL ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+    cmake_policy(VERSION ${CMAKE_VERSION})
+# If CMAKE_VERSION > CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up to
+# CMAKE_MAXIMUM_SUPPORTED_VERSION to NEW
+else ()
+    cmake_policy(VERSION ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+endif()
 
 project(LoadStaticSharedTargets VERSION 1.4.1 LANGUAGES NONE)
 
diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt
index 9f30981..ba64606 100644
--- a/packaging/CMakeLists.txt
+++ b/packaging/CMakeLists.txt
@@ -26,8 +26,13 @@ SOFTWARE.
 include(CMakePackageConfigHelpers)
 
 if (NOT DEFINED LoadStaticSharedTargets_INSTALL_CMAKEDIR)
-    set(LoadStaticSharedTargets_INSTALL_CMAKEDIR "${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}"
-        CACHE STRING "Path to LoadStaticSharedTargets CMake files")
+    set(
+        LoadStaticSharedTargets_INSTALL_CMAKEDIR
+        "${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}"
+        CACHE
+        STRING
+        "Path to LoadStaticSharedTargets CMake files"
+    )
 endif ()
 
 install(
@@ -42,10 +47,16 @@ write_basic_package_version_file(
     COMPATIBILITY SameMajorVersion
 )
 
+configure_file(
+    "LoadStaticSharedTargetsConfig.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/LoadStaticSharedTargetsConfig.cmake"
+    @ONLY
+)
+
 install(
     FILES
     "${CMAKE_CURRENT_BINARY_DIR}/LoadStaticSharedTargetsConfigVersion.cmake"
-    "LoadStaticSharedTargetsConfig.cmake"
+    "${CMAKE_CURRENT_BINARY_DIR}/LoadStaticSharedTargetsConfig.cmake"
     "../src/cmake/LoadStaticSharedTargets.cmake"
     DESTINATION "${LoadStaticSharedTargets_INSTALL_CMAKEDIR}"
 )
diff --git a/packaging/LoadStaticSharedTargetsConfig.cmake b/packaging/LoadStaticSharedTargetsConfig.cmake.in
similarity index 69%
rename from packaging/LoadStaticSharedTargetsConfig.cmake
rename to packaging/LoadStaticSharedTargetsConfig.cmake.in
index 3a59913..dd26084 100644
--- a/packaging/LoadStaticSharedTargetsConfig.cmake
+++ b/packaging/LoadStaticSharedTargetsConfig.cmake.in
@@ -23,12 +23,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 ]]
 
-cmake_minimum_required(VERSION 3.25)
+cmake_minimum_required(VERSION @CMAKE_MINIMUM_REQUIRED_VERSION@)
 
-# If CMake >=3.24 is used, set policies up to v3.24 to NEW
-# if (NOT ${CMAKE_VERSION} VERSION_LESS 3.24)
-#     cmake_policy(VERSION 3.24)
-# endif()
+set(CMAKE_MAXIMUM_SUPPORTED_VERSION @CMAKE_MAXIMUM_SUPPORTED_VERSION@)
+
+# If CMAKE_VERSION <= CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up
+# to CMAKE_VERSION to NEW
+if (${CMAKE_VERSION} VERSION_LESS_EQUAL ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+    cmake_policy(VERSION ${CMAKE_VERSION})
+# If CMAKE_VERSION > CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up to
+# CMAKE_MAXIMUM_SUPPORTED_VERSION to NEW
+else ()
+    cmake_policy(VERSION ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+endif()
 
 # include(LoadStaticSharedTargets) should work after this
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index dee4f65..7fb6d78 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -64,7 +64,12 @@ set(
 foreach (TEST_CASE IN LISTS TEST_CASES TEST_CASES_WITH_WARNING)
     add_test(
         NAME "${TEST_CASE}"
-        COMMAND "${CMAKE_COMMAND}" -D CMAKE_MINIMUM_REQUIRED_VERSION=${CMAKE_MINIMUM_REQUIRED_VERSION} -D "TEST_CASE=${TEST_CASE}" -P "./helpers/test_case_wrapper.cmake"
+        COMMAND
+        "${CMAKE_COMMAND}"
+        -D CMAKE_MINIMUM_REQUIRED_VERSION=${CMAKE_MINIMUM_REQUIRED_VERSION}
+        -D CMAKE_MAXIMUM_SUPPORTED_VERSION=${CMAKE_MAXIMUM_SUPPORTED_VERSION}
+        -D "TEST_CASE=${TEST_CASE}"
+        -P "./helpers/test_case_wrapper.cmake"
         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
     )
 endforeach ()
@@ -72,7 +77,12 @@ endforeach ()
 foreach (TEST_CASE IN LISTS TEST_CASES_WITH_WARNING)
     add_test(
         NAME "${TEST_CASE}_check-warning"
-        COMMAND "${CMAKE_COMMAND}" -D CMAKE_MINIMUM_REQUIRED_VERSION=${CMAKE_MINIMUM_REQUIRED_VERSION} -D "TEST_CASE=${TEST_CASE}" -P "./helpers/test_case_wrapper.cmake"
+        COMMAND
+        "${CMAKE_COMMAND}"
+        -D CMAKE_MINIMUM_REQUIRED_VERSION=${CMAKE_MINIMUM_REQUIRED_VERSION}
+        -D CMAKE_MAXIMUM_SUPPORTED_VERSION=${CMAKE_MAXIMUM_SUPPORTED_VERSION}
+        -D "TEST_CASE=${TEST_CASE}"
+        -P "./helpers/test_case_wrapper.cmake"
         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
     )
 
diff --git a/tests/helpers/test_case_wrapper.cmake b/tests/helpers/test_case_wrapper.cmake
index 744a3e0..53c695b 100644
--- a/tests/helpers/test_case_wrapper.cmake
+++ b/tests/helpers/test_case_wrapper.cmake
@@ -25,6 +25,16 @@ SOFTWARE.
 
 cmake_policy(VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION})
 
+# If CMAKE_VERSION <= CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up
+# to CMAKE_VERSION to NEW
+if (${CMAKE_VERSION} VERSION_LESS_EQUAL ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+    cmake_policy(VERSION ${CMAKE_VERSION})
+# If CMAKE_VERSION > CMAKE_MAXIMUM_SUPPORTED_VERSION is used, set policies up to
+# CMAKE_MAXIMUM_SUPPORTED_VERSION to NEW
+else ()
+    cmake_policy(VERSION ${CMAKE_MAXIMUM_SUPPORTED_VERSION})
+endif()
+
 include("./helpers/assertions.cmake")
 include("../src/cmake/LoadStaticSharedTargets.cmake")
 
-- 
GitLab