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