blob: bc2e0f8be117402af4a8d435e745c28dc4334fca [file] [log] [blame]
# Copyright 2025 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Functions related to the Fuchsia API level."""
# Only toolchains should need to use the API level as an integer.
visibility(["//build/bazel/..."])
def get_integer_for_api_level(api_level):
"""Returns the integer reprsentation of the Fuchsia `api_level`.
This should only be used to pass an integer representation of the current
target API level to build tools, such as Clang, or to determine whether to
include a Fuchsia package in the IDK.
Individual target definitions should not use it.
"""
# Numerical values associated with special API levels, as defined in
# https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0246_api_levels_are_32_bits#special_api_levels.
_FIRST_RESERVED_API_LEVEL = 2147483648 # 0x80000000
_API_LEVEL_NEXT_AS_INTEGER = 4291821568
_API_LEVEL_HEAD_AS_INTEGER = 4292870144
_API_LEVEL_PLATFORM_AS_INTEGER = 4293918720
if api_level == "NEXT":
return _API_LEVEL_NEXT_AS_INTEGER
elif api_level == "HEAD":
return _API_LEVEL_HEAD_AS_INTEGER
elif api_level == "PLATFORM":
return _API_LEVEL_PLATFORM_AS_INTEGER
else:
# If the string is not an integer, this will raise a ValueError.
api_level_integer = int(api_level)
# `current_build_target_api_level` must be an integer. Ensure it adheres to
# https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0246_api_levels_are_32_bits#design.
if api_level_integer < 0:
fail("Non-special API levels must be a positive integer, not: %s" % api_level_integer)
if api_level_integer >= _FIRST_RESERVED_API_LEVEL:
fail("Special API levels should be given by name, not number: %s" % api_level_integer)
return api_level_integer