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 Worker""" 16*7594170eSAndroid Build Coastguard WorkerContains logic for a transition that is applied to java-based rules which 17*7594170eSAndroid Build Coastguard Workertakes the sdk_version and java_version attributes and populates build settings 18*7594170eSAndroid Build Coastguard Workerbased on their values. 19*7594170eSAndroid Build Coastguard Worker""" 20*7594170eSAndroid Build Coastguard Worker 21*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api") 22*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:sdk_version.bzl", "sdk_version") 23*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:versions.bzl", "java_versions") 24*7594170eSAndroid Build Coastguard Worker 25*7594170eSAndroid Build Coastguard Worker_DEFAULT_API_DOMAIN = "system" # i.e. the platform variant 26*7594170eSAndroid Build Coastguard Worker 27*7594170eSAndroid Build Coastguard Workerdef _validate_attrs(attr): 28*7594170eSAndroid Build Coastguard Worker if hasattr(attr, "sdk_version") and hasattr(attr, "_sdk_version"): 29*7594170eSAndroid Build Coastguard Worker fail("don't have both _sdk_version and sdk_version in attrs, it's confusing.") 30*7594170eSAndroid Build Coastguard Worker if not hasattr(attr, "sdk_version") and not hasattr(attr, "_sdk_version"): 31*7594170eSAndroid Build Coastguard Worker fail("must have one of _sdk_version or sdk_version attr.") 32*7594170eSAndroid Build Coastguard Worker 33*7594170eSAndroid Build Coastguard Workerdef _sdk_transition_impl(settings, attr): 34*7594170eSAndroid Build Coastguard Worker _validate_attrs(attr) 35*7594170eSAndroid Build Coastguard Worker sdk_version_attr = ( 36*7594170eSAndroid Build Coastguard Worker attr.sdk_version if hasattr(attr, "sdk_version") else attr._sdk_version 37*7594170eSAndroid Build Coastguard Worker ) 38*7594170eSAndroid Build Coastguard Worker java_version = attr.java_version if hasattr(attr, "java_version") else None 39*7594170eSAndroid Build Coastguard Worker host_platform = settings["//command_line_option:host_platform"] 40*7594170eSAndroid Build Coastguard Worker default_java_version = str(java_versions.get_version()) 41*7594170eSAndroid Build Coastguard Worker 42*7594170eSAndroid Build Coastguard Worker # TODO: this condition should really be "platform is not a device". 43*7594170eSAndroid Build Coastguard Worker # More details on why we're treating java version for non-device platforms differently at the 44*7594170eSAndroid Build Coastguard Worker # definition of the //build/bazel/rules/java:host_version build setting. 45*7594170eSAndroid Build Coastguard Worker if all([host_platform == platform for platform in settings["//command_line_option:platforms"]]): 46*7594170eSAndroid Build Coastguard Worker return { 47*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:version": default_java_version, 48*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:host_version": str( 49*7594170eSAndroid Build Coastguard Worker java_versions.get_version(java_version), 50*7594170eSAndroid Build Coastguard Worker ), 51*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:kind": sdk_version.KIND_NONE, 52*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:api_level": api.NONE_API_LEVEL, 53*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:api_domain": _DEFAULT_API_DOMAIN, 54*7594170eSAndroid Build Coastguard Worker } 55*7594170eSAndroid Build Coastguard Worker sdk_spec = sdk_version.sdk_spec_from(sdk_version_attr) 56*7594170eSAndroid Build Coastguard Worker final_java_version = str(java_versions.get_version( 57*7594170eSAndroid Build Coastguard Worker java_version, 58*7594170eSAndroid Build Coastguard Worker sdk_spec.api_level, 59*7594170eSAndroid Build Coastguard Worker )) 60*7594170eSAndroid Build Coastguard Worker 61*7594170eSAndroid Build Coastguard Worker ret = { 62*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:host_version": default_java_version, 63*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:version": final_java_version, 64*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:kind": sdk_spec.kind, 65*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:api_level": sdk_spec.api_level, 66*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:api_domain": _DEFAULT_API_DOMAIN, 67*7594170eSAndroid Build Coastguard Worker } 68*7594170eSAndroid Build Coastguard Worker 69*7594170eSAndroid Build Coastguard Worker # uses_sdk returns true if the app sets an sdk_version _except_ `core_platform` 70*7594170eSAndroid Build Coastguard Worker # https://cs.android.com/android/_/android/platform/build/soong/+/main:java/app.go;l=253;bpv=1;bpt=0;drc=e12c083198403ec694af6c625aed11327eb2bf7f 71*7594170eSAndroid Build Coastguard Worker uses_sdk = (sdk_spec != None) and (sdk_spec.kind != sdk_version.KIND_CORE_PLATFORM) 72*7594170eSAndroid Build Coastguard Worker 73*7594170eSAndroid Build Coastguard Worker if uses_sdk: 74*7594170eSAndroid Build Coastguard Worker # If the app is using an SDK, build it in the "unbundled_app" api domain build setting 75*7594170eSAndroid Build Coastguard Worker # This ensures that its jni deps are building against the NDK 76*7594170eSAndroid Build Coastguard Worker # TODO - b/299360988 - Handle jni_uses_sdk_apis, jni_uses_platform_apis 77*7594170eSAndroid Build Coastguard Worker ret["//build/bazel/rules/apex:api_domain"] = "unbundled_app" 78*7594170eSAndroid Build Coastguard Worker 79*7594170eSAndroid Build Coastguard Worker return ret 80*7594170eSAndroid Build Coastguard Worker 81*7594170eSAndroid Build Coastguard Workersdk_transition = transition( 82*7594170eSAndroid Build Coastguard Worker implementation = _sdk_transition_impl, 83*7594170eSAndroid Build Coastguard Worker inputs = [ 84*7594170eSAndroid Build Coastguard Worker "//command_line_option:host_platform", 85*7594170eSAndroid Build Coastguard Worker "//command_line_option:platforms", 86*7594170eSAndroid Build Coastguard Worker ], 87*7594170eSAndroid Build Coastguard Worker outputs = [ 88*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:version", 89*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java:host_version", 90*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:kind", 91*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/java/sdk:api_level", 92*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/apex:api_domain", 93*7594170eSAndroid Build Coastguard Worker ], 94*7594170eSAndroid Build Coastguard Worker) 95*7594170eSAndroid Build Coastguard Worker 96*7594170eSAndroid Build Coastguard Workersdk_transition_attrs = { 97*7594170eSAndroid Build Coastguard Worker # This attribute must have a specific name to let the DexArchiveAspect propagate 98*7594170eSAndroid Build Coastguard Worker # through it. 99*7594170eSAndroid Build Coastguard Worker "exports": attr.label( 100*7594170eSAndroid Build Coastguard Worker cfg = sdk_transition, 101*7594170eSAndroid Build Coastguard Worker ), 102*7594170eSAndroid Build Coastguard Worker "java_version": attr.string(), 103*7594170eSAndroid Build Coastguard Worker "sdk_version": attr.string(), 104*7594170eSAndroid Build Coastguard Worker "_allowlist_function_transition": attr.label( 105*7594170eSAndroid Build Coastguard Worker default = "@bazel_tools//tools/allowlists/function_transition_allowlist", 106*7594170eSAndroid Build Coastguard Worker ), 107*7594170eSAndroid Build Coastguard Worker} 108