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
5#if 0
6#pragma qt_class(QtSystemDetection)
7#pragma qt_sync_skip_header_check
8#pragma qt_sync_stop_processing
9#endif
10
11#ifndef QSYSTEMDETECTION_H
12#define QSYSTEMDETECTION_H
13
14/*
15 The operating system, must be one of: (Q_OS_x)
16
17 DARWIN - Any Darwin system (macOS, iOS, watchOS, tvOS)
18 MACOS - macOS
19 IOS - iOS
20 WATCHOS - watchOS
21 TVOS - tvOS
22 WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
23 CYGWIN - Cygwin
24 SOLARIS - Sun Solaris
25 HPUX - HP-UX
26 LINUX - Linux [has variants]
27 FREEBSD - FreeBSD [has variants]
28 NETBSD - NetBSD
29 OPENBSD - OpenBSD
30 INTERIX - Interix
31 AIX - AIX
32 HURD - GNU Hurd
33 QNX - QNX [has variants]
34 QNX6 - QNX RTP 6.1
35 LYNX - LynxOS
36 BSD4 - Any BSD 4.4 system
37 UNIX - Any UNIX BSD/SYSV system
38 ANDROID - Android platform
39 HAIKU - Haiku
40 WEBOS - LG WebOS
41 WASM - WebAssembly
42
43 The following operating systems have variants:
44 LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
45 - only Q_OS_LINUX is defined if building for other Linux systems
46 MACOS - both Q_OS_BSD4 and Q_OS_IOS are defined when building for iOS
47 - both Q_OS_BSD4 and Q_OS_MACOS are defined when building for macOS
48 FREEBSD - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
49 - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
50*/
51
52#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
53# include <TargetConditionals.h>
54# define Q_OS_APPLE
55# if defined(TARGET_OS_MAC) && TARGET_OS_MAC
56# define Q_OS_DARWIN
57# define Q_OS_BSD4
58# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
59# define QT_PLATFORM_UIKIT
60# if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
61# define Q_OS_WATCHOS
62# elif defined(TARGET_OS_TV) && TARGET_OS_TV
63# define Q_OS_TVOS
64# else
65# // TARGET_OS_IOS is only available in newer SDKs,
66# // so assume any other iOS-based platform is iOS for now
67# define Q_OS_IOS
68# endif
69# else
70# // TARGET_OS_OSX is only available in newer SDKs,
71# // so assume any non iOS-based platform is macOS for now
72# define Q_OS_MACOS
73# endif
74# else
75# error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
76# endif
77#elif defined(__WEBOS__)
78# define Q_OS_WEBOS
79# define Q_OS_LINUX
80#elif defined(__ANDROID__) || defined(ANDROID)
81# define Q_OS_ANDROID
82# define Q_OS_LINUX
83#elif defined(__CYGWIN__)
84# define Q_OS_CYGWIN
85#elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
86# define Q_OS_WIN32
87# define Q_OS_WIN64
88#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
89# define Q_OS_WIN32
90#elif defined(__sun) || defined(sun)
91# define Q_OS_SOLARIS
92#elif defined(hpux) || defined(__hpux)
93# define Q_OS_HPUX
94#elif defined(__EMSCRIPTEN__)
95# define Q_OS_WASM
96#elif defined(__linux__) || defined(__linux)
97# define Q_OS_LINUX
98#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
99# ifndef __FreeBSD_kernel__
100# define Q_OS_FREEBSD
101# endif
102# define Q_OS_FREEBSD_KERNEL
103# define Q_OS_BSD4
104#elif defined(__NetBSD__)
105# define Q_OS_NETBSD
106# define Q_OS_BSD4
107#elif defined(__OpenBSD__)
108# define Q_OS_OPENBSD
109# define Q_OS_BSD4
110#elif defined(__INTERIX)
111# define Q_OS_INTERIX
112# define Q_OS_BSD4
113#elif defined(_AIX)
114# define Q_OS_AIX
115#elif defined(__Lynx__)
116# define Q_OS_LYNX
117#elif defined(__GNU__)
118# define Q_OS_HURD
119#elif defined(__QNXNTO__)
120# define Q_OS_QNX
121#elif defined(__INTEGRITY)
122# define Q_OS_INTEGRITY
123#elif defined(__rtems__)
124# define Q_OS_RTEMS
125#elif defined(__vxworks)
126# define Q_OS_VXWORKS
127#elif defined(__HAIKU__)
128# define Q_OS_HAIKU
129#elif defined(__MAKEDEPEND__)
130#else
131# error "Qt has not been ported to this OS - see http://www.qt-project.org/"
132#endif
133
134#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
135# define Q_OS_WINDOWS
136# define Q_OS_WIN
137// On Windows, pointers to dllimport'ed variables are not constant expressions,
138// so to keep to certain initializations (like QMetaObject) constexpr, we need
139// to use functions instead.
140# define QT_NO_DATA_RELOCATION
141#endif
142
143#if defined(Q_OS_WIN)
144# undef Q_OS_UNIX
145#elif !defined(Q_OS_UNIX)
146# define Q_OS_UNIX
147#endif
148
149// Compatibility synonyms
150#ifdef Q_OS_DARWIN
151# pragma clang diagnostic push
152# pragma clang diagnostic ignored "-Wunknown-pragmas"
153# define Q_OS_MAC // FIXME: Deprecate
154# ifdef __LP64__
155# define Q_OS_DARWIN64
156# pragma clang deprecated(Q_OS_DARWIN64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
157# define Q_OS_MAC64
158# pragma clang deprecated(Q_OS_MAC64, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
159# else
160# define Q_OS_DARWIN32
161# pragma clang deprecated(Q_OS_DARWIN32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
162# define Q_OS_MAC32
163# pragma clang deprecated(Q_OS_MAC32, "use Q_OS_DARWIN and QT_POINTER_SIZE/Q_PROCESSOR_* instead")
164# endif
165# ifdef Q_OS_MACOS
166# define Q_OS_MACX
167# pragma clang deprecated(Q_OS_MACX, "use Q_OS_MACOS instead")
168# define Q_OS_OSX
169# pragma clang deprecated(Q_OS_OSX, "use Q_OS_MACOS instead")
170# endif
171# pragma clang diagnostic pop
172#endif
173
174#ifdef Q_OS_DARWIN
175# include <Availability.h>
176# include <AvailabilityMacros.h>
177
178# define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) \
179 ((defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MAX_ALLOWED >= macos) || \
180 (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MAX_ALLOWED >= ios) || \
181 (defined(__TV_OS_VERSION_MAX_ALLOWED) && tvos != __TVOS_NA && __TV_OS_VERSION_MAX_ALLOWED >= tvos) || \
182 (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MAX_ALLOWED >= watchos))
183
184# define QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, tvos, watchos) \
185 ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && macos != __MAC_NA && __MAC_OS_X_VERSION_MIN_REQUIRED < macos) || \
186 (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && ios != __IPHONE_NA && __IPHONE_OS_VERSION_MIN_REQUIRED < ios) || \
187 (defined(__TV_OS_VERSION_MIN_REQUIRED) && tvos != __TVOS_NA && __TV_OS_VERSION_MIN_REQUIRED < tvos) || \
188 (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && watchos != __WATCHOS_NA && __WATCH_OS_VERSION_MIN_REQUIRED < watchos))
189
190# define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) \
191 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, __TVOS_NA, __WATCHOS_NA)
192# define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) \
193 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
194# define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) \
195 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
196# define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) \
197 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
198# define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) \
199 QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
200
201# define QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(macos, ios) \
202 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, ios, __TVOS_NA, __WATCHOS_NA)
203# define QT_MACOS_DEPLOYMENT_TARGET_BELOW(macos) \
204 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(macos, __IPHONE_NA, __TVOS_NA, __WATCHOS_NA)
205# define QT_IOS_DEPLOYMENT_TARGET_BELOW(ios) \
206 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, ios, __TVOS_NA, __WATCHOS_NA)
207# define QT_TVOS_DEPLOYMENT_TARGET_BELOW(tvos) \
208 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, tvos, __WATCHOS_NA)
209# define QT_WATCHOS_DEPLOYMENT_TARGET_BELOW(watchos) \
210 QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos)
211
212#else // !Q_OS_DARWIN
213
214#define QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios, tvos, watchos) (0)
215#define QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos, ios) (0)
216#define QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(macos) (0)
217#define QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(ios) (0)
218#define QT_TVOS_PLATFORM_SDK_EQUAL_OR_ABOVE(tvos) (0)
219#define QT_WATCHOS_PLATFORM_SDK_EQUAL_OR_ABOVE(watchos) (0)
220
221#endif // Q_OS_DARWIN
222
223#ifdef __LSB_VERSION__
224# if __LSB_VERSION__ < 40
225# error "This version of the Linux Standard Base is unsupported"
226# endif
227#ifndef QT_LINUXBASE
228# define QT_LINUXBASE
229#endif
230#endif
231
232#if defined (__ELF__)
233# define Q_OF_ELF
234#endif
235#if defined (__MACH__) && defined (__APPLE__)
236# define Q_OF_MACH_O
237#endif
238
239#endif // QSYSTEMDETECTION_H
240