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