summaryrefslogtreecommitdiffstats
path: root/cmake/QtCMakeVersionHelpers.cmake
blob: 274af52cd1b4ec820b6a529efecfaf5e9a106753 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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()