blob: 7724cdca615cc8e5b53b02cb9017a96d1c8b439e [file]
"""
Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
"""Bazel rules for exporting API contributions of Java libraries"""
"""A Bazel provider that encapsulates the contributions of a Java library to an API surface"""
JavaApiContributionInfo = provider(
fields = {
"name": "Name of the contribution target",
"api": "Path of partial current.txt file describing the stable APIs of the library. Path is relative to workspace root",
"api_surfaces": "List of API surfaces that this partial api file contributes to",
},
)
_PUBLIC_API = "publicapi"
_SYSTEM_API = "systemapi"
_TEST_API = "testapi"
_MODULE_LIB_API = "module-libapi"
_SYSTEM_SERVER_API = "system-serverapi"
_INTRA_CORE_API = "intracoreapi"
_CORE_PLATFORM_API = "core_platformapi"
# _TOOLCHAIN_API is a special API surface provided by ART to compile other API domains
# (e.g. core-lambda-stubs required to compile java files containing lambdas)
# This is not part of go/android-api-types, and is not available to apps at runtime
_TOOLCHAIN_API = "toolchainapi"
# Java API surfaces are hierarchical.
# This hierarchy map was created by looking at the stub definitions in frameworks/base/StubLibraries.bp
# Key is the full api surface
# Values are the partial metalava signature files that are combined to generate the full api surface stubs.
_JAVA_FULLAPISURFACE_TO_PARTIALSIGNATUREFILE = {
_PUBLIC_API: [_PUBLIC_API],
_SYSTEM_API: [_PUBLIC_API, _SYSTEM_API],
_TEST_API: [_PUBLIC_API, _SYSTEM_API, _TEST_API],
_MODULE_LIB_API: [_PUBLIC_API, _SYSTEM_API, _MODULE_LIB_API],
_SYSTEM_SERVER_API: [_PUBLIC_API, _SYSTEM_API, _MODULE_LIB_API, _SYSTEM_SERVER_API],
# intracore is publicapi + "@IntraCoreApi".
# e.g. art.module.intra.core.api uses the following `droiddoc_option`
# [<hide>, --show-single-annotation libcore.api.IntraCoreApi"]
# conscrypt and icu4j use similar droidoc_options
_INTRA_CORE_API: [_PUBLIC_API, _INTRA_CORE_API],
# CorePlatformApi does not extend PublicApi
# Each core module is at different stages of transition
# The status quo in Soong today is
# 1. conscrypt - Still provides CorePlatformApis
# 2. i18n - APIs have migrated to Public API surface
# 3. art - APIs have migrated to ModuleLib API suface
# This layering complexity will be handled by the build orchestrator and not by API export.
_CORE_PLATFORM_API: [_CORE_PLATFORM_API],
# coreapi does not have an entry here, it really is the public stubs of the 3 core modules
# (art, conscrypt, i18n)
_TOOLCHAIN_API: [_TOOLCHAIN_API],
}
VALID_JAVA_API_SURFACES = _JAVA_FULLAPISURFACE_TO_PARTIALSIGNATUREFILE.keys()
def _java_api_contribution_impl(ctx):
"""Implemenation for the java_api_contribution rule
This rule does not have any build actions, but returns a `JavaApiContributionInfo` provider object"""
full_api_surfaces = []
# The checked-in signature files are parital signatures. e.g. SystemAPI surface
# (android_system_stubs_current.jar) contains the classes
# and methods present in current.txt and system-current.txt.
# The jar representing the full api surface is created by combining these partial signature files.
for full_api_surface, partials in _JAVA_FULLAPISURFACE_TO_PARTIALSIGNATUREFILE.items():
if ctx.attr.api_surface in partials:
full_api_surfaces.append(full_api_surface)
return [
JavaApiContributionInfo(
name = ctx.label.name,
api = ctx.file.api.path,
api_surfaces = full_api_surfaces,
),
]
java_api_contribution = rule(
implementation = _java_api_contribution_impl,
attrs = {
"api": attr.label(
mandatory = True,
allow_single_file = [".txt"],
doc = "The partial signature file describing the APIs of this module",
),
# TODO: Better name for this
"api_surface": attr.string(
doc = "The partial api surface signature represented by this file. See _JAVA_FULLAPISURFACE_TO_PARTIALSIGNATUREFILE in java_api_contribution.bzl for relationship between partial signature files and full API surfaces",
default = "publicapi",
values = VALID_JAVA_API_SURFACES,
),
},
)