Availability.h (28715B) - Raw
1 /* 2 * Copyright (c) 2007-2016 by Apple Inc.. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 #ifndef __AVAILABILITY__ 25 #define __AVAILABILITY__ 26 /* 27 These macros are for use in OS header files. They enable function prototypes 28 and Objective-C methods to be tagged with the OS version in which they 29 were first available; and, if applicable, the OS versions in which they 30 became deprecated and obsoleted. 31 32 The desktop Mac OS X and iOS each have different version numbers. 33 The __OSX_AVAILABLE_STARTING() macro allows you to specify both the desktop 34 and iOS version numbers. For instance: 35 __OSX_AVAILABLE_STARTING(__MAC_10_2,__IPHONE_2_0) 36 means the function/method was first available on Mac OS X 10.2 on the desktop 37 and first available in iOS 2.0 on the iPhone. 38 39 If a function is available on one platform, but not the other a _NA (not 40 applicable) parameter is used. For instance: 41 __OSX_AVAILABLE_STARTING(__MAC_10_3,__IPHONE_NA) 42 means that the function/method was first available on Mac OS X 10.3, and it 43 currently not implemented on the iPhone. 44 45 At some point, a function/method may be deprecated. That means Apple 46 recommends applications stop using the function, either because there is a 47 better replacement or the functionality is being phased out. Deprecated 48 functions/methods can be tagged with a __OSX_AVAILABLE_BUT_DEPRECATED() 49 macro which specifies the OS version where the function became available 50 as well as the OS version in which it became deprecated. For instance: 51 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_5,__IPHONE_NA,__IPHONE_NA) 52 means that the function/method was introduced in Mac OS X 10.0, then 53 became deprecated beginning in Mac OS X 10.5. On iOS the function 54 has never been available. 55 56 For these macros to function properly, a program must specify the OS version range 57 it is targeting. The min OS version is specified as an option to the compiler: 58 -mmacosx-version-min=10.x when building for Mac OS X, and -miphoneos-version-min=y.z 59 when building for the iPhone. The upper bound for the OS version is rarely needed, 60 but it can be set on the command line via: -D__MAC_OS_X_VERSION_MAX_ALLOWED=10x0 for 61 Mac OS X and __IPHONE_OS_VERSION_MAX_ALLOWED = y0z00 for iOS. 62 63 Examples: 64 65 A function available in Mac OS X 10.5 and later, but not on the phone: 66 67 extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA); 68 69 70 An Objective-C method in Mac OS X 10.5 and later, but not on the phone: 71 72 @interface MyClass : NSObject 73 -(void) mymacmethod __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA); 74 @end 75 76 77 An enum available on the phone, but not available on Mac OS X: 78 79 #if __IPHONE_OS_VERSION_MIN_REQUIRED 80 enum { myEnum = 1 }; 81 #endif 82 Note: this works when targeting the Mac OS X platform because 83 __IPHONE_OS_VERSION_MIN_REQUIRED is undefined which evaluates to zero. 84 85 86 An enum with values added in different iPhoneOS versions: 87 88 enum { 89 myX = 1, // Usable on iPhoneOS 2.1 and later 90 myY = 2, // Usable on iPhoneOS 3.0 and later 91 myZ = 3, // Usable on iPhoneOS 3.0 and later 92 ... 93 Note: you do not want to use #if with enumeration values 94 when a client needs to see all values at compile time 95 and use runtime logic to only use the viable values. 96 97 98 It is also possible to use the *_VERSION_MIN_REQUIRED in source code to make one 99 source base that can be compiled to target a range of OS versions. It is best 100 to not use the _MAC_* and __IPHONE_* macros for comparisons, but rather their values. 101 That is because you might get compiled on an old OS that does not define a later 102 OS version macro, and in the C preprocessor undefined values evaluate to zero 103 in expresssions, which could cause the #if expression to evaluate in an unexpected 104 way. 105 106 #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED 107 // code only compiled when targeting Mac OS X and not iPhone 108 // note use of 1050 instead of __MAC_10_5 109 #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050 110 // code in here might run on pre-Leopard OS 111 #else 112 // code here can assume Leopard or later 113 #endif 114 #endif 115 116 117 */ 118 119 /* 120 * __API_TO_BE_DEPRECATED is used as a version number in API that will be deprecated 121 * in an upcoming release. This soft deprecation is an intermediate step before formal 122 * deprecation to notify developers about the API before compiler warnings are generated. 123 * You can find all places in your code that use soft deprecated API by redefining the 124 * value of this macro to your current minimum deployment target, for example: 125 * (macOS) 126 * clang -D__API_TO_BE_DEPRECATED=10.12 <other compiler flags> 127 * (iOS) 128 * clang -D__API_TO_BE_DEPRECATED=11.0 <other compiler flags> 129 */ 130 131 #ifndef __API_TO_BE_DEPRECATED 132 #define __API_TO_BE_DEPRECATED 100000 133 #endif 134 135 #ifndef __API_TO_BE_DEPRECATED_MACOS 136 #define __API_TO_BE_DEPRECATED_MACOS 100000 137 #endif 138 #ifndef __API_TO_BE_DEPRECATED_MACOSAPPLICATIONEXTENSION 139 #define __API_TO_BE_DEPRECATED_MACOSAPPLICATIONEXTENSION 100000 140 #endif 141 142 #ifndef __API_TO_BE_DEPRECATED_IOS 143 #define __API_TO_BE_DEPRECATED_IOS 100000 144 #endif 145 #ifndef __API_TO_BE_DEPRECATED_IOSAPPLICATIONEXTENSION 146 #define __API_TO_BE_DEPRECATED_IOSAPPLICATIONEXTENSION 100000 147 #endif 148 #ifndef __API_TO_BE_DEPRECATED_MACCATALYST 149 #define __API_TO_BE_DEPRECATED_MACCATALYST 100000 150 #endif 151 #ifndef __API_TO_BE_DEPRECATED_MACCATALYSTAPPLICATIONEXTENSION 152 #define __API_TO_BE_DEPRECATED_MACCATALYSTAPPLICATIONEXTENSION 100000 153 #endif 154 155 #ifndef __API_TO_BE_DEPRECATED_WATCHOS 156 #define __API_TO_BE_DEPRECATED_WATCHOS 100000 157 #endif 158 #ifndef __API_TO_BE_DEPRECATED_WATCHOSAPPLICATIONEXTENSION 159 #define __API_TO_BE_DEPRECATED_WATCHOSAPPLICATIONEXTENSION 100000 160 #endif 161 162 #ifndef __API_TO_BE_DEPRECATED_TVOS 163 #define __API_TO_BE_DEPRECATED_TVOS 100000 164 #endif 165 #ifndef __API_TO_BE_DEPRECATED_TVOSAPPLICATIONEXTENSION 166 #define __API_TO_BE_DEPRECATED_TVOSAPPLICATIONEXTENSION 100000 167 #endif 168 169 170 171 #ifndef __API_TO_BE_DEPRECATED_DRIVERKIT 172 #define __API_TO_BE_DEPRECATED_DRIVERKIT 100000 173 #endif 174 175 #ifndef __API_TO_BE_DEPRECATED_VISIONOS 176 #define __API_TO_BE_DEPRECATED_VISIONOS 100000 177 #endif 178 #ifndef __API_TO_BE_DEPRECATED_VISIONOSAPPLICATIONEXTENSION 179 #define __API_TO_BE_DEPRECATED_VISIONOSAPPLICATIONEXTENSION 100000 180 #endif 181 182 #ifndef __API_TO_BE_DEPRECATED_EXCLAVEKIT 183 184 #endif 185 186 #ifndef __API_TO_BE_DEPRECATED_KERNELKIT 187 #define __API_TO_BE_DEPRECATED_KERNELKIT 100000 188 #endif 189 190 191 192 #ifndef __OPEN_SOURCE__ 193 194 #endif /* __OPEN_SOURCE__ */ 195 196 #include <AvailabilityVersions.h> 197 #include <AvailabilityInternal.h> 198 #include <AvailabilityInternalLegacy.h> 199 #if __has_include(<AvailabilityInternalPrivate.h>) 200 #include <AvailabilityInternalPrivate.h> 201 #endif 202 203 #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED 204 #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_ios 205 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ 206 __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep 207 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ 208 __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep##_MSG(_msg) 209 210 #elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) 211 212 #if defined(__has_builtin) 213 #if __has_builtin(__is_target_arch) 214 #if __has_builtin(__is_target_vendor) 215 #if __has_builtin(__is_target_os) 216 #if __has_builtin(__is_target_environment) 217 #if __has_builtin(__is_target_variant_os) 218 #if __has_builtin(__is_target_variant_environment) 219 #if (__is_target_arch(x86_64) && __is_target_vendor(apple) && ((__is_target_os(ios) && __is_target_environment(macabi)) || (__is_target_variant_os(ios) && __is_target_variant_environment(macabi)))) 220 #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_osx __AVAILABILITY_INTERNAL##_ios 221 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ 222 __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep 223 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ 224 __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep##_MSG(_msg) __AVAILABILITY_INTERNAL##_iosIntro##_DEP##_iosDep##_MSG(_msg) 225 #endif /* # if __is_target_arch... */ 226 #endif /* #if __has_builtin(__is_target_variant_environment) */ 227 #endif /* #if __has_builtin(__is_target_variant_os) */ 228 #endif /* #if __has_builtin(__is_target_environment) */ 229 #endif /* #if __has_builtin(__is_target_os) */ 230 #endif /* #if __has_builtin(__is_target_vendor) */ 231 #endif /* #if __has_builtin(__is_target_arch) */ 232 #endif /* #if defined(__has_builtin) */ 233 234 #ifndef __OSX_AVAILABLE_STARTING 235 #if defined(__has_attribute) && defined(__has_feature) 236 #if __has_attribute(availability) 237 #define __OSX_AVAILABLE_STARTING(_osx, _ios) __AVAILABILITY_INTERNAL##_osx 238 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) \ 239 __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep 240 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) \ 241 __AVAILABILITY_INTERNAL##_osxIntro##_DEP##_osxDep##_MSG(_msg) 242 #else 243 #define __OSX_AVAILABLE_STARTING(_osx, _ios) 244 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) 245 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) 246 #endif 247 #else 248 #define __OSX_AVAILABLE_STARTING(_osx, _ios) 249 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) 250 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) 251 #endif 252 #endif /* __OSX_AVAILABLE_STARTING */ 253 254 #else 255 #define __OSX_AVAILABLE_STARTING(_osx, _ios) 256 #define __OSX_AVAILABLE_BUT_DEPRECATED(_osxIntro, _osxDep, _iosIntro, _iosDep) 257 #define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(_osxIntro, _osxDep, _iosIntro, _iosDep, _msg) 258 #endif 259 260 261 #if defined(__has_feature) 262 #if __has_feature(attribute_availability_with_message) 263 #define __OS_AVAILABILITY(_target, _availability) __attribute__((availability(_target,_availability))) 264 #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) __attribute__((availability(_target,_availability,message=_msg))) 265 #elif __has_feature(attribute_availability) 266 #define __OS_AVAILABILITY(_target, _availability) __attribute__((availability(_target,_availability))) 267 #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) __attribute__((availability(_target,_availability))) 268 #else 269 #define __OS_AVAILABILITY(_target, _availability) 270 #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) 271 #endif 272 #else 273 #define __OS_AVAILABILITY(_target, _availability) 274 #define __OS_AVAILABILITY_MSG(_target, _availability, _msg) 275 #endif 276 277 278 /* for use to document app extension usage */ 279 #if defined(__has_feature) 280 #if __has_feature(attribute_availability_app_extension) 281 #define __OSX_EXTENSION_UNAVAILABLE(_msg) __OS_AVAILABILITY_MSG(macosx_app_extension,unavailable,_msg) 282 #define __IOS_EXTENSION_UNAVAILABLE(_msg) __OS_AVAILABILITY_MSG(ios_app_extension,unavailable,_msg) 283 #else 284 #define __OSX_EXTENSION_UNAVAILABLE(_msg) 285 #define __IOS_EXTENSION_UNAVAILABLE(_msg) 286 #endif 287 #else 288 #define __OSX_EXTENSION_UNAVAILABLE(_msg) 289 #define __IOS_EXTENSION_UNAVAILABLE(_msg) 290 #endif 291 292 #define __OS_EXTENSION_UNAVAILABLE(_msg) __OSX_EXTENSION_UNAVAILABLE(_msg) __IOS_EXTENSION_UNAVAILABLE(_msg) 293 294 295 296 /* for use marking APIs available info for Mac OSX */ 297 #if defined(__has_attribute) 298 #if __has_attribute(availability) 299 #define __OSX_UNAVAILABLE __OS_AVAILABILITY(macosx,unavailable) 300 #define __OSX_AVAILABLE(_vers) __OS_AVAILABILITY(macosx,introduced=_vers) 301 #define __OSX_DEPRECATED(_start, _dep, _msg) __OSX_AVAILABLE(_start) __OS_AVAILABILITY_MSG(macosx,deprecated=_dep,_msg) 302 #endif 303 #endif 304 305 #ifndef __OSX_UNAVAILABLE 306 #define __OSX_UNAVAILABLE 307 #endif 308 309 #ifndef __OSX_AVAILABLE 310 #define __OSX_AVAILABLE(_vers) 311 #endif 312 313 #ifndef __OSX_DEPRECATED 314 #define __OSX_DEPRECATED(_start, _dep, _msg) 315 #endif 316 317 318 #if __has_include(<AvailabilityProhibitedInternal.h>) 319 #include <AvailabilityProhibitedInternal.h> 320 #endif 321 322 /* for use marking APIs available info for iOS */ 323 #if defined(__has_attribute) 324 #if __has_attribute(availability) 325 #define __IOS_UNAVAILABLE __OS_AVAILABILITY(ios,unavailable) 326 #ifndef __IOS_PROHIBITED 327 #define __IOS_PROHIBITED __OS_AVAILABILITY(ios,unavailable) 328 #endif 329 #define __IOS_AVAILABLE(_vers) __OS_AVAILABILITY(ios,introduced=_vers) 330 #define __IOS_DEPRECATED(_start, _dep, _msg) __IOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(ios,deprecated=_dep,_msg) 331 #endif 332 #endif 333 334 #ifndef __IOS_UNAVAILABLE 335 #define __IOS_UNAVAILABLE 336 #endif 337 338 #ifndef __IOS_PROHIBITED 339 #define __IOS_PROHIBITED 340 #endif 341 342 #ifndef __IOS_AVAILABLE 343 #define __IOS_AVAILABLE(_vers) 344 #endif 345 346 #ifndef __IOS_DEPRECATED 347 #define __IOS_DEPRECATED(_start, _dep, _msg) 348 #endif 349 350 351 /* for use marking APIs available info for tvOS */ 352 #if defined(__has_feature) 353 #if __has_feature(attribute_availability_tvos) 354 #define __TVOS_UNAVAILABLE __OS_AVAILABILITY(tvos,unavailable) 355 #ifndef __TVOS_PROHIBITED 356 #define __TVOS_PROHIBITED __OS_AVAILABILITY(tvos,unavailable) 357 #endif 358 #define __TVOS_AVAILABLE(_vers) __OS_AVAILABILITY(tvos,introduced=_vers) 359 #define __TVOS_DEPRECATED(_start, _dep, _msg) __TVOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(tvos,deprecated=_dep,_msg) 360 #endif 361 #endif 362 363 #ifndef __TVOS_UNAVAILABLE 364 #define __TVOS_UNAVAILABLE 365 #endif 366 367 #ifndef __TVOS_PROHIBITED 368 #define __TVOS_PROHIBITED 369 #endif 370 371 #ifndef __TVOS_AVAILABLE 372 #define __TVOS_AVAILABLE(_vers) 373 #endif 374 375 #ifndef __TVOS_DEPRECATED 376 #define __TVOS_DEPRECATED(_start, _dep, _msg) 377 #endif 378 379 380 /* for use marking APIs available info for Watch OS */ 381 #if defined(__has_feature) 382 #if __has_feature(attribute_availability_watchos) 383 #define __WATCHOS_UNAVAILABLE __OS_AVAILABILITY(watchos,unavailable) 384 #ifndef __WATCHOS_PROHIBITED 385 #define __WATCHOS_PROHIBITED __OS_AVAILABILITY(watchos,unavailable) 386 #endif 387 #define __WATCHOS_AVAILABLE(_vers) __OS_AVAILABILITY(watchos,introduced=_vers) 388 #define __WATCHOS_DEPRECATED(_start, _dep, _msg) __WATCHOS_AVAILABLE(_start) __OS_AVAILABILITY_MSG(watchos,deprecated=_dep,_msg) 389 #endif 390 #endif 391 392 #ifndef __WATCHOS_UNAVAILABLE 393 #define __WATCHOS_UNAVAILABLE 394 #endif 395 396 #ifndef __WATCHOS_PROHIBITED 397 #define __WATCHOS_PROHIBITED 398 #endif 399 400 #ifndef __WATCHOS_AVAILABLE 401 #define __WATCHOS_AVAILABLE(_vers) 402 #endif 403 404 #ifndef __WATCHOS_DEPRECATED 405 #define __WATCHOS_DEPRECATED(_start, _dep, _msg) 406 #endif 407 408 /* for use marking APIs unavailable for swift */ 409 #if defined(__has_feature) 410 #if __has_feature(attribute_availability_swift) 411 #define __SWIFT_UNAVAILABLE __OS_AVAILABILITY(swift,unavailable) 412 #define __SWIFT_UNAVAILABLE_MSG(_msg) __OS_AVAILABILITY_MSG(swift,unavailable,_msg) 413 #endif 414 #endif 415 416 #ifndef __SWIFT_UNAVAILABLE 417 #define __SWIFT_UNAVAILABLE 418 #endif 419 420 #ifndef __SWIFT_UNAVAILABLE_MSG 421 #define __SWIFT_UNAVAILABLE_MSG(_msg) 422 #endif 423 424 /* 425 Macros for defining which versions/platform a given symbol can be used. 426 427 @see http://clang.llvm.org/docs/AttributeReference.html#availability 428 429 * Note that these macros are only compatible with clang compilers that 430 * support the following target selection options: 431 * 432 * -mmacosx-version-min 433 * -miphoneos-version-min 434 * -mwatchos-version-min 435 * -mtvos-version-min 436 */ 437 438 #if defined(__has_feature) && defined(__has_attribute) 439 #if __has_attribute(availability) 440 441 /* 442 * API Introductions 443 * 444 * Use to specify the release that a particular API became available. 445 * 446 * Platform names: 447 * macos, macOSApplicationExtension, macCatalyst, macCatalystApplicationExtension, 448 * ios, iOSApplicationExtension, tvos, tvOSApplicationExtension, watchos, 449 * watchOSApplicationExtension, driverkit, visionos, visionOSApplicationExtension 450 * 451 * Examples: 452 * __API_AVAILABLE(macos(10.10)) 453 * __API_AVAILABLE(macos(10.9), ios(10.0)) 454 * __API_AVAILABLE(macos(10.4), ios(8.0), watchos(2.0), tvos(10.0)) 455 * __API_AVAILABLE(driverkit(19.0)) 456 */ 457 #define __API_AVAILABLE(...) __API_AVAILABLE_GET_MACRO_93585900(__VA_ARGS__,__API_AVAILABLE15,__API_AVAILABLE14,__API_AVAILABLE13,__API_AVAILABLE12,__API_AVAILABLE11,__API_AVAILABLE10,__API_AVAILABLE9,__API_AVAILABLE8,__API_AVAILABLE7,__API_AVAILABLE6,__API_AVAILABLE5,__API_AVAILABLE4,__API_AVAILABLE3,__API_AVAILABLE2,__API_AVAILABLE1,__API_AVAILABLE0,0)(__VA_ARGS__) 458 459 #define __API_AVAILABLE_BEGIN(...) _Pragma("clang attribute push") __API_AVAILABLE_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_AVAILABLE_BEGIN15,__API_AVAILABLE_BEGIN14,__API_AVAILABLE_BEGIN13,__API_AVAILABLE_BEGIN12,__API_AVAILABLE_BEGIN11,__API_AVAILABLE_BEGIN10,__API_AVAILABLE_BEGIN9,__API_AVAILABLE_BEGIN8,__API_AVAILABLE_BEGIN7,__API_AVAILABLE_BEGIN6,__API_AVAILABLE_BEGIN5,__API_AVAILABLE_BEGIN4,__API_AVAILABLE_BEGIN3,__API_AVAILABLE_BEGIN2,__API_AVAILABLE_BEGIN1,__API_AVAILABLE_BEGIN0,0)(__VA_ARGS__) 460 #define __API_AVAILABLE_END _Pragma("clang attribute pop") 461 462 /* 463 * API Deprecations 464 * 465 * Use to specify the release that a particular API became deprecated. 466 * 467 * Platform names: 468 * macos, macOSApplicationExtension, macCatalyst, macCatalystApplicationExtension, 469 * ios, iOSApplicationExtension, tvos, tvOSApplicationExtension, watchos, 470 * watchOSApplicationExtension, driverkit, visionos, visionOSApplicationExtension 471 * 472 * Examples: 473 * 474 * __API_DEPRECATED("Deprecated", macos(10.4, 10.8)) 475 * __API_DEPRECATED("Deprecated", macos(10.4, 10.8), ios(2.0, 3.0), watchos(2.0, 3.0), tvos(9.0, 10.0)) 476 * 477 * __API_DEPRECATED_WITH_REPLACEMENT("-setName:", tvos(10.0, 10.4), ios(9.0, 10.0)) 478 * __API_DEPRECATED_WITH_REPLACEMENT("SomeClassName", macos(10.4, 10.6), watchos(2.0, 3.0)) 479 */ 480 #define __API_DEPRECATED(...) __API_DEPRECATED_MSG_GET_MACRO_93585900(__VA_ARGS__,__API_DEPRECATED_MSG15,__API_DEPRECATED_MSG14,__API_DEPRECATED_MSG13,__API_DEPRECATED_MSG12,__API_DEPRECATED_MSG11,__API_DEPRECATED_MSG10,__API_DEPRECATED_MSG9,__API_DEPRECATED_MSG8,__API_DEPRECATED_MSG7,__API_DEPRECATED_MSG6,__API_DEPRECATED_MSG5,__API_DEPRECATED_MSG4,__API_DEPRECATED_MSG3,__API_DEPRECATED_MSG2,__API_DEPRECATED_MSG1,__API_DEPRECATED_MSG0,0,0)(__VA_ARGS__) 481 #define __API_DEPRECATED_WITH_REPLACEMENT(...) __API_DEPRECATED_REP_GET_MACRO_93585900(__VA_ARGS__,__API_DEPRECATED_REP15,__API_DEPRECATED_REP14,__API_DEPRECATED_REP13,__API_DEPRECATED_REP12,__API_DEPRECATED_REP11,__API_DEPRECATED_REP10,__API_DEPRECATED_REP9,__API_DEPRECATED_REP8,__API_DEPRECATED_REP7,__API_DEPRECATED_REP6,__API_DEPRECATED_REP5,__API_DEPRECATED_REP4,__API_DEPRECATED_REP3,__API_DEPRECATED_REP2,__API_DEPRECATED_REP1,__API_DEPRECATED_REP0,0,0)(__VA_ARGS__) 482 483 #define __API_DEPRECATED_BEGIN(...) _Pragma("clang attribute push") __API_DEPRECATED_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_DEPRECATED_BEGIN15,__API_DEPRECATED_BEGIN14,__API_DEPRECATED_BEGIN13,__API_DEPRECATED_BEGIN12,__API_DEPRECATED_BEGIN11,__API_DEPRECATED_BEGIN10,__API_DEPRECATED_BEGIN9,__API_DEPRECATED_BEGIN8,__API_DEPRECATED_BEGIN7,__API_DEPRECATED_BEGIN6,__API_DEPRECATED_BEGIN5,__API_DEPRECATED_BEGIN4,__API_DEPRECATED_BEGIN3,__API_DEPRECATED_BEGIN2,__API_DEPRECATED_BEGIN1,__API_DEPRECATED_BEGIN0,0,0)(__VA_ARGS__) 484 #define __API_DEPRECATED_END _Pragma("clang attribute pop") 485 486 #define __API_DEPRECATED_WITH_REPLACEMENT_BEGIN(...) _Pragma("clang attribute push") __API_DEPRECATED_WITH_REPLACEMENT_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN15,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN14,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN13,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN12,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN11,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN10,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN9,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN8,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN7,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN6,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN5,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN4,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN3,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN2,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN1,__API_DEPRECATED_WITH_REPLACEMENT_BEGIN0,0,0)(__VA_ARGS__) 487 #define __API_DEPRECATED_WITH_REPLACEMENT_END _Pragma("clang attribute pop") 488 489 490 #define __API_OBSOLETED(...) __API_OBSOLETED_MSG_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_MSG15,__API_OBSOLETED_MSG14,__API_OBSOLETED_MSG13,__API_OBSOLETED_MSG12,__API_OBSOLETED_MSG11,__API_OBSOLETED_MSG10,__API_OBSOLETED_MSG9,__API_OBSOLETED_MSG8,__API_OBSOLETED_MSG7,__API_OBSOLETED_MSG6,__API_OBSOLETED_MSG5,__API_OBSOLETED_MSG4,__API_OBSOLETED_MSG3,__API_OBSOLETED_MSG2,__API_OBSOLETED_MSG1,__API_OBSOLETED_MSG0,0,0)(__VA_ARGS__) 491 #define __API_OBSOLETED_WITH_REPLACEMENT(...) __API_OBSOLETED_REP_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_REP15,__API_OBSOLETED_REP14,__API_OBSOLETED_REP13,__API_OBSOLETED_REP12,__API_OBSOLETED_REP11,__API_OBSOLETED_REP10,__API_OBSOLETED_REP9,__API_OBSOLETED_REP8,__API_OBSOLETED_REP7,__API_OBSOLETED_REP6,__API_OBSOLETED_REP5,__API_OBSOLETED_REP4,__API_OBSOLETED_REP3,__API_OBSOLETED_REP2,__API_OBSOLETED_REP1,__API_OBSOLETED_REP0,0,0)(__VA_ARGS__) 492 493 #define __API_OBSOLETED_BEGIN(...) _Pragma("clang attribute push") __API_OBSOLETED_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_BEGIN15,__API_OBSOLETED_BEGIN14,__API_OBSOLETED_BEGIN13,__API_OBSOLETED_BEGIN12,__API_OBSOLETED_BEGIN11,__API_OBSOLETED_BEGIN10,__API_OBSOLETED_BEGIN9,__API_OBSOLETED_BEGIN8,__API_OBSOLETED_BEGIN7,__API_OBSOLETED_BEGIN6,__API_OBSOLETED_BEGIN5,__API_OBSOLETED_BEGIN4,__API_OBSOLETED_BEGIN3,__API_OBSOLETED_BEGIN2,__API_OBSOLETED_BEGIN1,__API_OBSOLETED_BEGIN0,0,0)(__VA_ARGS__) 494 #define __API_OBSOLETED_END _Pragma("clang attribute pop") 495 496 #define __API_OBSOLETED_WITH_REPLACEMENT_BEGIN(...) _Pragma("clang attribute push") __API_OBSOLETED_WITH_REPLACEMENT_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN15,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN14,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN13,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN12,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN11,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN10,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN9,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN8,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN7,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN6,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN5,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN4,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN3,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN2,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN1,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN0,0,0)(__VA_ARGS__) 497 #define __API_OBSOLETED_WITH_REPLACEMENT_END _Pragma("clang attribute pop") 498 499 /* 500 * API Unavailability 501 * Use to specify that an API is unavailable for a particular platform. 502 * 503 * Example: 504 * __API_UNAVAILABLE(macos) 505 * __API_UNAVAILABLE(watchos, tvos) 506 */ 507 #define __API_UNAVAILABLE(...) __API_UNAVAILABLE_GET_MACRO_93585900(__VA_ARGS__,__API_UNAVAILABLE15,__API_UNAVAILABLE14,__API_UNAVAILABLE13,__API_UNAVAILABLE12,__API_UNAVAILABLE11,__API_UNAVAILABLE10,__API_UNAVAILABLE9,__API_UNAVAILABLE8,__API_UNAVAILABLE7,__API_UNAVAILABLE6,__API_UNAVAILABLE5,__API_UNAVAILABLE4,__API_UNAVAILABLE3,__API_UNAVAILABLE2,__API_UNAVAILABLE1,__API_UNAVAILABLE0,0)(__VA_ARGS__) 508 509 #define __API_UNAVAILABLE_BEGIN(...) _Pragma("clang attribute push") __API_UNAVAILABLE_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_UNAVAILABLE_BEGIN15,__API_UNAVAILABLE_BEGIN14,__API_UNAVAILABLE_BEGIN13,__API_UNAVAILABLE_BEGIN12,__API_UNAVAILABLE_BEGIN11,__API_UNAVAILABLE_BEGIN10,__API_UNAVAILABLE_BEGIN9,__API_UNAVAILABLE_BEGIN8,__API_UNAVAILABLE_BEGIN7,__API_UNAVAILABLE_BEGIN6,__API_UNAVAILABLE_BEGIN5,__API_UNAVAILABLE_BEGIN4,__API_UNAVAILABLE_BEGIN3,__API_UNAVAILABLE_BEGIN2,__API_UNAVAILABLE_BEGIN1,__API_UNAVAILABLE_BEGIN0,0)(__VA_ARGS__) 510 #define __API_UNAVAILABLE_END _Pragma("clang attribute pop") 511 #endif /* __has_attribute(availability) */ 512 #endif /* #if defined(__has_feature) && defined(__has_attribute) */ 513 514 /* 515 * Evaluate to nothing for compilers that don't support availability. 516 */ 517 518 #ifndef __API_AVAILABLE 519 #define __API_AVAILABLE(...) 520 #endif 521 522 #ifndef __API_AVAILABLE_BEGIN 523 #define __API_AVAILABLE_BEGIN(...) 524 #endif 525 526 #ifndef __API_AVAILABLE_END 527 #define __API_AVAILABLE_END(...) 528 #endif 529 530 #ifndef __API_DEPRECATED 531 #define __API_DEPRECATED(...) 532 #endif 533 534 #ifndef __API_DEPRECATED_BEGIN 535 #define __API_DEPRECATED_BEGIN(...) 536 #endif 537 538 #ifndef __API_DEPRECATED_END 539 #define __API_DEPRECATED_END(...) 540 #endif 541 542 #ifndef __API_DEPRECATED_WITH_REPLACEMENT 543 #define __API_DEPRECATED_WITH_REPLACEMENT(...) 544 #endif 545 546 #ifndef __API_DEPRECATED_WITH_REPLACEMENT_BEGIN 547 #define __API_DEPRECATED_WITH_REPLACEMENT_BEGIN(...) 548 #endif 549 550 #ifndef __API_DEPRECATED_WITH_REPLACEMENT_END 551 #define __API_DEPRECATED_WITH_REPLACEMENT_END(...) 552 #endif 553 554 #ifndef __API_OBSOLETED 555 #define __API_OBSOLETED(...) 556 #endif 557 558 #ifndef __API_OBSOLETED_BEGIN 559 #define __API_OBSOLETED_BEGIN(...) 560 #endif 561 562 #ifndef __API_OBSOLETED_END 563 #define __API_OBSOLETED_END(...) 564 #endif 565 566 #ifndef __API_OBSOLETED_WITH_REPLACEMENT 567 #define __API_OBSOLETED_WITH_REPLACEMENT(...) 568 #endif 569 570 #ifndef __API_OBSOLETED_WITH_REPLACEMENT_BEGIN 571 #define __API_OBSOLETED_WITH_REPLACEMENT_BEGIN(...) 572 #endif 573 574 #ifndef __API_OBSOLETED_WITH_REPLACEMENT_END 575 #define __API_OBSOLETED_WITH_REPLACEMENT_END(...) 576 #endif 577 578 #ifndef __API_UNAVAILABLE 579 #define __API_UNAVAILABLE(...) 580 #endif 581 582 #ifndef __API_UNAVAILABLE_BEGIN 583 #define __API_UNAVAILABLE_BEGIN(...) 584 #endif 585 586 #ifndef __API_UNAVAILABLE_END 587 #define __API_UNAVAILABLE_END(...) 588 #endif 589 590 /* 591 * If SPI decorations have not been defined elsewhere, disable them. 592 */ 593 594 #ifndef __SPI_AVAILABLE 595 #define __SPI_AVAILABLE(...) 596 #endif 597 598 #ifndef __SPI_AVAILABLE_BEGIN 599 #define __SPI_AVAILABLE_BEGIN(...) 600 #endif 601 602 #ifndef __SPI_AVAILABLE_END 603 #define __SPI_AVAILABLE_END(...) 604 #endif 605 606 #ifndef __SPI_DEPRECATED 607 #define __SPI_DEPRECATED(...) 608 #endif 609 610 #ifndef __SPI_DEPRECATED_WITH_REPLACEMENT 611 #define __SPI_DEPRECATED_WITH_REPLACEMENT(...) 612 #endif 613 614 #endif /* __AVAILABILITY__ */ 615 616 #ifndef __OPEN_SOURCE__ 617 // This is explicitly outside the header guard 618 #ifndef __AVAILABILITY_VERSIONS_VERSION_HASH 619 #define __AVAILABILITY_VERSIONS_VERSION_HASH 93585900U 620 #define __AVAILABILITY_VERSIONS_VERSION_STRING "Local" 621 #define __AVAILABILITY_FILE "Availability.h" 622 #elif __AVAILABILITY_VERSIONS_VERSION_HASH != 93585900U 623 #pragma GCC error "Already found AvailabilityVersions version " __AVAILABILITY_FILE " from " __AVAILABILITY_VERSIONS_VERSION_STRING ", which is incompatible with Availability.h from Local. Mixing and matching Availability from different SDKs is not supported" 624 #endif /* __AVAILABILITY_VERSIONS_VERSION_HASH */ 625 #endif /* __OPEN_SOURCE__ */