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