xref: /aosp_15_r20/build/bazel/rules/java/sdk_transition.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 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