summaryrefslogtreecommitdiffstats
path: root/cmake/QtMkspecHelpers.cmake
blob: cd08daa2c44d6450bc58521420ed48cd255e03a0 (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
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause

macro(qt_internal_set_mkspecs_dir)
    # Find the path to mkspecs/, depending on whether we are building as part of a standard qtbuild,
    # or a module against an already installed version of qt.
    if(NOT QT_MKSPECS_DIR)
        if("${QT_BUILD_INTERNALS_PATH}" STREQUAL "")
          get_filename_component(QT_MKSPECS_DIR "${CMAKE_CURRENT_LIST_DIR}/../mkspecs" ABSOLUTE)
        else()
          # We can rely on QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX being set by
          # QtBuildInternalsExtra.cmake.
          get_filename_component(
              QT_MKSPECS_DIR
              "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${INSTALL_MKSPECSDIR}" ABSOLUTE)
        endif()
        set(QT_MKSPECS_DIR "${QT_MKSPECS_DIR}" CACHE INTERNAL "")
    endif()
endmacro()

macro(qt_internal_setup_platform_definitions_and_mkspec)
    # Platform define path, etc.
    if(WIN32)
        set(QT_DEFAULT_PLATFORM_DEFINITIONS WIN32 _ENABLE_EXTENDED_ALIGNED_STORAGE)
        if(QT_64BIT)
            list(APPEND QT_DEFAULT_PLATFORM_DEFINITIONS WIN64 _WIN64)
        endif()

        if(CLANG)
            if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" OR MSVC)
                set(QT_DEFAULT_MKSPEC win32-clang-msvc)
            elseif(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU" OR MINGW)
                set(QT_DEFAULT_MKSPEC win32-clang-g++)
            endif()
        elseif(MSVC)
            if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
                set(QT_DEFAULT_MKSPEC win32-arm64-msvc)
            else()
                set(QT_DEFAULT_MKSPEC win32-msvc)
            endif()
        elseif(MINGW)
            set(QT_DEFAULT_MKSPEC win32-g++)
            list(APPEND QT_DEFAULT_PLATFORM_DEFINITIONS MINGW_HAS_SECURE_API=1)
        endif()
    elseif(LINUX)
        if(GCC)
            set(QT_DEFAULT_MKSPEC linux-g++)
        elseif(CLANG)
            set(QT_DEFAULT_MKSPEC linux-clang)
        endif()
    elseif(ANDROID)
        if(GCC)
            set(QT_DEFAULT_MKSPEC android-g++)
        elseif(CLANG)
            set(QT_DEFAULT_MKSPEC android-clang)
        endif()
    elseif(IOS)
        set(QT_DEFAULT_MKSPEC macx-ios-clang)
    elseif(APPLE)
        set(QT_DEFAULT_MKSPEC macx-clang)
    elseif(WASM)
        if(WASM64)
            set(QT_DEFAULT_MKSPEC wasm-emscripten-64)
        else()
            set(QT_DEFAULT_MKSPEC wasm-emscripten)
        endif()
    elseif(QNX)
        # Certain POSIX defines are not set if we don't compile with -std=gnuXX
        set(QT_ENABLE_CXX_EXTENSIONS ON)

        list(APPEND QT_DEFAULT_PLATFORM_DEFINITIONS _FORTIFY_SOURCE=2 _REENTRANT)

        set(compiler_aarch64le aarch64le)
        set(compiler_armle-v7 armv7le)
        set(compiler_x86-64 x86_64)
        set(compiler_x86 x86)
        foreach(arch aarch64le armle-v7 x86-64 x86)
            if (CMAKE_CXX_COMPILER_TARGET MATCHES "${compiler_${arch}}$")
                set(QT_DEFAULT_MKSPEC qnx-${arch}-qcc)
            endif()
        endforeach()
    elseif(FREEBSD)
        if(CLANG)
            set(QT_DEFAULT_MKSPEC freebsd-clang)
        elseif(GCC)
            set(QT_DEFAULT_MKSPEC freebsd-g++)
        endif()
    elseif(NETBSD)
        set(QT_DEFAULT_MKSPEC netbsd-g++)
    elseif(OPENBSD)
        set(QT_DEFAULT_MKSPEC openbsd-g++)
    elseif(SOLARIS)
        if(GCC)
            if(QT_64BIT)
                 set(QT_DEFAULT_MKSPEC solaris-g++-64)
            else()
                 set(QT_DEFAULT_MKSPEC solaris-g++)
            endif()
        else()
            if(QT_64BIT)
                 set(QT_DEFAULT_MKSPEC solaris-cc-64)
            else()
                 set(QT_DEFAULT_MKSPEC solaris-cc)
            endif()
        endif()
    elseif(HURD)
        set(QT_DEFAULT_MKSPEC hurd-g++)
    endif()

    if(NOT QT_QMAKE_TARGET_MKSPEC)
        set(QT_QMAKE_TARGET_MKSPEC "${QT_DEFAULT_MKSPEC}" CACHE STRING "QMake target mkspec")
    endif()

    if(CMAKE_CROSSCOMPILING)
        set(QT_QMAKE_HOST_MKSPEC "${QT${PROJECT_VERSION_MAJOR}_HOST_INFO_QMAKE_MKSPEC}")
    else()
        set(QT_QMAKE_HOST_MKSPEC "${QT_QMAKE_TARGET_MKSPEC}")
    endif()

    if(NOT QT_QMAKE_TARGET_MKSPEC OR NOT EXISTS "${QT_MKSPECS_DIR}/${QT_QMAKE_TARGET_MKSPEC}")
        if(NOT QT_QMAKE_TARGET_MKSPEC)
            set(reason
                "Platform is not detected. Please make sure your build environment is configured"
                " properly or specify it manually using QT_QMAKE_TARGET_MKSPEC variable and one of"
                " the known platforms.")
        else()
            set(reason "Unknown platform ${QT_QMAKE_TARGET_MKSPEC}")
        endif()

        file(GLOB known_platforms
            LIST_DIRECTORIES true
            RELATIVE "${QT_MKSPECS_DIR}"
            "${QT_MKSPECS_DIR}/*"
        )
        list(JOIN known_platforms "\n    " known_platforms)
        message(FATAL_ERROR "${reason}\n"
            "Known platforms:\n    ${known_platforms}")
    endif()

    if(NOT DEFINED QT_DEFAULT_PLATFORM_DEFINITIONS)
        set(QT_DEFAULT_PLATFORM_DEFINITIONS "")
    endif()

    set(QT_PLATFORM_DEFINITIONS ${QT_DEFAULT_PLATFORM_DEFINITIONS}
        CACHE STRING "Qt platform specific pre-processor defines")
endmacro()