xref: /aosp_15_r20/prebuilts/sdk/utils.bzl (revision 344a7f5ef16c479e7a7f54ee6567a9d112f9e72b)
1*344a7f5eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project
2*344a7f5eSAndroid Build Coastguard Worker#
3*344a7f5eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*344a7f5eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*344a7f5eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*344a7f5eSAndroid Build Coastguard Worker#
7*344a7f5eSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*344a7f5eSAndroid Build Coastguard Worker#
9*344a7f5eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*344a7f5eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*344a7f5eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*344a7f5eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*344a7f5eSAndroid Build Coastguard Worker# limitations under the License.
14*344a7f5eSAndroid Build Coastguard Worker
15*344a7f5eSAndroid Build Coastguard Worker"""Constants and utility functions relating to prebuilt SDKs.
16*344a7f5eSAndroid Build Coastguard Worker"""
17*344a7f5eSAndroid Build Coastguard Worker
18*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api")
19*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
20*344a7f5eSAndroid Build Coastguard Worker
21*344a7f5eSAndroid Build Coastguard Worker# The highest numbered directory under prebuilts/sdk that provides an android.jar
22*344a7f5eSAndroid Build Coastguard Worker_MAX_API_LEVEL = 34
23*344a7f5eSAndroid Build Coastguard Worker
24*344a7f5eSAndroid Build Coastguard Worker# All api levels that have a prebuilt SDK.
25*344a7f5eSAndroid Build Coastguard Worker_API_LEVELS = list(range(4, _MAX_API_LEVEL + 1)) + [api.FUTURE_API_LEVEL]
26*344a7f5eSAndroid Build Coastguard Worker
27*344a7f5eSAndroid Build Coastguard Workerdef _available_kinds_for_api_level(api_level):
28*344a7f5eSAndroid Build Coastguard Worker    """Return the available SDK kinds (or scopes) under the given api level directory."""
29*344a7f5eSAndroid Build Coastguard Worker    if api_level not in _API_LEVELS:
30*344a7f5eSAndroid Build Coastguard Worker        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
31*344a7f5eSAndroid Build Coastguard Worker    if api_level == api.FUTURE_API_LEVEL:
32*344a7f5eSAndroid Build Coastguard Worker        return [
33*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_PUBLIC,
34*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_SYSTEM,
35*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_TEST,
36*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_SYSTEM_SERVER,
37*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_MODULE,
38*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_CORE,
39*344a7f5eSAndroid Build Coastguard Worker        ]
40*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 20:
41*344a7f5eSAndroid Build Coastguard Worker        return [sdk_version.KIND_PUBLIC]
42*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 28:
43*344a7f5eSAndroid Build Coastguard Worker        return [
44*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_PUBLIC,
45*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_SYSTEM,
46*344a7f5eSAndroid Build Coastguard Worker        ]
47*344a7f5eSAndroid Build Coastguard Worker    if api_level == 29:
48*344a7f5eSAndroid Build Coastguard Worker        return [
49*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_PUBLIC,
50*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_SYSTEM,
51*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_TEST,
52*344a7f5eSAndroid Build Coastguard Worker        ]
53*344a7f5eSAndroid Build Coastguard Worker    return [
54*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_PUBLIC,
55*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_SYSTEM,
56*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_TEST,
57*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_SYSTEM_SERVER,
58*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_MODULE,
59*344a7f5eSAndroid Build Coastguard Worker    ]
60*344a7f5eSAndroid Build Coastguard Worker
61*344a7f5eSAndroid Build Coastguard Worker# core-for-system-modules public starts at v30, module starts at v33.
62*344a7f5eSAndroid Build Coastguard Workerdef _available_core_kinds_for_api_level(api_level):
63*344a7f5eSAndroid Build Coastguard Worker    """Return all core module kinds available for a given api level."""
64*344a7f5eSAndroid Build Coastguard Worker    if api_level not in _API_LEVELS:
65*344a7f5eSAndroid Build Coastguard Worker        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
66*344a7f5eSAndroid Build Coastguard Worker    if api_level == api.FUTURE_API_LEVEL:
67*344a7f5eSAndroid Build Coastguard Worker        return [
68*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_PUBLIC,
69*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_MODULE,
70*344a7f5eSAndroid Build Coastguard Worker        ]
71*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 29:
72*344a7f5eSAndroid Build Coastguard Worker        return []
73*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 32:
74*344a7f5eSAndroid Build Coastguard Worker        return [sdk_version.KIND_PUBLIC]
75*344a7f5eSAndroid Build Coastguard Worker    return [
76*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_PUBLIC,
77*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_MODULE,
78*344a7f5eSAndroid Build Coastguard Worker    ]
79*344a7f5eSAndroid Build Coastguard Worker
80*344a7f5eSAndroid Build Coastguard Workerdef _to_core_kind(kind, api_level):
81*344a7f5eSAndroid Build Coastguard Worker    """Returns the core kind corresponding to the input kind and api level."""
82*344a7f5eSAndroid Build Coastguard Worker    if api_level not in _API_LEVELS:
83*344a7f5eSAndroid Build Coastguard Worker        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
84*344a7f5eSAndroid Build Coastguard Worker    if api_level == api.FUTURE_API_LEVEL:
85*344a7f5eSAndroid Build Coastguard Worker        return (
86*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_MODULE if kind in (
87*344a7f5eSAndroid Build Coastguard Worker                sdk_version.KIND_MODULE,
88*344a7f5eSAndroid Build Coastguard Worker                sdk_version.KIND_SYSTEM_SERVER,
89*344a7f5eSAndroid Build Coastguard Worker            ) else sdk_version.KIND_PUBLIC
90*344a7f5eSAndroid Build Coastguard Worker        )
91*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 29:
92*344a7f5eSAndroid Build Coastguard Worker        return None
93*344a7f5eSAndroid Build Coastguard Worker    if api_level <= 32:
94*344a7f5eSAndroid Build Coastguard Worker        return sdk_version.KIND_PUBLIC
95*344a7f5eSAndroid Build Coastguard Worker    return (
96*344a7f5eSAndroid Build Coastguard Worker        sdk_version.KIND_MODULE if kind in (
97*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_MODULE,
98*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_SYSTEM_SERVER,
99*344a7f5eSAndroid Build Coastguard Worker        ) else sdk_version.KIND_PUBLIC
100*344a7f5eSAndroid Build Coastguard Worker    )
101*344a7f5eSAndroid Build Coastguard Worker
102*344a7f5eSAndroid Build Coastguard Workerdef _to_aidl_kind(kind, api_level):
103*344a7f5eSAndroid Build Coastguard Worker    """Returns the best available framework.aidl prebuilt kind for the given kind X api level."""
104*344a7f5eSAndroid Build Coastguard Worker    if api_level not in _API_LEVELS:
105*344a7f5eSAndroid Build Coastguard Worker        fail("api_level %s is not one of %s" % (api_level, _API_LEVELS.join(",")))
106*344a7f5eSAndroid Build Coastguard Worker    if api_level == api.FUTURE_API_LEVEL:
107*344a7f5eSAndroid Build Coastguard Worker        return sdk_version.KIND_PUBLIC
108*344a7f5eSAndroid Build Coastguard Worker
109*344a7f5eSAndroid Build Coastguard Worker    # Only 23 and 28 provide framework.aidl for system.
110*344a7f5eSAndroid Build Coastguard Worker    if api_level in (23, 28) and kind == sdk_version.KIND_SYSTEM:
111*344a7f5eSAndroid Build Coastguard Worker        return sdk_version.KIND_SYSTEM
112*344a7f5eSAndroid Build Coastguard Worker    return sdk_version.KIND_PUBLIC
113*344a7f5eSAndroid Build Coastguard Worker
114*344a7f5eSAndroid Build Coastguard Workerdef _to_kind_dir(kind):
115*344a7f5eSAndroid Build Coastguard Worker    """Maps kind as specified in sdk_version with the corresponding directory under prebuilt/sdk"""
116*344a7f5eSAndroid Build Coastguard Worker    if kind == sdk_version.KIND_MODULE:
117*344a7f5eSAndroid Build Coastguard Worker        return "module-lib"
118*344a7f5eSAndroid Build Coastguard Worker    if kind == sdk_version.KIND_SYSTEM_SERVER:
119*344a7f5eSAndroid Build Coastguard Worker        return "system-server"
120*344a7f5eSAndroid Build Coastguard Worker    return kind
121*344a7f5eSAndroid Build Coastguard Worker
122*344a7f5eSAndroid Build Coastguard Workerprebuilt_sdk_utils = struct(
123*344a7f5eSAndroid Build Coastguard Worker    MAX_API_LEVEL = _MAX_API_LEVEL,
124*344a7f5eSAndroid Build Coastguard Worker    API_LEVELS = _API_LEVELS,
125*344a7f5eSAndroid Build Coastguard Worker    available_kinds_for_api_level = _available_kinds_for_api_level,
126*344a7f5eSAndroid Build Coastguard Worker    available_core_kinds_for_api_level = _available_core_kinds_for_api_level,
127*344a7f5eSAndroid Build Coastguard Worker    to_core_kind = _to_core_kind,
128*344a7f5eSAndroid Build Coastguard Worker    to_aidl_kind = _to_aidl_kind,
129*344a7f5eSAndroid Build Coastguard Worker    to_kind_dir = _to_kind_dir,
130*344a7f5eSAndroid Build Coastguard Worker)
131