1 /****************************************************************************
2 **
3 ** Copyright (C) 2019 The Qt Company Ltd.
4 ** Copyright (C) 2019 Intel Corporation.
5 ** Contact: https://www.qt.io/licensing/
6 **
7 ** This file is part of the QtCore module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see https://www.qt.io/terms-conditions. For further
16 ** information use the contact form at https://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or (at your option) the GNU General
29 ** Public license version 3 or any later version approved by the KDE Free
30 ** Qt Foundation. The licenses are as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32 ** included in the packaging of this file. Please review the following
33 ** information to ensure the GNU General Public License requirements will
34 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35 ** https://www.gnu.org/licenses/gpl-3.0.html.
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #ifndef QGLOBAL_H
42 # include <QtCore/qglobal.h>
43 #endif
44 
45 #ifndef QSYSTEMDETECTION_H
46 #define QSYSTEMDETECTION_H
47 
48 /*
49    The operating system, must be one of: (Q_OS_x)
50 
51      DARWIN   - Any Darwin system (macOS, iOS, watchOS, tvOS)
52      MACOS    - macOS
53      IOS      - iOS
54      WATCHOS  - watchOS
55      TVOS     - tvOS
56      WIN32    - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
57      WINRT    - WinRT (Windows Runtime)
58      CYGWIN   - Cygwin
59      SOLARIS  - Sun Solaris
60      HPUX     - HP-UX
61      LINUX    - Linux [has variants]
62      FREEBSD  - FreeBSD [has variants]
63      NETBSD   - NetBSD
64      OPENBSD  - OpenBSD
65      INTERIX  - Interix
66      AIX      - AIX
67      HURD     - GNU Hurd
68      QNX      - QNX [has variants]
69      QNX6     - QNX RTP 6.1
70      LYNX     - LynxOS
71      BSD4     - Any BSD 4.4 system
72      UNIX     - Any UNIX BSD/SYSV system
73      ANDROID  - Android platform
74      HAIKU    - Haiku
75      WEBOS    - LG WebOS
76 
77    The following operating systems have variants:
78      LINUX    - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
79               - only Q_OS_LINUX is defined if building for other Linux systems
80      MACOS    - both Q_OS_BSD4 and Q_OS_IOS are defined when building for iOS
81               - both Q_OS_BSD4 and Q_OS_MACOS are defined when building for macOS
82      FREEBSD  - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
83               - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
84 */
85 
86 #if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
87 #  include <TargetConditionals.h>
88 #  if defined(TARGET_OS_MAC) && TARGET_OS_MAC
89 #    define Q_OS_DARWIN
90 #    define Q_OS_BSD4
91 #    ifdef __LP64__
92 #      define Q_OS_DARWIN64
93 #    else
94 #      define Q_OS_DARWIN32
95 #    endif
96 #    if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
97 #      define QT_PLATFORM_UIKIT
98 #      if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
99 #        define Q_OS_WATCHOS
100 #      elif defined(TARGET_OS_TV) && TARGET_OS_TV
101 #        define Q_OS_TVOS
102 #      else
103 #        // TARGET_OS_IOS is only available in newer SDKs,
104 #        // so assume any other iOS-based platform is iOS for now
105 #        define Q_OS_IOS
106 #      endif
107 #    else
108 #      // TARGET_OS_OSX is only available in newer SDKs,
109 #      // so assume any non iOS-based platform is macOS for now
110 #      define Q_OS_MACOS
111 #    endif
112 #  else
113 #    error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
114 #  endif
115 #elif defined(__WEBOS__)
116 #  define Q_OS_WEBOS
117 #  define Q_OS_LINUX
118 #elif defined(__ANDROID__) || defined(ANDROID)
119 #  define Q_OS_ANDROID
120 #  define Q_OS_LINUX
121 #elif defined(__CYGWIN__)
122 #  define Q_OS_CYGWIN
123 #elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
124 #  define Q_OS_WIN32
125 #  define Q_OS_WIN64
126 #elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
127 #  if defined(WINAPI_FAMILY)
128 #    ifndef WINAPI_FAMILY_PC_APP
129 #      define WINAPI_FAMILY_PC_APP WINAPI_FAMILY_APP
130 #    endif
131 #    if defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
132 #      define Q_OS_WINRT
133 #    elif WINAPI_FAMILY==WINAPI_FAMILY_PC_APP
134 #      define Q_OS_WINRT
135 #    else
136 #      define Q_OS_WIN32
137 #    endif
138 #  else
139 #    define Q_OS_WIN32
140 #  endif
141 #elif defined(__sun) || defined(sun)
142 #  define Q_OS_SOLARIS
143 #elif defined(hpux) || defined(__hpux)
144 #  define Q_OS_HPUX
145 #elif defined(__native_client__)
146 #  define Q_OS_NACL
147 #elif defined(__EMSCRIPTEN__)
148 #  define Q_OS_WASM
149 #elif defined(__linux__) || defined(__linux)
150 #  define Q_OS_LINUX
151 #elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
152 #  ifndef __FreeBSD_kernel__
153 #    define Q_OS_FREEBSD
154 #  endif
155 #  define Q_OS_FREEBSD_KERNEL
156 #  define Q_OS_BSD4
157 #elif defined(__NetBSD__)
158 #  define Q_OS_NETBSD
159 #  define Q_OS_BSD4
160 #elif defined(__OpenBSD__)
161 #  define Q_OS_OPENBSD
162 #  define Q_OS_BSD4
163 #elif defined(__INTERIX)
164 #  define Q_OS_INTERIX
165 #  define Q_OS_BSD4
166 #elif defined(_AIX)
167 #  define Q_OS_AIX
168 #elif defined(__Lynx__)
169 #  define Q_OS_LYNX
170 #elif defined(__GNU__)
171 #  define Q_OS_HURD
172 #elif defined(__QNXNTO__)
173 #  define Q_OS_QNX
174 #elif defined(__INTEGRITY)
175 #  define Q_OS_INTEGRITY
176 #elif defined(__rtems__)
177 #  define Q_OS_RTEMS
178 #elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
179 #  define Q_OS_VXWORKS
180 #elif defined(__HAIKU__)
181 #  define Q_OS_HAIKU
182 #elif defined(__MAKEDEPEND__)
183 #else
184 #  error "Qt has not been ported to this OS - see http://www.qt-project.org/"
185 #endif
186 
187 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINRT)
188 #  define Q_OS_WINDOWS
189 #  define Q_OS_WIN
190 #  if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
191 // On Windows, pointers to dllimport'ed variables are not constant expressions,
192 // so to keep to certain initializations (like QMetaObject) constexpr, we need
193 // to use functions instead.
194 #    define QT_NO_DATA_RELOCATION
195 #  endif
196 #endif
197 
198 #if defined(Q_OS_WIN)
199 #  undef Q_OS_UNIX
200 #elif !defined(Q_OS_UNIX)
201 #  define Q_OS_UNIX
202 #endif
203 
204 // Compatibility synonyms
205 #ifdef Q_OS_DARWIN
206 #define Q_OS_MAC
207 #endif
208 #ifdef Q_OS_DARWIN32
209 #define Q_OS_MAC32
210 #endif
211 #ifdef Q_OS_DARWIN64
212 #define Q_OS_MAC64
213 #endif
214 #ifdef Q_OS_MACOS
215 #define Q_OS_MACX
216 #define Q_OS_OSX
217 #endif
218 
219 #ifdef Q_OS_DARWIN
220 #  include <Availability.h>
221 #  include <AvailabilityMacros.h>
222 #
223 #  ifdef Q_OS_MACOS
224 #    if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
225 #       undef __MAC_OS_X_VERSION_MIN_REQUIRED
226 #       define __MAC_OS_X_VERSION_MIN_REQUIRED __MAC_10_6
227 #    endif
228 #    if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
229 #       undef MAC_OS_X_VERSION_MIN_REQUIRED
230 #       define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
231 #    endif
232 #  endif
233 #
234 #  // Numerical checks are preferred to named checks, but to be safe
235 #  // we define the missing version names in case Qt uses them.
236 #
237 #  if !defined(__MAC_10_11)
238 #       define __MAC_10_11 101100
239 #  endif
240 #  if !defined(__MAC_10_12)
241 #       define __MAC_10_12 101200
242 #  endif
243 #  if !defined(__MAC_10_13)
244 #       define __MAC_10_13 101300
245 #  endif
246 #  if !defined(__MAC_10_14)
247 #       define __MAC_10_14 101400
248 #  endif
249 #  if !defined(__MAC_10_15)
250 #       define __MAC_10_15 101500
251 #  endif
252 #  if !defined(__MAC_10_16)
253 #       define __MAC_10_16 101600
254 #  endif
255 #  if !defined(MAC_OS_X_VERSION_10_11)
256 #       define MAC_OS_X_VERSION_10_11 __MAC_10_11
257 #  endif
258 #  if !defined(MAC_OS_X_VERSION_10_12)
259 #       define MAC_OS_X_VERSION_10_12 __MAC_10_12
260 #  endif
261 #  if !defined(MAC_OS_X_VERSION_10_13)
262 #       define MAC_OS_X_VERSION_10_13 __MAC_10_13
263 #  endif
264 #  if !defined(MAC_OS_X_VERSION_10_14)
265 #       define MAC_OS_X_VERSION_10_14 __MAC_10_14
266 #  endif
267 #  if !defined(MAC_OS_X_VERSION_10_15)
268 #       define MAC_OS_X_VERSION_10_15 __MAC_10_15
269 #  endif
270 #  if !defined(MAC_OS_X_VERSION_10_16)
271 #       define MAC_OS_X_VERSION_10_16 __MAC_10_16
272 #  endif
273 #
274 #  if !defined(__IPHONE_10_0)
275 #       define __IPHONE_10_0 100000
276 #  endif
277 #  if !defined(__IPHONE_10_1)
278 #       define __IPHONE_10_1 100100
279 #  endif
280 #  if !defined(__IPHONE_10_2)
281 #       define __IPHONE_10_2 100200
282 #  endif
283 #  if !defined(__IPHONE_10_3)
284 #       define __IPHONE_10_3 100300
285 #  endif
286 #  if !defined(__IPHONE_11_0)
287 #       define __IPHONE_11_0 110000
288 #  endif
289 #  if !defined(__IPHONE_12_0)
290 #       define __IPHONE_12_0 120000
291 #  endif
292 #endif
293 
294 #ifdef __LSB_VERSION__
295 #  if __LSB_VERSION__ < 40
296 #    error "This version of the Linux Standard Base is unsupported"
297 #  endif
298 #ifndef QT_LINUXBASE
299 #  define QT_LINUXBASE
300 #endif
301 #endif
302 
303 #endif // QSYSTEMDETECTION_H
304