Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qsystemdetection.h
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// Copyright (C) 2019 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6#if 0
7#pragma qt_class(QtSystemDetection)
8#pragma qt_sync_skip_header_check
9#pragma qt_sync_stop_processing
10#endif
11
12#ifndef QSYSTEMDETECTION_H
13#define QSYSTEMDETECTION_H
14
15/*
16 The operating system, must be one of: (Q_OS_x)
17
18 DARWIN - Any Darwin system (macOS, iOS, watchOS, tvOS)
19 MACOS - macOS
20 IOS - iOS
21 WATCHOS - watchOS
22 TVOS - tvOS
23 VISIONOS - visionOS
24 WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
25 CYGWIN - Cygwin
26 SOLARIS - Sun Solaris
27 HPUX - HP-UX
28 LINUX - Linux [has variants]
29 FREEBSD - FreeBSD [has variants]
30 NETBSD - NetBSD
31 OPENBSD - OpenBSD
32 INTERIX - Interix
33 AIX - AIX
34 HURD - GNU Hurd
35 QNX - QNX [has variants]
36 QNX6 - QNX RTP 6.1
37 LYNX - LynxOS
38 BSD4 - Any BSD 4.4 system
39 UNIX - Any UNIX BSD/SYSV system
40 ANDROID - Android platform
41 HAIKU - Haiku
42 WEBOS - LG WebOS
43 WASM - WebAssembly
44
45 The following operating systems have variants:
46 LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
47 - only Q_OS_LINUX is defined if building for other Linux systems
48 MACOS - both Q_OS_BSD4 and Q_OS_IOS are defined when building for iOS
49 - both Q_OS_BSD4 and Q_OS_MACOS are defined when building for macOS
50 FREEBSD - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
51 - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
52*/
53
54#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
55# include <TargetConditionals.h>
56# define Q_OS_APPLE
57# if defined(TARGET_OS_MAC) && TARGET_OS_MAC
58# define Q_OS_DARWIN
59# define Q_OS_BSD4
60# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
61# define QT_PLATFORM_UIKIT
62# if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
63# define Q_OS_WATCHOS
64# elif defined(TARGET_OS_TV) && TARGET_OS_TV
65# define Q_OS_TVOS
66# elif defined(TARGET_OS_VISION) && TARGET_OS_VISION
67# define Q_OS_VISIONOS
68# else
69# // TARGET_OS_IOS is only available in newer SDKs,
70# // so assume any other iOS-based platform is iOS for now
71# define Q_OS_IOS
72# endif
73# else
74# // TARGET_OS_OSX is only available in newer SDKs,
75# // so assume any non iOS-based platform is macOS for now
76# define Q_OS_MACOS
77# endif
78# else
79# error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
80# endif
81#elif defined(__WEBOS__)
82# define Q_OS_WEBOS
83# define Q_OS_LINUX
84#elif defined(__ANDROID__) || defined(ANDROID)
85# define Q_OS_ANDROID
86# define Q_OS_LINUX
87#elif defined(__OHOS__)
88# define Q_OS_HARMONY
89# define Q_OS_LINUX
90#elif defined(__CYGWIN__)
91# define Q_OS_CYGWIN
92#elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
93# define Q_OS_WIN32
94# define Q_OS_WIN64
95#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
96# define Q_OS_WIN32
97#elif defined(__sun) || defined(sun)
98# define Q_OS_SOLARIS
99#elif defined(hpux) || defined(__hpux)
100# define Q_OS_HPUX
101#elif defined(__EMSCRIPTEN__)
102# define Q_OS_WASM
103#elif defined(__linux__) || defined(__linux)
104# define Q_OS_LINUX
105#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
106# ifndef __FreeBSD_kernel__
107# define Q_OS_FREEBSD
108# endif
109# define Q_OS_FREEBSD_KERNEL
110# define Q_OS_BSD4
111#elif defined(__NetBSD__)
112# define Q_OS_NETBSD
113# define Q_OS_BSD4
114#elif defined(__OpenBSD__)
115# define Q_OS_OPENBSD
116# define Q_OS_BSD4
117#elif defined(__INTERIX)
118# define Q_OS_INTERIX
119# define Q_OS_BSD4
120#elif defined(_AIX)
121# define Q_OS_AIX
122#elif defined(__Lynx__)
123# define Q_OS_LYNX
124#elif defined(__GNU__)
125# define Q_OS_HURD
126#elif defined(__QNXNTO__)
127# define Q_OS_QNX
128#elif defined(__INTEGRITY)
129# define Q_OS_INTEGRITY
130#elif defined(__rtems__)
131# define Q_OS_RTEMS
132#elif defined(__vxworks)
133# define Q_OS_VXWORKS
134#elif defined(__HAIKU__)
135# define Q_OS_HAIKU
136#elif defined(__MAKEDEPEND__)
137#else
138# error "Qt has not been ported to this OS - see http://www.qt-project.org/"
139#endif
140
141#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
142# define Q_OS_WINDOWS
143# define Q_OS_WIN
144// On Windows, pointers to dllimport'ed variables are not constant expressions,
145// so to keep to certain initializations (like QMetaObject) constexpr, we need
146// to use functions instead.
147# define QT_NO_DATA_RELOCATION
148#endif
149
150#if defined(Q_OS_WIN)
151# undef Q_OS_UNIX
152#elif !defined(Q_OS_UNIX)
153# define Q_OS_UNIX
154#endif
155
156// Compatibility synonyms
157#ifdef Q_OS_DARWIN
158# pragma clang diagnostic push
159# pragma clang diagnostic ignored "-Wunknown-pragmas"
160# define Q_OS_MAC
161# pragma clang deprecated(Q_OS_MAC, "use Q_OS_MACOS for macOS or Q_OS_APPLE for all Apple platforms instead")
162# ifdef __LP64__
163# define Q_OS_DARWIN64
164# pragma clang deprecated(Q_OS_DARWIN64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
165# define Q_OS_MAC64
166# pragma clang deprecated(Q_OS_MAC64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
167# else
168# define Q_OS_DARWIN32
169# pragma clang deprecated(Q_OS_DARWIN32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
170# define Q_OS_MAC32
171# pragma clang deprecated(Q_OS_MAC32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
172# endif
173# ifdef Q_OS_MACOS
174# define Q_OS_MACX
175# pragma clang deprecated(Q_OS_MACX, "use Q_OS_MACOS instead")
176# define Q_OS_OSX
177# pragma clang deprecated(Q_OS_OSX, "use Q_OS_MACOS instead")
178# endif
179# pragma clang diagnostic pop
180#endif
181
182#ifdef Q_OS_DARWIN
183# include <Availability.h>
184# include <AvailabilityMacros.h>
185# include <QtCore/qtpreprocessorsupport.h>
186
187# define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos)
188 ((defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MAX_ALLOWED >= macos) ||
189 (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MAX_ALLOWED >= ios) ||
190 (defined(__TV_OS_VERSION_MAX_ALLOWED) && tvos != __TVOS_NA && __TV_OS_VERSION_MAX_ALLOWED >= tvos) ||
191 (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MAX_ALLOWED >= watchos))
192
193# define QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, tvos, watchos)
194 ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MIN_REQUIRED < macos) ||
195 (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MIN_REQUIRED < ios) ||
196 (defined(__TV_OS_VERSION_MIN_REQUIRED) && tvos != __TVOS_NA && __TV_OS_VERSION_MIN_REQUIRED < tvos) ||
197 (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MIN_REQUIRED < watchos))
198
199# define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios)
200 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, __TVOS_NA, __WATCHOS_NA)
201# define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos)
202 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
203# define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios)
204 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
205# define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos)
206 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
207# define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos)
208 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
209
210# pragma clang deprecated(QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE, "Use QT_APPLE_SDK_EQUAL_OR_ABOVE instead")
211
212# define QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(macos, ios)
213 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, __TVOS_NA, __WATCHOS_NA)
214# define QT_MACOS_DEPLOYMENT_TARGET_BELOW(macos)
215 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
216# define QT_IOS_DEPLOYMENT_TARGET_BELOW(ios)
217 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
218# define QT_TVOS_DEPLOYMENT_TARGET_BELOW(tvos)
219 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
220# define QT_WATCHOS_DEPLOYMENT_TARGET_BELOW(watchos)
221 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
222
223# pragma clang deprecated(QT_DARWIN_DEPLOYMENT_TARGET_BELOW, "Use @available instead")
224
225/*!
226 \macro QT_APPLE_SDK_EQUAL_OR_ABOVE
227 \internal
228
229 Generalized Apple platform SDK check, for code requiring
230 a minimum version of build SDK, e.g.:
231
232 #if QT_APPLE_SDK_EQUAL_OR_ABOVE(MACOS(26, 6, 1), IOS(17, 2), VISIONOS(2))
233
234 For runtime version checks, use @available
235*/
236
237# define QT_APPLE_SDK_VERSION(...) QT_APPLE_SDK_VERSION_IMPL(__VA_ARGS__, 0, 0)
238# define QT_APPLE_SDK_VERSION_IMPL(major, minor, patch, ...)
239 ((major) * 10000 + (minor) * 100 + (patch))
240
241# define QT_APPLE_SDK_PLATFORM_MACOS(...)
242 (__MAC_OS_X_VERSION_MAX_ALLOWED >= QT_APPLE_SDK_VERSION(__VA_ARGS__))
243# define QT_APPLE_SDK_PLATFORM_IOS(...)
244 (__IPHONE_OS_VERSION_MAX_ALLOWED >= QT_APPLE_SDK_VERSION(__VA_ARGS__))
245# define QT_APPLE_SDK_PLATFORM_TVOS(...)
246 (__TV_OS_VERSION_MAX_ALLOWED >= QT_APPLE_SDK_VERSION(__VA_ARGS__))
247# define QT_APPLE_SDK_PLATFORM_WATCHOS(...)
248 (__WATCH_OS_VERSION_MAX_ALLOWED >= QT_APPLE_SDK_VERSION(__VA_ARGS__))
249# define QT_APPLE_SDK_PLATFORM_VISIONOS(...)
250 (__VISION_OS_VERSION_MAX_ALLOWED >= QT_APPLE_SDK_VERSION(__VA_ARGS__))
251
252# define QT_APPLE_SDK_EQUAL_OR_ABOVE_1(p1)
253 (QT_APPLE_SDK_PLATFORM_##p1)
254# define QT_APPLE_SDK_EQUAL_OR_ABOVE_2(p1, p2)
255 (QT_APPLE_SDK_PLATFORM_##p1 || QT_APPLE_SDK_PLATFORM_##p2)
256# define QT_APPLE_SDK_EQUAL_OR_ABOVE_3(p1, p2, p3)
257 (QT_APPLE_SDK_PLATFORM_##p1 || QT_APPLE_SDK_PLATFORM_##p2
258 || QT_APPLE_SDK_PLATFORM_##p3)
259# define QT_APPLE_SDK_EQUAL_OR_ABOVE_4(p1, p2, p3, p4)
260 (QT_APPLE_SDK_PLATFORM_##p1 || QT_APPLE_SDK_PLATFORM_##p2
261 || QT_APPLE_SDK_PLATFORM_##p3 || QT_APPLE_SDK_PLATFORM_##p4)
262# define QT_APPLE_SDK_EQUAL_OR_ABOVE_5(p1, p2, p3, p4, p5)
263 (QT_APPLE_SDK_PLATFORM_##p1 || QT_APPLE_SDK_PLATFORM_##p2
264 || QT_APPLE_SDK_PLATFORM_##p3 || QT_APPLE_SDK_PLATFORM_##p4
265 || QT_APPLE_SDK_PLATFORM_##p5)
266
267# define QT_APPLE_SDK_EQUAL_OR_ABOVE(...) QT_OVERLOADED_MACRO(QT_APPLE_SDK_EQUAL_OR_ABOVE, __VA_ARGS__)
268
269#else // !Q_OS_DARWIN
270
271#define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) (0)
272#define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) (0)
273#define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) (0)
274#define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) (0)
275#define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) (0)
276#define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) (0)
277#define QT_APPLE_SDK_EQUAL_OR_ABOVE(...) (0)
278
279#endif // Q_OS_DARWIN
280
281#ifdef __LSB_VERSION__
282# if __LSB_VERSION__ < 40
283# error "This version of the Linux Standard Base is unsupported"
284# endif
285#ifndef QT_LINUXBASE
286# define QT_LINUXBASE
287#endif
288#endif
289
290#if defined (__ELF__)
291# define Q_OF_ELF
292#endif
293#if defined (__MACH__) && defined (__APPLE__)
294# define Q_OF_MACH_O
295#endif
296
297#if defined(__SIZEOF_INT128__)
298// Compiler used in VxWorks SDK declares __SIZEOF_INT128__ but VxWorks doesn't support this type,
299// so we can't rely solely on compiler here.
300// MSVC STL used by MSVC and clang-cl does not support int128
301#if !defined(Q_OS_VXWORKS) && !defined(_MSC_VER)
302# define QT_COMPILER_SUPPORTS_INT128 __SIZEOF_INT128__
303#endif
304#endif // defined(__SIZEOF_INT128__)
305
306#endif // QSYSTEMDETECTION_H