1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/osx/private/available.h
3 // Purpose:     Helper for checking API availability under macOS.
4 // Author:      Vadim Zeitlin
5 // Created:     2019-04-17
6 // Copyright:   (c) 2019 Vadim Zeitlin <vadim@wxwidgets.org>
7 // Licence:     wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_OSX_PRIVATE_AVAILABLE_H_
11 #define _WX_OSX_PRIVATE_AVAILABLE_H_
12 
13 // Xcode 9 adds new @available keyword and the corresponding __builtin_available
14 // builtin which should be used instead of manual checks for API availability
15 // as using this builtin suppresses the compiler -Wunguarded-availability
16 // warnings, so use it if possible for the implementation of our own macro.
17 #if defined(__clang__) && __has_builtin(__builtin_available)
18     #define WX_IS_MACOS_AVAILABLE(major, minor) \
19         __builtin_available(macOS major ## . ## minor, *)
20 
21     #define WX_IS_MACOS_OR_IOS_AVAILABLE(macmajor, macminor, imajor, iminor) \
22         __builtin_available(macOS macmajor ## . ## macminor, iOS imajor ##. ## iminor, *)
23 
24     #define WX_IS_MACOS_AVAILABLE_FULL(major, minor, micro) \
25         __builtin_available(macOS major ## . ## minor ## . ## micro, *)
26 
27     // Note that we can't easily forward to API_AVAILABLE macro here, so go
28     // directly to its expansion instead.
29     #define WX_API_AVAILABLE_MACOS(major, minor) \
30          __attribute__((availability(macos,introduced=major ## . ## minor)))
31 #else // Not clang or old clang version without __builtin_available
32     #include "wx/platinfo.h"
33 
34     #define WX_IS_MACOS_AVAILABLE(major, minor) \
35         wxPlatformInfo::Get().CheckOSVersion(major, minor)
36 
37 #ifdef wxOSX_USE_IPHONE
38     #define WX_IS_MACOS_OR_IOS_AVAILABLE(macmajor, macminor, imajor, iminor) \
39         wxPlatformInfo::Get().CheckOSVersion(imajor, iminor)
40 #else
41     #define WX_IS_MACOS_OR_IOS_AVAILABLE(macmajor, macminor, imajor, iminor) \
42         wxPlatformInfo::Get().CheckOSVersion(macmajor, macminor)
43 #endif
44 
45     #define WX_IS_MACOS_AVAILABLE_FULL(major, minor, micro) \
46         wxPlatformInfo::Get().CheckOSVersion(major, minor, micro)
47 
48     #define WX_API_AVAILABLE_MACOS(major, minor)
49 #endif
50 
51 #endif // _WX_OSX_PRIVATE_AVAILABLE_H_
52