xref: /aosp_15_r20/build/bazel/rules/common/sdk_version.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api")
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Worker# Only scopes that are available in prebuilts (and "none") are listed
18*7594170eSAndroid Build Coastguard Worker# here for now, but the list should eventually match Soong's SdkKind
19*7594170eSAndroid Build Coastguard Worker# enum.
20*7594170eSAndroid Build Coastguard Worker_KIND_PUBLIC = "public"
21*7594170eSAndroid Build Coastguard Worker_KIND_SYSTEM = "system"
22*7594170eSAndroid Build Coastguard Worker_KIND_TEST = "test"
23*7594170eSAndroid Build Coastguard Worker_KIND_SYSTEM_SERVER = "system_server"
24*7594170eSAndroid Build Coastguard Worker_KIND_MODULE = "module"
25*7594170eSAndroid Build Coastguard Worker_KIND_CORE = "core"
26*7594170eSAndroid Build Coastguard Worker_KIND_NONE = "none"
27*7594170eSAndroid Build Coastguard Worker_KIND_CORE_PLATFORM = "core_platform"
28*7594170eSAndroid Build Coastguard Worker_ALL_KINDS = [
29*7594170eSAndroid Build Coastguard Worker    _KIND_PUBLIC,
30*7594170eSAndroid Build Coastguard Worker    _KIND_SYSTEM,
31*7594170eSAndroid Build Coastguard Worker    _KIND_TEST,
32*7594170eSAndroid Build Coastguard Worker    _KIND_SYSTEM_SERVER,
33*7594170eSAndroid Build Coastguard Worker    _KIND_MODULE,
34*7594170eSAndroid Build Coastguard Worker    _KIND_CORE,
35*7594170eSAndroid Build Coastguard Worker    _KIND_NONE,
36*7594170eSAndroid Build Coastguard Worker    # _KIND_CORE_PLATFORM, # TODO: Add when core_plaform is supported in b builds
37*7594170eSAndroid Build Coastguard Worker]
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker# Starlark implementation of SdkSpecFrom at https://cs.android.com/android/platform/build/soong/+/master:android/sdk_version.go;l=248-299;drc=69f4218c4feaeca953237cd9e76a9a8cc423d3e3.
40*7594170eSAndroid Build Coastguard Workerdef _sdk_spec_from(sdk_version):
41*7594170eSAndroid Build Coastguard Worker    """Parses an sdk_version string into kind and api_level.
42*7594170eSAndroid Build Coastguard Worker
43*7594170eSAndroid Build Coastguard Worker    Args:
44*7594170eSAndroid Build Coastguard Worker        sdk_version: a string to specify which SDK version to depend on.
45*7594170eSAndroid Build Coastguard Worker            - The empty string maps to the full set of private APIs and is currently unsupported.
46*7594170eSAndroid Build Coastguard Worker            - "core_platform" maps to the module scope of the core system modules.
47*7594170eSAndroid Build Coastguard Worker            - "none" maps to no SDK (used for bootstrapping the core).
48*7594170eSAndroid Build Coastguard Worker            - Otherwise, the format is "{kind}_{api_level}", where kind must be one of the strings
49*7594170eSAndroid Build Coastguard Worker              in ALL_KINDS, and api_level is either an integer, and android codename, or "current".
50*7594170eSAndroid Build Coastguard Worker              The default kind is "public", and can be omitted by simply providing "{api_level}".
51*7594170eSAndroid Build Coastguard Worker
52*7594170eSAndroid Build Coastguard Worker    Returns:
53*7594170eSAndroid Build Coastguard Worker        A struct with a kind attribute set to one of the string in ALL_KINDS, and an api_level
54*7594170eSAndroid Build Coastguard Worker        attribute as returned by api.bzl's parse_api_level_from_version.
55*7594170eSAndroid Build Coastguard Worker    """
56*7594170eSAndroid Build Coastguard Worker    if not sdk_version:
57*7594170eSAndroid Build Coastguard Worker        fail("Only prebuilt SDK versions are available, sdk_version must be specified and non-empty.")
58*7594170eSAndroid Build Coastguard Worker    if sdk_version == "core_platform":
59*7594170eSAndroid Build Coastguard Worker        fail("Only prebuilt SDK versions are available, sdk_version core_platform is not yet supported.")
60*7594170eSAndroid Build Coastguard Worker    if sdk_version == "none":
61*7594170eSAndroid Build Coastguard Worker        return struct(kind = _KIND_NONE, api_level = api.NONE_API_LEVEL, _api_level_string = "(no version)")
62*7594170eSAndroid Build Coastguard Worker    if type(sdk_version) != type(""):
63*7594170eSAndroid Build Coastguard Worker        fail("sdk_version must be a string")
64*7594170eSAndroid Build Coastguard Worker    sep_index = sdk_version.rfind("_")
65*7594170eSAndroid Build Coastguard Worker    api_level_string = sdk_version if sep_index < 0 else sdk_version[sep_index + 1:]
66*7594170eSAndroid Build Coastguard Worker    api_level = api.parse_api_level_from_version(api_level_string)
67*7594170eSAndroid Build Coastguard Worker    kind = _KIND_PUBLIC if sep_index == -1 else sdk_version[:sep_index]
68*7594170eSAndroid Build Coastguard Worker    if kind not in _ALL_KINDS:
69*7594170eSAndroid Build Coastguard Worker        fail("kind %s parsed from sdk_version %s must be one of %s" % (
70*7594170eSAndroid Build Coastguard Worker            kind,
71*7594170eSAndroid Build Coastguard Worker            sdk_version,
72*7594170eSAndroid Build Coastguard Worker            ",".join(_ALL_KINDS),
73*7594170eSAndroid Build Coastguard Worker        ))
74*7594170eSAndroid Build Coastguard Worker    return struct(kind = kind, api_level = api_level, _api_level_string = api_level_string)
75*7594170eSAndroid Build Coastguard Worker
76*7594170eSAndroid Build Coastguard Workerdef _api_level_string_with_fallback(api_level_string, sdk_version):
77*7594170eSAndroid Build Coastguard Worker    return api_level_string if api_level_string else _sdk_spec_from(sdk_version)._api_level_string
78*7594170eSAndroid Build Coastguard Worker
79*7594170eSAndroid Build Coastguard Workersdk_version = struct(
80*7594170eSAndroid Build Coastguard Worker    KIND_PUBLIC = _KIND_PUBLIC,
81*7594170eSAndroid Build Coastguard Worker    KIND_SYSTEM = _KIND_SYSTEM,
82*7594170eSAndroid Build Coastguard Worker    KIND_TEST = _KIND_TEST,
83*7594170eSAndroid Build Coastguard Worker    KIND_SYSTEM_SERVER = _KIND_SYSTEM_SERVER,
84*7594170eSAndroid Build Coastguard Worker    KIND_MODULE = _KIND_MODULE,
85*7594170eSAndroid Build Coastguard Worker    KIND_CORE = _KIND_CORE,
86*7594170eSAndroid Build Coastguard Worker    KIND_NONE = _KIND_NONE,
87*7594170eSAndroid Build Coastguard Worker    KIND_CORE_PLATFORM = _KIND_CORE_PLATFORM,
88*7594170eSAndroid Build Coastguard Worker    ALL_KINDS = _ALL_KINDS,
89*7594170eSAndroid Build Coastguard Worker    api_level_string_with_fallback = _api_level_string_with_fallback,
90*7594170eSAndroid Build Coastguard Worker    sdk_spec_from = _sdk_spec_from,
91*7594170eSAndroid Build Coastguard Worker)
92