xref: /aosp_15_r20/prebuilts/sdk/toolchains.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 Workerload("//build/bazel/rules/java:bootclasspath.bzl", "bootclasspath")
16*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:java_system_modules.bzl", "java_system_modules")
17*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:import.bzl", "java_import")
18*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:versions.bzl", "java_versions")
19*344a7f5eSAndroid Build Coastguard Workerload("//prebuilts/sdk:utils.bzl", "prebuilt_sdk_utils")
20*344a7f5eSAndroid Build Coastguard Workerload("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "DEFAULT_JAVACOPTS", "default_java_toolchain")
21*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:api.bzl", "api")
22*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
23*344a7f5eSAndroid Build Coastguard Workerload("@soong_injection//java_toolchain:constants.bzl", "constants")
24*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/java/sdk:config_setting_names.bzl", sdk_config_setting = "config_setting_names")
25*344a7f5eSAndroid Build Coastguard Workerload("//build/bazel/rules/java/errorprone:errorprone.bzl", "errorprone_global_flags")
26*344a7f5eSAndroid Build Coastguard Worker
27*344a7f5eSAndroid Build Coastguard Worker# //prebuilts/sdk/current is a package, but the numbered directories under //prebuilts/sdk/ are not.
28*344a7f5eSAndroid Build Coastguard Workerdef _prebuilt_path_prefix(kind, api_level):
29*344a7f5eSAndroid Build Coastguard Worker    common_prefix = "//prebuilts/sdk"
30*344a7f5eSAndroid Build Coastguard Worker    if api_level == api.FUTURE_API_LEVEL:
31*344a7f5eSAndroid Build Coastguard Worker        return "%s/current:%s" % (common_prefix, prebuilt_sdk_utils.to_kind_dir(kind))
32*344a7f5eSAndroid Build Coastguard Worker    return "%s:%s/%s" % (common_prefix, api_level, prebuilt_sdk_utils.to_kind_dir(kind))
33*344a7f5eSAndroid Build Coastguard Worker
34*344a7f5eSAndroid Build Coastguard Workerdef _core_system_module_name(kind, api_level):
35*344a7f5eSAndroid Build Coastguard Worker    return "%s_%s_core_system_module" % (kind, api_level)
36*344a7f5eSAndroid Build Coastguard Worker
37*344a7f5eSAndroid Build Coastguard Workerdef _android_jar_import_name(kind, api_level):
38*344a7f5eSAndroid Build Coastguard Worker    return "%s_%s_android_jar" % (kind, api_level)
39*344a7f5eSAndroid Build Coastguard Worker
40*344a7f5eSAndroid Build Coastguard Workerdef _android_jar_file_name(kind, api_level):
41*344a7f5eSAndroid Build Coastguard Worker    return "%s/android.jar" % _prebuilt_path_prefix(kind, api_level)
42*344a7f5eSAndroid Build Coastguard Worker
43*344a7f5eSAndroid Build Coastguard Worker_SDK_PACKAGE_PREFIX = "//build/bazel/rules/java/sdk:"
44*344a7f5eSAndroid Build Coastguard Worker_JAVA_PACKAGE_PREFIX = "//build/bazel/rules/java:"
45*344a7f5eSAndroid Build Coastguard Worker
46*344a7f5eSAndroid Build Coastguard Workerdef prebuilts_toolchain(java_toolchain_name, android_sdk_toolchain_name):
47*344a7f5eSAndroid Build Coastguard Worker    """Creates a device java and android toolchain and their dependencies.
48*344a7f5eSAndroid Build Coastguard Worker
49*344a7f5eSAndroid Build Coastguard Worker    Defines all java_import, java_system_modules, and bootclasspath targets that enable building
50*344a7f5eSAndroid Build Coastguard Worker    java/android/kotlin targets against a prebuilt SDK. Defines config settings at the proper
51*344a7f5eSAndroid Build Coastguard Worker    granularity (based on java version and sdk version), and the mappings between config setting and
52*344a7f5eSAndroid Build Coastguard Worker    proper toolchain attributes.
53*344a7f5eSAndroid Build Coastguard Worker    """
54*344a7f5eSAndroid Build Coastguard Worker    java_version_select_dict = {
55*344a7f5eSAndroid Build Coastguard Worker        _JAVA_PACKAGE_PREFIX + setting: str(version)
56*344a7f5eSAndroid Build Coastguard Worker        for version, setting in java_versions.VERSION_TO_CONFIG_SETTING.items()
57*344a7f5eSAndroid Build Coastguard Worker    }
58*344a7f5eSAndroid Build Coastguard Worker
59*344a7f5eSAndroid Build Coastguard Worker    bootclasspath_select_dict = {
60*344a7f5eSAndroid Build Coastguard Worker        _SDK_PACKAGE_PREFIX + sdk_config_setting.SDK_NONE: [],
61*344a7f5eSAndroid Build Coastguard Worker    }
62*344a7f5eSAndroid Build Coastguard Worker
63*344a7f5eSAndroid Build Coastguard Worker    # android_jar_select_dict and framework_aidl_select_dict are only used by the android
64*344a7f5eSAndroid Build Coastguard Worker    # toolchain. We should never be in a situation where sdk_version = "none" and we're trying to
65*344a7f5eSAndroid Build Coastguard Worker    # build an android_* target, but:
66*344a7f5eSAndroid Build Coastguard Worker    #    1. a Bazel check enforces that every toolchain attribute resolves under every
67*344a7f5eSAndroid Build Coastguard Worker    #       configuration, and
68*344a7f5eSAndroid Build Coastguard Worker    #    2. the DexArchiveAspect can propagate to java_host_for_device dependencies, and
69*344a7f5eSAndroid Build Coastguard Worker    #       tries to access an android.jar from there (b/278596841).
70*344a7f5eSAndroid Build Coastguard Worker    # We should map "none" to an explicitly failing target to address 1, but until 2 is resolved,
71*344a7f5eSAndroid Build Coastguard Worker    # we point to the public current artifacts.
72*344a7f5eSAndroid Build Coastguard Worker    android_jar_select_dict = {
73*344a7f5eSAndroid Build Coastguard Worker        _SDK_PACKAGE_PREFIX + sdk_config_setting.SDK_NONE: _android_jar_file_name(
74*344a7f5eSAndroid Build Coastguard Worker            sdk_version.KIND_PUBLIC,
75*344a7f5eSAndroid Build Coastguard Worker            api.FUTURE_API_LEVEL,
76*344a7f5eSAndroid Build Coastguard Worker        ),  # ":failed_android.jar",
77*344a7f5eSAndroid Build Coastguard Worker    }
78*344a7f5eSAndroid Build Coastguard Worker    framework_aidl_select_dict = {
79*344a7f5eSAndroid Build Coastguard Worker        _SDK_PACKAGE_PREFIX + sdk_config_setting.SDK_NONE: "%s/framework.aidl" % (
80*344a7f5eSAndroid Build Coastguard Worker            _prebuilt_path_prefix(
81*344a7f5eSAndroid Build Coastguard Worker                prebuilt_sdk_utils.to_aidl_kind(sdk_version.KIND_PUBLIC, api.FUTURE_API_LEVEL),
82*344a7f5eSAndroid Build Coastguard Worker                api.FUTURE_API_LEVEL,
83*344a7f5eSAndroid Build Coastguard Worker            )
84*344a7f5eSAndroid Build Coastguard Worker        ),  # ":failed_framework.aidl",
85*344a7f5eSAndroid Build Coastguard Worker    }
86*344a7f5eSAndroid Build Coastguard Worker
87*344a7f5eSAndroid Build Coastguard Worker    for api_level in prebuilt_sdk_utils.API_LEVELS:
88*344a7f5eSAndroid Build Coastguard Worker        for kind in prebuilt_sdk_utils.available_core_kinds_for_api_level(api_level):
89*344a7f5eSAndroid Build Coastguard Worker            java_import(
90*344a7f5eSAndroid Build Coastguard Worker                name = "%s_%s_core_jar" % (kind, api_level),
91*344a7f5eSAndroid Build Coastguard Worker                jars = ["%s/core-for-system-modules.jar" % _prebuilt_path_prefix(kind, api_level)],
92*344a7f5eSAndroid Build Coastguard Worker            )
93*344a7f5eSAndroid Build Coastguard Worker            java_system_modules(
94*344a7f5eSAndroid Build Coastguard Worker                name = _core_system_module_name(kind, api_level),
95*344a7f5eSAndroid Build Coastguard Worker                deps = [":%s_%s_core_jar" % (kind, api_level)],
96*344a7f5eSAndroid Build Coastguard Worker            )
97*344a7f5eSAndroid Build Coastguard Worker        for kind in prebuilt_sdk_utils.available_kinds_for_api_level(api_level):
98*344a7f5eSAndroid Build Coastguard Worker            java_import(
99*344a7f5eSAndroid Build Coastguard Worker                name = _android_jar_import_name(kind, api_level),
100*344a7f5eSAndroid Build Coastguard Worker                jars = [_android_jar_file_name(kind, api_level)],
101*344a7f5eSAndroid Build Coastguard Worker            )
102*344a7f5eSAndroid Build Coastguard Worker            config_setting = _SDK_PACKAGE_PREFIX + sdk_config_setting.kind_api(kind, api_level)
103*344a7f5eSAndroid Build Coastguard Worker            android_jar_select_dict[config_setting] = _android_jar_file_name(
104*344a7f5eSAndroid Build Coastguard Worker                kind,
105*344a7f5eSAndroid Build Coastguard Worker                api_level,
106*344a7f5eSAndroid Build Coastguard Worker            )
107*344a7f5eSAndroid Build Coastguard Worker
108*344a7f5eSAndroid Build Coastguard Worker            framework_aidl_select_dict[config_setting] = "%s/framework.aidl" % (
109*344a7f5eSAndroid Build Coastguard Worker                _prebuilt_path_prefix(
110*344a7f5eSAndroid Build Coastguard Worker                    prebuilt_sdk_utils.to_aidl_kind(kind, api_level),
111*344a7f5eSAndroid Build Coastguard Worker                    api_level,
112*344a7f5eSAndroid Build Coastguard Worker                )
113*344a7f5eSAndroid Build Coastguard Worker            )
114*344a7f5eSAndroid Build Coastguard Worker
115*344a7f5eSAndroid Build Coastguard Worker            if java_versions.supports_pre_java_9(api_level):
116*344a7f5eSAndroid Build Coastguard Worker                config_setting = _SDK_PACKAGE_PREFIX + sdk_config_setting.kind_api_pre_java_9(kind, api_level)
117*344a7f5eSAndroid Build Coastguard Worker                bootclasspath_select_dict[config_setting] = [_gen_bootclasspath(
118*344a7f5eSAndroid Build Coastguard Worker                    pre_java_9 = True,
119*344a7f5eSAndroid Build Coastguard Worker                    kind = kind,
120*344a7f5eSAndroid Build Coastguard Worker                    api_level = api_level,
121*344a7f5eSAndroid Build Coastguard Worker                )]
122*344a7f5eSAndroid Build Coastguard Worker            if java_versions.supports_post_java_9(api_level):
123*344a7f5eSAndroid Build Coastguard Worker                config_setting = _SDK_PACKAGE_PREFIX + sdk_config_setting.kind_api_post_java_9(kind, api_level)
124*344a7f5eSAndroid Build Coastguard Worker                bootclasspath_select_dict[config_setting] = [_gen_bootclasspath(
125*344a7f5eSAndroid Build Coastguard Worker                    pre_java_9 = False,
126*344a7f5eSAndroid Build Coastguard Worker                    kind = kind,
127*344a7f5eSAndroid Build Coastguard Worker                    api_level = api_level,
128*344a7f5eSAndroid Build Coastguard Worker                )]
129*344a7f5eSAndroid Build Coastguard Worker
130*344a7f5eSAndroid Build Coastguard Worker    default_java_toolchain(
131*344a7f5eSAndroid Build Coastguard Worker        name = java_toolchain_name,
132*344a7f5eSAndroid Build Coastguard Worker        bootclasspath = select(bootclasspath_select_dict),
133*344a7f5eSAndroid Build Coastguard Worker        source_version = select(java_version_select_dict),
134*344a7f5eSAndroid Build Coastguard Worker        target_version = select(java_version_select_dict),
135*344a7f5eSAndroid Build Coastguard Worker        # TODO(b/218720643): Support switching between multiple JDKs.
136*344a7f5eSAndroid Build Coastguard Worker        java_runtime = "//prebuilts/jdk/jdk21:jdk21_runtime",
137*344a7f5eSAndroid Build Coastguard Worker        toolchain_definition = False,
138*344a7f5eSAndroid Build Coastguard Worker        misc = errorprone_global_flags + DEFAULT_JAVACOPTS + constants.CommonJdkFlags + select({
139*344a7f5eSAndroid Build Coastguard Worker            _SDK_PACKAGE_PREFIX + sdk_config_setting.SDK_NONE: ["--system=none"],
140*344a7f5eSAndroid Build Coastguard Worker            "//conditions:default": [],
141*344a7f5eSAndroid Build Coastguard Worker        }),
142*344a7f5eSAndroid Build Coastguard Worker    )
143*344a7f5eSAndroid Build Coastguard Worker
144*344a7f5eSAndroid Build Coastguard Worker    native.android_sdk(
145*344a7f5eSAndroid Build Coastguard Worker        name = android_sdk_toolchain_name,
146*344a7f5eSAndroid Build Coastguard Worker        aapt = "//prebuilts/sdk/tools:linux/bin/aapt",
147*344a7f5eSAndroid Build Coastguard Worker        aapt2 = "//prebuilts/sdk/tools:linux/bin/aapt2",
148*344a7f5eSAndroid Build Coastguard Worker        adb = ":fail",  # TODO: use system/core/adb ?
149*344a7f5eSAndroid Build Coastguard Worker        aidl = "//prebuilts/sdk/tools:linux/bin/aidl",
150*344a7f5eSAndroid Build Coastguard Worker        android_jar = select(android_jar_select_dict),
151*344a7f5eSAndroid Build Coastguard Worker        apksigner = ":apksigner",
152*344a7f5eSAndroid Build Coastguard Worker        dx = "//prebuilts/sdk/tools:dx",  # TODO: add D8
153*344a7f5eSAndroid Build Coastguard Worker        framework_aidl = select(framework_aidl_select_dict),
154*344a7f5eSAndroid Build Coastguard Worker        main_dex_classes = "//prebuilts/sdk/tools:mainDexClasses.rules",
155*344a7f5eSAndroid Build Coastguard Worker        main_dex_list_creator = ":fail",
156*344a7f5eSAndroid Build Coastguard Worker        proguard = ":fail",  # TODO: add R8
157*344a7f5eSAndroid Build Coastguard Worker        system = select({
158*344a7f5eSAndroid Build Coastguard Worker            key: bootclasspath_select_dict[key][0]
159*344a7f5eSAndroid Build Coastguard Worker            for key in bootclasspath_select_dict.keys()
160*344a7f5eSAndroid Build Coastguard Worker            if "none" not in key
161*344a7f5eSAndroid Build Coastguard Worker        } | {"//conditions:default": ":failed_bootclasspath"}),
162*344a7f5eSAndroid Build Coastguard Worker        shrinked_android_jar = select(android_jar_select_dict),
163*344a7f5eSAndroid Build Coastguard Worker        visibility = ["//visibility:public"],
164*344a7f5eSAndroid Build Coastguard Worker        zipalign = "//prebuilts/sdk/tools:linux/bin/zipalign",
165*344a7f5eSAndroid Build Coastguard Worker    )
166*344a7f5eSAndroid Build Coastguard Worker
167*344a7f5eSAndroid Build Coastguard Workerdef _gen_bootclasspath(pre_java_9, kind, api_level):
168*344a7f5eSAndroid Build Coastguard Worker    bootclasspath_name = "toolchain_%s_java_9_android_%s_%s_bootclasspath" % ("pre" if pre_java_9 else "post", kind, api_level)
169*344a7f5eSAndroid Build Coastguard Worker    auxiliary = [_android_jar_import_name(kind, api_level)]
170*344a7f5eSAndroid Build Coastguard Worker    bootclasspath_attr = [_android_jar_import_name(kind, api_level), ":core_lambda_stubs"]
171*344a7f5eSAndroid Build Coastguard Worker    system = None
172*344a7f5eSAndroid Build Coastguard Worker    if pre_java_9:
173*344a7f5eSAndroid Build Coastguard Worker        auxiliary = auxiliary + [":core_lambda_stubs"]
174*344a7f5eSAndroid Build Coastguard Worker    else:
175*344a7f5eSAndroid Build Coastguard Worker        system = _core_system_module_name(prebuilt_sdk_utils.to_core_kind(kind, api_level), api_level)
176*344a7f5eSAndroid Build Coastguard Worker
177*344a7f5eSAndroid Build Coastguard Worker    bootclasspath(
178*344a7f5eSAndroid Build Coastguard Worker        name = bootclasspath_name,
179*344a7f5eSAndroid Build Coastguard Worker        auxiliary = auxiliary,
180*344a7f5eSAndroid Build Coastguard Worker        bootclasspath = bootclasspath_attr,
181*344a7f5eSAndroid Build Coastguard Worker        system = system,
182*344a7f5eSAndroid Build Coastguard Worker    )
183*344a7f5eSAndroid Build Coastguard Worker    return bootclasspath_name
184