xref: /aosp_15_r20/build/bazel/rules/java/BUILD (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker"""
2*7594170eSAndroid Build Coastguard WorkerCopyright (C) 2023 The Android Open Source Project
3*7594170eSAndroid Build Coastguard Worker
4*7594170eSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License");
5*7594170eSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License.
6*7594170eSAndroid Build Coastguard WorkerYou may obtain a copy of the License at
7*7594170eSAndroid Build Coastguard Worker
8*7594170eSAndroid Build Coastguard Worker    http://www.apache.org/licenses/LICENSE-2.0
9*7594170eSAndroid Build Coastguard Worker
10*7594170eSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software
11*7594170eSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS,
12*7594170eSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7594170eSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and
14*7594170eSAndroid Build Coastguard Workerlimitations under the License.
15*7594170eSAndroid Build Coastguard Worker"""
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//rules:common_settings.bzl", "string_setting")
18*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "DEFAULT_JAVACOPTS", "default_java_toolchain")
19*7594170eSAndroid Build Coastguard Workerload("@soong_injection//java_toolchain:constants.bzl", "constants")
20*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java/errorprone:errorprone.bzl", "errorprone_global_flags")
21*7594170eSAndroid Build Coastguard Workerload(":bootclasspath.bzl", "bootclasspath")
22*7594170eSAndroid Build Coastguard Workerload(":bootclasspath_test.bzl", "bootclasspath_test_suite")
23*7594170eSAndroid Build Coastguard Workerload(":host_for_device_test.bzl", "host_for_device_test_suite")
24*7594170eSAndroid Build Coastguard Workerload(":java_aconfig_library_test.bzl", "java_aconfig_library_rt_test_suite", "java_aconfig_library_test_suite")
25*7594170eSAndroid Build Coastguard Workerload(":java_resources_test.bzl", "java_resources_test_suite")
26*7594170eSAndroid Build Coastguard Workerload(":java_sysprop_library_test.bzl", "java_sysprop_library_test_suite")
27*7594170eSAndroid Build Coastguard Workerload(":java_system_modules_test.bzl", "java_system_modules_test_suite")
28*7594170eSAndroid Build Coastguard Workerload(":java_xsd_config_library_test.bzl", "java_xsd_config_library_test_suite")
29*7594170eSAndroid Build Coastguard Workerload(":library_test.bzl", "java_library_test_suite")
30*7594170eSAndroid Build Coastguard Workerload(":merged_txts_test.bzl", "merged_txts_test_suite")
31*7594170eSAndroid Build Coastguard Workerload(":platform_compat_config_test.bzl", "platform_compat_config_test_suite")
32*7594170eSAndroid Build Coastguard Workerload(":sdk_library_test.bzl", "java_sdk_library_test_suite")
33*7594170eSAndroid Build Coastguard Workerload(":sdk_transition_test.bzl", "sdk_transition_test_suite")
34*7594170eSAndroid Build Coastguard Workerload(":versions.bzl", "java_versions")
35*7594170eSAndroid Build Coastguard Workerload(":versions_test.bzl", "versions_test_suite")
36*7594170eSAndroid Build Coastguard Worker
37*7594170eSAndroid Build Coastguard Workerpackage(
38*7594170eSAndroid Build Coastguard Worker    default_visibility = ["//visibility:public"],
39*7594170eSAndroid Build Coastguard Worker)
40*7594170eSAndroid Build Coastguard Worker
41*7594170eSAndroid Build Coastguard Workerjava_sdk_library_test_suite(name = "java_sdk_library_tests")
42*7594170eSAndroid Build Coastguard Worker
43*7594170eSAndroid Build Coastguard Workermerged_txts_test_suite(name = "merged_txts_tests")
44*7594170eSAndroid Build Coastguard Worker
45*7594170eSAndroid Build Coastguard Workerjava_system_modules_test_suite(name = "java_system_modules_tests")
46*7594170eSAndroid Build Coastguard Worker
47*7594170eSAndroid Build Coastguard Workerjava_library_test_suite(name = "java_library_tests")
48*7594170eSAndroid Build Coastguard Worker
49*7594170eSAndroid Build Coastguard Workerbootclasspath_test_suite(name = "bootclasspath_tests")
50*7594170eSAndroid Build Coastguard Worker
51*7594170eSAndroid Build Coastguard Workerjava_resources_test_suite(name = "java_resources_test_suite")
52*7594170eSAndroid Build Coastguard Worker
53*7594170eSAndroid Build Coastguard Workerversions_test_suite(name = "versions_tests")
54*7594170eSAndroid Build Coastguard Worker
55*7594170eSAndroid Build Coastguard Workersdk_transition_test_suite(name = "sdk_transition_tests")
56*7594170eSAndroid Build Coastguard Worker
57*7594170eSAndroid Build Coastguard Workerhost_for_device_test_suite(name = "host_for_device_test_suite")
58*7594170eSAndroid Build Coastguard Worker
59*7594170eSAndroid Build Coastguard Workerjava_xsd_config_library_test_suite(name = "java_xsd_config_library_tests")
60*7594170eSAndroid Build Coastguard Worker
61*7594170eSAndroid Build Coastguard Workerplatform_compat_config_test_suite(name = "platform_compat_config_tests")
62*7594170eSAndroid Build Coastguard Worker
63*7594170eSAndroid Build Coastguard Workerjava_aconfig_library_test_suite(name = "java_aconfig_library_test")
64*7594170eSAndroid Build Coastguard Worker
65*7594170eSAndroid Build Coastguard Workerjava_aconfig_library_rt_test_suite(name = "java_aconfig_library_rt_test")
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Workerjava_sysprop_library_test_suite(name = "java_sysprop_library_tests")
68*7594170eSAndroid Build Coastguard Worker
69*7594170eSAndroid Build Coastguard Workerstring_setting(
70*7594170eSAndroid Build Coastguard Worker    name = "version",
71*7594170eSAndroid Build Coastguard Worker    build_setting_default = str(java_versions.get_version()),
72*7594170eSAndroid Build Coastguard Worker    values = [str(v) for v in java_versions.ALL_VERSIONS],
73*7594170eSAndroid Build Coastguard Worker)
74*7594170eSAndroid Build Coastguard Worker
75*7594170eSAndroid Build Coastguard Worker[
76*7594170eSAndroid Build Coastguard Worker    config_setting(
77*7594170eSAndroid Build Coastguard Worker        name = setting,
78*7594170eSAndroid Build Coastguard Worker        flag_values = {
79*7594170eSAndroid Build Coastguard Worker            "//build/bazel/rules/java:version": str(java_version),
80*7594170eSAndroid Build Coastguard Worker        },
81*7594170eSAndroid Build Coastguard Worker    )
82*7594170eSAndroid Build Coastguard Worker    for java_version, setting in java_versions.VERSION_TO_CONFIG_SETTING.items()
83*7594170eSAndroid Build Coastguard Worker]
84*7594170eSAndroid Build Coastguard Worker
85*7594170eSAndroid Build Coastguard Worker# There is no need for both host and device java version build settings in a
86*7594170eSAndroid Build Coastguard Worker# world where every java_*/android_*/kt_* target uses the AOSP-specific
87*7594170eSAndroid Build Coastguard Worker# wrappers. However, there are targets defined by BUILD.tools files within the
88*7594170eSAndroid Build Coastguard Worker# Bazel binary that do not use the wrapper. These would inherit their java
89*7594170eSAndroid Build Coastguard Worker# version from their reverse dependency, which can cause build failures (e.g. an
90*7594170eSAndroid Build Coastguard Worker# android_library_import with java_version=7 has a tools dependency on a
91*7594170eSAndroid Build Coastguard Worker# non-wrapped Bazel java_library that uses lambdas). By using a separate host
92*7594170eSAndroid Build Coastguard Worker# version, we can reset it to its default when in the device configuration, so
93*7594170eSAndroid Build Coastguard Worker# that a subsequent exec transition will use the default java version.
94*7594170eSAndroid Build Coastguard Workerstring_setting(
95*7594170eSAndroid Build Coastguard Worker    name = "host_version",
96*7594170eSAndroid Build Coastguard Worker    build_setting_default = str(java_versions.get_version()),
97*7594170eSAndroid Build Coastguard Worker    values = [str(v) for v in java_versions.ALL_VERSIONS],
98*7594170eSAndroid Build Coastguard Worker)
99*7594170eSAndroid Build Coastguard Worker
100*7594170eSAndroid Build Coastguard Worker[
101*7594170eSAndroid Build Coastguard Worker    config_setting(
102*7594170eSAndroid Build Coastguard Worker        name = "host_" + setting,
103*7594170eSAndroid Build Coastguard Worker        flag_values = {
104*7594170eSAndroid Build Coastguard Worker            "//build/bazel/rules/java:host_version": str(java_version),
105*7594170eSAndroid Build Coastguard Worker        },
106*7594170eSAndroid Build Coastguard Worker    )
107*7594170eSAndroid Build Coastguard Worker    for java_version, setting in java_versions.VERSION_TO_CONFIG_SETTING.items()
108*7594170eSAndroid Build Coastguard Worker]
109*7594170eSAndroid Build Coastguard Worker
110*7594170eSAndroid Build Coastguard Workerjava_version_select_dict = {
111*7594170eSAndroid Build Coastguard Worker    "host_" + setting: str(version)
112*7594170eSAndroid Build Coastguard Worker    for version, setting in java_versions.VERSION_TO_CONFIG_SETTING.items()
113*7594170eSAndroid Build Coastguard Worker} | {
114*7594170eSAndroid Build Coastguard Worker    "//conditions:default": str(java_versions.get_version()),
115*7594170eSAndroid Build Coastguard Worker}
116*7594170eSAndroid Build Coastguard Worker
117*7594170eSAndroid Build Coastguard Worker# Give host-side tools a version of OpenJDK's standard libraries
118*7594170eSAndroid Build Coastguard Worker# close to what they're targeting. As of Dec 2017, AOSP is only
119*7594170eSAndroid Build Coastguard Worker# bundling OpenJDK 8 and 9, so nothing < 8 is available.
120*7594170eSAndroid Build Coastguard Worker#
121*7594170eSAndroid Build Coastguard Worker# When building with OpenJDK 8, the following should have no
122*7594170eSAndroid Build Coastguard Worker# effect since those jars would be available by default.
123*7594170eSAndroid Build Coastguard Worker#
124*7594170eSAndroid Build Coastguard Worker# When building with OpenJDK 9 but targeting a version < 1.8,
125*7594170eSAndroid Build Coastguard Worker# putting them on the bootclasspath means that:
126*7594170eSAndroid Build Coastguard Worker# a) code can't (accidentally) refer to OpenJDK 9 specific APIs
127*7594170eSAndroid Build Coastguard Worker# b) references to existing APIs are not reinterpreted in an
128*7594170eSAndroid Build Coastguard Worker#    OpenJDK 9-specific way, eg. calls to subclasses of
129*7594170eSAndroid Build Coastguard Worker#    java.nio.Buffer as in http://b/70862583
130*7594170eSAndroid Build Coastguard Worker
131*7594170eSAndroid Build Coastguard Workerbootclasspath(
132*7594170eSAndroid Build Coastguard Worker    name = "pre_java9_bootclasspath",
133*7594170eSAndroid Build Coastguard Worker    auxiliary = ["//prebuilts/jdk/jdk8:pre_java9_bootclasspath_jars"],
134*7594170eSAndroid Build Coastguard Worker    bootclasspath = ["//prebuilts/jdk/jdk8:pre_java9_bootclasspath_jars"],
135*7594170eSAndroid Build Coastguard Worker    system = None,
136*7594170eSAndroid Build Coastguard Worker)
137*7594170eSAndroid Build Coastguard Worker
138*7594170eSAndroid Build Coastguard Workerdefault_java_toolchain(
139*7594170eSAndroid Build Coastguard Worker    name = "jdk21_host_toolchain_java",
140*7594170eSAndroid Build Coastguard Worker    bootclasspath = select({
141*7594170eSAndroid Build Coastguard Worker        "host_config_setting_java_7": [":pre_java9_bootclasspath"],
142*7594170eSAndroid Build Coastguard Worker        "host_config_setting_java_8": [":pre_java9_bootclasspath"],
143*7594170eSAndroid Build Coastguard Worker        "//conditions:default": ["@rules_java_builtin//toolchains:platformclasspath"],
144*7594170eSAndroid Build Coastguard Worker    }),
145*7594170eSAndroid Build Coastguard Worker    # TODO(b/218720643): Support switching between multiple JDKs.
146*7594170eSAndroid Build Coastguard Worker    java_runtime = "//prebuilts/jdk/jdk21:jdk21_runtime",
147*7594170eSAndroid Build Coastguard Worker    misc = errorprone_global_flags + DEFAULT_JAVACOPTS + constants.CommonJdkFlags,
148*7594170eSAndroid Build Coastguard Worker    source_version = select(java_version_select_dict),
149*7594170eSAndroid Build Coastguard Worker    target_version = select(java_version_select_dict),
150*7594170eSAndroid Build Coastguard Worker    toolchain_definition = False,
151*7594170eSAndroid Build Coastguard Worker)
152*7594170eSAndroid Build Coastguard Worker
153*7594170eSAndroid Build Coastguard Workertoolchain(
154*7594170eSAndroid Build Coastguard Worker    name = "jdk21_host_toolchain_java_definition",
155*7594170eSAndroid Build Coastguard Worker    exec_compatible_with = ["//build/bazel_common_rules/platforms/os:linux"],
156*7594170eSAndroid Build Coastguard Worker    target_compatible_with = ["//build/bazel_common_rules/platforms/os:linux"],
157*7594170eSAndroid Build Coastguard Worker    target_settings = [],
158*7594170eSAndroid Build Coastguard Worker    toolchain = ":jdk21_host_toolchain_java",
159*7594170eSAndroid Build Coastguard Worker    toolchain_type = "@bazel_tools//tools/jdk:toolchain_type",
160*7594170eSAndroid Build Coastguard Worker)
161