// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_ANDROID_REQUIRES_API_H_ #define BASE_ANDROID_REQUIRES_API_H_ // Sets the API version of a symbol. Analogous to how @RequiresApi sets the API // version of Java symbols. // // A compiler warning (-Wunguarded-availability) is emitted when symbols with // this annotation are reference by code that has a lower API version. // // The default API version is set by the default_min_sdk_version GN arg. // // To reference a symbol from code with a lower api level, you must use: // if (__builtin_available(android API_VERSION, *)) { ... } // // See also: // https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#weak-symbols-for-api-definitions #define REQUIRES_ANDROID_API(x) \ __attribute__((__availability__(android, introduced = x))) // Sets the default API version for all symbols. // // Usage: // #pragma clang attribute push DEFAULT_REQUIRES_ANDROID_API(29) // ... // #pragma clang attribute pop // // For use only within .cc files so that declarations within header files are // clearly labeled. #define DEFAULT_REQUIRES_ANDROID_API(x) \ (REQUIRES_ANDROID_API(x), \ apply_to = any(enum, enum_constant, field, function, namespace, record, \ type_alias, variable)) #endif // BASE_ANDROID_REQUIRES_API_H_