aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/Utils.cmake
blob: 1385f9e0760e535490c9e335c8f72b89b7bfc052 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
function (env_with_default envName varToSet default)
  if(DEFINED ENV{${envName}})
    set(${varToSet} $ENV{${envName}} PARENT_SCOPE)
  else()
    set(${varToSet} ${default} PARENT_SCOPE)
  endif()
endfunction()

function(setup_dependencies_component)
  find_package(Python3 COMPONENTS Interpreter)
  if (NOT Python3_Interpreter_FOUND)
    message("No python interpreter found, skipping \"Dependencies\" install component.")
  else()
    get_target_property(_qmake_binary Qt::qmake IMPORTED_LOCATION)
    set(_llvm_arg)
    if (LLVM_INSTALL_PREFIX)
      set(_llvm_arg "--llvm \"${LLVM_INSTALL_PREFIX}\"")
    endif()
    set(_elfutils_arg)
    if (ELFUTILS_INCLUDE_DIR)
      get_filename_component(_elfutils_path ${ELFUTILS_INCLUDE_DIR} DIRECTORY)
      set(_elfutils_arg "--elfutils \"${_elfutils_path}\"")
    endif()
    install(CODE "
        if (CMAKE_VERSION GREATER_EQUAL 3.19)
          set(QTC_COMMAND_ERROR_IS_FATAL COMMAND_ERROR_IS_FATAL ANY)
        endif()
        # DESTDIR is set for e.g. the cpack DEB generator, but is empty in other situations
        if(DEFINED ENV{DESTDIR})
          set(DESTDIR_WITH_SEP \"\$ENV{DESTDIR}/\")
        else()
          set(DESTDIR_WITH_SEP \"\")
        endif()
        set(_default_app_target \"\${DESTDIR_WITH_SEP}\${CMAKE_INSTALL_PREFIX}/${IDE_APP_PATH}/${IDE_APP_TARGET}${CMAKE_EXECUTABLE_SUFFIX}\")
        set(_ide_app_target \"\${_default_app_target}\")
        if (NOT EXISTS \"\${_ide_app_target}\")
          # The component CPack generators (WIX, NSIS64, IFW) install every component with their own CMAKE_INSTALL_PREFIX
          # directory and since deploy.py needs the path to IDE_APP_TARGET the line below is needeed
          string(REPLACE \"Dependencies\" \"${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}\" _ide_app_target \"\${_ide_app_target}\")
        endif()
        if (NOT EXISTS \"\${_ide_app_target}\")
          # something went wrong, reset to default and hope for the best
          set(_ide_app_target \"\${_default_app_target}\")
        endif()
        execute_process(COMMAND
          \"${Python3_EXECUTABLE}\"
          \"-u\"
          \"${CMAKE_CURRENT_LIST_DIR}/scripts/deploy.py\"
          ${_llvm_arg}
          ${_elfutils_arg}
          \"\${_ide_app_target}\"
          \"${_qmake_binary}\"
          COMMAND_ECHO STDOUT
          ${QTC_COMMAND_ERROR_IS_FATAL}
          )
      "
      COMPONENT Dependencies
      EXCLUDE_FROM_ALL
    )
  endif()
endfunction()

function(configure_qml_designer Qt6_VERSION)
    set(QMLDESIGNER_QT6_REQUIRED_VERSION 6.7.3)
    set(QMLDESIGNER_GCC_REQUIRED_VERSION 10.0)
    set(QMLDESIGNER_CLANG_REQUIRED_VERSION 13.0)
    set(QMLDESIGNER_APPLECLANG_REQUIRED_VERSION 15.0)
    set(QMLDESIGNER_MSVC_REQUIRED_VERSION 19.30) # means MSVC 2022
    set(PROJECTSTORAGE_QT_MIN_VERSION 6.8.1)
    set(PROJECTSTORAGE_QT_MAX_VERSION 6.9.0)

    string(CONCAT QMLDESIGNER_FEATURE_DESC
           "Needs a Qt ${QMLDESIGNER_QT6_REQUIRED_VERSION} or newer")

    if (Qt6_VERSION VERSION_GREATER_EQUAL ${QMLDESIGNER_QT6_REQUIRED_VERSION})
        if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
            CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${QMLDESIGNER_GCC_REQUIRED_VERSION})
            set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
            string(APPEND QMLDESIGNER_FEATURE_DESC " and at least GCC ${QMLDESIGNER_GCC_REQUIRED_VERSION}")
        elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND
                CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${QMLDESIGNER_APPLECLANG_REQUIRED_VERSION})
            set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
            string(APPEND QMLDESIGNER_FEATURE_DESC " and at least AppleClang ${QMLDESIGNER_APPLECLANG_REQUIRED_VERSION}")
        elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
                CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${QMLDESIGNER_CLANG_REQUIRED_VERSION})
            set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
            string(APPEND QMLDESIGNER_FEATURE_DESC " and at least Clang ${QMLDESIGNER_CLANG_REQUIRED_VERSION}")
        elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND
                CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${QMLDESIGNER_MSVC_REQUIRED_VERSION})
            set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
            string(APPEND QMLDESIGNER_FEATURE_DESC " and at least MSVC 2022(ver. ${QMLDESIGNER_MSVC_REQUIRED_VERSION})")
        else()
            set(QTC_WITH_QMLDESIGNER_DEFAULT ON)
        endif()
        if (NOT QTC_WITH_QMLDESIGNER_DEFAULT)
            string(APPEND QMLDESIGNER_FEATURE_DESC ", found ${CMAKE_CXX_COMPILER_VERSION}")
        endif()
    else()
        set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
    endif()

    if(NOT TARGET Qt::Quick)
        set(QTC_WITH_QMLDESIGNER_DEFAULT OFF)
    endif()

    env_with_default("QTC_WITH_QMLDESIGNER" ENV_QTC_WITH_QMLDESIGNER ${QTC_WITH_QMLDESIGNER_DEFAULT})
    option(WITH_QMLDESIGNER "Build QmlDesigner" ${ENV_QTC_WITH_QMLDESIGNER})
    add_feature_info("WITH_QMLDESIGNER" ${WITH_QMLDESIGNER} "${QMLDESIGNER_FEATURE_DESC}")

    if(Qt6_VERSION VERSION_GREATER_EQUAL ${PROJECTSTORAGE_QT_MIN_VERSION} AND Qt6_VERSION VERSION_LESS ${PROJECTSTORAGE_QT_MAX_VERSION})
        set(IS_SUPPORTED_PROJECTSTORAGE_QT ON)
    else()
        set(IS_SUPPORTED_PROJECTSTORAGE_QT OFF)
    endif()
    set(IS_SUPPORTED_PROJECTSTORAGE_QT "${IS_SUPPORTED_PROJECTSTORAGE_QT}" PARENT_SCOPE)

    if(USE_PROJECTSTORAGE AND NOT IS_SUPPORTED_PROJECTSTORAGE_QT)
        if(BUILD_DESIGNSTUDIO)
            set(_level FATAL_ERROR)
        else()
            set(_level WARNING)
        endif()
        message(${_level}
            "USE_PROJECTSTORAGE is enabled, but current Qt ${Qt6_VERSION} is not supported by the project storage "
            "(required: ${PROJECTSTORAGE_QT_MIN_VERSION} - ${PROJECTSTORAGE_QT_MAX_VERSION})."
        )
    endif()

    # to enable define QML_DOM_MSVC2019_COMPAT if necessary, see QTBUG-127761
    if(NOT DEFINED QT_BUILT_WITH_MSVC2019)
        get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION)

        execute_process(
            COMMAND dumpbin /headers ${QT_QMAKE_EXECUTABLE} | findstr /c:"linker version"
            OUTPUT_VARIABLE DUMPBIN_OUTPUT
        )

        string(FIND "${DUMPBIN_OUTPUT}" "14.2" QT_BUILT_WITH_MSVC2019)

        if(QT_BUILT_WITH_MSVC2019 GREATER -1)
            set(QT_BUILT_WITH_MSVC2019 TRUE CACHE BOOL "Qt was built with MSVC 2019")
        else()
            set(QT_BUILT_WITH_MSVC2019 FALSE CACHE BOOL "Qt was not built with MSVC 2019")
        endif()
    endif()
endfunction()