xref: /aosp_15_r20/build/bazel/rules/java/sdk/BUILD.bazel (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1# Copyright (C) 2023 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15package(
16    default_visibility = ["//visibility:public"],
17)
18
19load("@bazel_skylib//rules:common_settings.bzl", "int_setting", "string_setting")
20load("//build/bazel/rules/common:sdk_version.bzl", "sdk_version")
21load("//build/bazel/rules/common:api.bzl", "api")
22load("//build/bazel/rules/java:versions.bzl", "java_versions")
23load(":config_setting_names.bzl", "config_setting_names")
24load("@bazel_skylib//lib:selects.bzl", "selects")
25load("//prebuilts/sdk:utils.bzl", "prebuilt_sdk_utils")
26
27string_setting(
28    name = "kind",
29    build_setting_default = sdk_version.KIND_PUBLIC,
30    values = sdk_version.ALL_KINDS,
31)
32
33int_setting(
34    name = "api_level",
35    build_setting_default = api.FUTURE_API_LEVEL,
36)
37
38# The settings below are used to properly define a device java and android toolchain.
39
40# The SDK_NONE config setting maps to sdk_version = "none". In this configuration the java toolchain
41# will provide nothing on the bootclasspath, not even the standard java.* libraries.
42# The android toolchain is undefined in this configuration.
43config_setting(
44    name = config_setting_names.SDK_NONE,
45    flag_values = {
46        "//build/bazel/rules/java/sdk:kind": sdk_version.KIND_NONE,
47    },
48)
49
50# Pre and Post Java 9 configs differ in how the bootclasspath is constructed and what arguments must
51# be passed to javac. Pre Java 9, the SDK is passed as a whole to the --bootclasspath argument of
52# javac. Post Java 9, the SDK is split between core libraries, passed using system modules and the
53# --system javac argument, and the rest, added at the beginning of the classpath.
54selects.config_setting_group(
55    name = config_setting_names.PRE_JAVA_9,
56    match_any = [
57        "//build/bazel/rules/java:" + java_versions.VERSION_TO_CONFIG_SETTING[version]
58        for version in java_versions.VERSION_TO_CONFIG_SETTING.keys()
59        if version < 9
60    ],
61)
62
63selects.config_setting_group(
64    name = config_setting_names.POST_JAVA_9,
65    match_any = [
66        "//build/bazel/rules/java:" + java_versions.VERSION_TO_CONFIG_SETTING[version]
67        for version in java_versions.VERSION_TO_CONFIG_SETTING.keys()
68        if version >= 9
69    ],
70)
71
72# Specific configuration at a given kind and api level will have the java and android toolchains
73# pointed to the proper android.jar and framework.aidl files.
74[
75    config_setting(
76        name = config_setting_names.kind_api(kind, api_level),
77        flag_values = {
78            "//build/bazel/rules/java/sdk:kind": kind,
79            "//build/bazel/rules/java/sdk:api_level": str(api_level),
80        },
81    )
82    for api_level in prebuilt_sdk_utils.API_LEVELS
83    for kind in prebuilt_sdk_utils.available_kinds_for_api_level(api_level)
84]
85
86# The bootclasspath is a function of sdk kind, api level, and whether building for pre or post java
87# 9 sources.
88[
89    selects.config_setting_group(
90        name = config_setting_names.kind_api_pre_java_9(kind, api_level),
91        match_all = [
92            config_setting_names.kind_api(kind, api_level),
93            config_setting_names.PRE_JAVA_9,
94        ],
95    )
96    for api_level in prebuilt_sdk_utils.API_LEVELS
97    for kind in prebuilt_sdk_utils.available_kinds_for_api_level(api_level)
98    if java_versions.supports_pre_java_9(api_level)
99]
100
101[
102    selects.config_setting_group(
103        name = config_setting_names.kind_api_post_java_9(kind, api_level),
104        match_all = [
105            config_setting_names.kind_api(kind, api_level),
106            config_setting_names.POST_JAVA_9,
107        ],
108    )
109    for api_level in prebuilt_sdk_utils.API_LEVELS
110    for kind in prebuilt_sdk_utils.available_kinds_for_api_level(api_level)
111    if java_versions.supports_post_java_9(api_level)
112]
113