summaryrefslogtreecommitdiffstats
path: root/cmake/QtCMakeVersionHelpers.cmake
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2020-10-30 17:42:34 +0100
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-11-03 13:06:14 +0100
commit72aab8b4875dc3b14ef4a72a881047f4ef619f3d (patch)
tree1f2269799daa7ccfaad64657cf1259780c96895d /cmake/QtCMakeVersionHelpers.cmake
parentaaabdf8457705be82fd368bb2320264a538d1161 (diff)
CMake: Bump the minimum required CMake version to build Qt to 3.18
Add a new function that returns the minimum CMake version required to build Qt. Pass that value to cmake_minimum_required() when building qtbase and its standalone tests. The minimum supported CMake version is read from qtbase/.cmake.conf and its value should be updated when the need arises. It's the main source of truth for all repos. Provide a way to lower the minimum CMake version at configure time by passing a value via QT_FORCE_MIN_CMAKE_VERSION. This is not an officially supported way of building Qt. If the specified version is lower than Qt's supported minimum, show a warning. Nevertheless the option is useful for testing how Qt builds with a different minimum CMake version due to different policies being enabled by default. Issue warnings for CMake versions that are higher than the minimum version but are known to cause issues when building Qt. A counterpart change is needed in qt5 to ensure the minimum CMake version is set at the proper time for top-level builds. Ideally we would use the same 'check the CMake minimum version` code in all our repositories, but that will cause lots of duplication because we can't really find_package() the code and doing something like include(../qtbase/foo.cmake) hardcodes assumptions about repo locations. So for now we don't bump the minimum version in child repo cmake_minimum_required calls (qtsvg, qtdeclarative, etc). Instead we record both the minimum supported version and the computed minimum version (in case a different version was forced) in QtBuildInternalsExtra.cmake. Then we require qtbase's computed min version in qt_build_repo_begin(). This won't set policies as cmake_minimum_required would, but at least it propagates what minimum CMake version should be used for child repos. We might still have to bump the versions in child repos at some point. Task-number: QTBUG-88086 Change-Id: Ida1c0d5d3e0fbb15d2aee9b68abab7a1648774b9 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Diffstat (limited to 'cmake/QtCMakeVersionHelpers.cmake')
-rw-r--r--cmake/QtCMakeVersionHelpers.cmake102
1 files changed, 102 insertions, 0 deletions
diff --git a/cmake/QtCMakeVersionHelpers.cmake b/cmake/QtCMakeVersionHelpers.cmake
new file mode 100644
index 0000000000..274af52cd1
--- /dev/null
+++ b/cmake/QtCMakeVersionHelpers.cmake
@@ -0,0 +1,102 @@
+# Returns the minimum supported CMake version required to build Qt as originally advertised by Qt.
+function(qt_internal_get_qt_supported_minimum_cmake_version out_var)
+ # QT_MIN_SUPPORTED_CMAKE_VERSION is set either in .cmake.conf or in QtBuildInternalsExtras.cmake
+ # when building a child repo.
+ set(supported_version "${QT_MIN_SUPPORTED_CMAKE_VERSION}")
+ set(${out_var} "${supported_version}" PARENT_SCOPE)
+endfunction()
+
+# Returns the computed minimum supported CMake version required to build Qt.
+function(qt_internal_get_computed_minimum_cmake_version out_var)
+ qt_internal_get_qt_supported_minimum_cmake_version(min_supported_version)
+ set(computed_min_version "${min_supported_version}")
+
+ # Set in QtBuildInternalsExtras.cmake.
+ if(QT_COMPUTED_MIN_CMAKE_VERSION)
+ set(computed_min_version "${QT_COMPUTED_MIN_CMAKE_VERSION}")
+ endif()
+
+ # An explicit override for those that take it upon themselves to fix the build system
+ # when using a CMake version lower than the one officially supported.
+ # Also useful for build testing locally with different minimum versions to observe different
+ # policy behaviors.
+ if(QT_FORCE_MIN_CMAKE_VERSION)
+ set(computed_min_version "${QT_FORCE_MIN_CMAKE_VERSION}")
+ endif()
+
+ set(${out_var} "${computed_min_version}" PARENT_SCOPE)
+endfunction()
+
+function(qt_internal_check_for_suitable_cmake_version)
+ # Implementation note.
+ # The very first cmake_required_version() call can't be placed in an include()d file.
+ # It causes CMake to fail to configure with 'No cmake_minimum_required command is present.'
+ # The first cmake_required_version() must be called directly in the top-level CMakeLists.txt
+ # file.
+ # That's why this function only handles output of warnings, and doesn't try to set the required
+ # version.
+ qt_internal_check_minimum_cmake_version()
+ qt_internal_warn_about_unsuitable_cmake_versions()
+endfunction()
+
+# Function to be used in child repos like qtsvg to require a minimum CMake version.
+#
+# Such repos don't have the required version information at cmake_required_version() time, that's
+# why we provide this function to be called at a time when the info is available.
+function(qt_internal_require_suitable_cmake_version)
+ qt_internal_check_for_suitable_cmake_version()
+ qt_internal_get_computed_minimum_cmake_version(computed_min_version)
+
+ if(CMAKE_VERSION VERSION_LESS computed_min_version)
+ message(FATAL_ERROR "CMake ${computed_min_version} or higher is required. "
+ "You are running version ${CMAKE_VERSION}")
+ endif()
+endfunction()
+
+function(qt_internal_check_minimum_cmake_version)
+ qt_internal_get_qt_supported_minimum_cmake_version(min_supported_version)
+ qt_internal_get_computed_minimum_cmake_version(computed_min_version)
+
+ if(NOT min_supported_version STREQUAL computed_min_version
+ AND computed_min_version VERSION_LESS min_supported_version)
+ message(WARNING
+ "The minimum required CMake version to build Qt is '${min_supported_version}'. "
+ "You have explicitly chosen to require a lower minimum CMake version, namely '${computed_min_version}'. "
+ "Building Qt with such a CMake version is not officially supported. Use at your own risk.")
+ endif()
+endfunction()
+
+function(qt_internal_warn_about_unsuitable_cmake_versions)
+ set(unsuitable_versions "")
+
+ # Touching a library's source file causes unnecessary rebuilding of unrelated targets.
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/21020
+ list(APPEND unsuitable_versions "3.18.0")
+
+ # Ninja Multi-Config race condition overrides response files of different configurations
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/20961
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/21050 (follow up issue)
+ list(APPEND unsuitable_versions "3.18.1")
+
+ # AUTOMOC dependencies are not properly created when using Ninja Multi-Config.
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/21118
+ #
+ # Also until 3.18.2 inclusive, AUTOMOC dependencies are out-of-date if a previously header
+ # disappears (for example when upgrading a compiler)
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/21136
+ #
+ # Also multi-arch PCH doesn't work on iOS. Can't quite find the original upstream CMake issue
+ # but the Qt one was detected at https://codereview.qt-project.org/c/qt/qt5/+/310947
+ # And a follow up issue regarding PCH and -fembed-bitcode failing.
+ # https://gitlab.kitware.com/cmake/cmake/-/issues/21163
+ list(APPEND unsuitable_versions "3.18.2")
+
+ foreach(unsuitable_version ${unsuitable_versions})
+ if(CMAKE_VERSION VERSION_EQUAL unsuitable_version)
+ message(WARNING
+ "The CMake version you are using is known to cause issues when building Qt. "
+ "Please upgrade to a newer version. "
+ "CMake version used: '${unsuitable_version}'")
+ endif()
+ endforeach()
+endfunction()