xref: /aosp_15_r20/build/bazel/rules/java/java_aidl_library.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/aidl:aidl_library.bzl", "AidlGenInfo", "aidl_file_utils")
16*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/java:sdk_transition.bzl", "sdk_transition")
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard WorkerJavaAidlAspectInfo = provider("JavaAidlAspectInfo", fields = ["jars"])
19*7594170eSAndroid Build Coastguard Worker
20*7594170eSAndroid Build Coastguard Workerdef _java_aidl_gen_aspect_impl(target, ctx):
21*7594170eSAndroid Build Coastguard Worker    aidl_gen_java_files = aidl_file_utils.generate_aidl_bindings(ctx, "java", target[AidlGenInfo])
22*7594170eSAndroid Build Coastguard Worker    java_deps = [
23*7594170eSAndroid Build Coastguard Worker        d[JavaInfo]
24*7594170eSAndroid Build Coastguard Worker        for d in ctx.rule.attr.deps
25*7594170eSAndroid Build Coastguard Worker    ]
26*7594170eSAndroid Build Coastguard Worker    out_jar = ctx.actions.declare_file(target.label.name + "-aidl-gen.jar")
27*7594170eSAndroid Build Coastguard Worker    java_info = java_common.compile(
28*7594170eSAndroid Build Coastguard Worker        ctx,
29*7594170eSAndroid Build Coastguard Worker        source_files = aidl_gen_java_files,
30*7594170eSAndroid Build Coastguard Worker        deps = java_deps,
31*7594170eSAndroid Build Coastguard Worker        output = out_jar,
32*7594170eSAndroid Build Coastguard Worker        java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
33*7594170eSAndroid Build Coastguard Worker    )
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Worker    return [
36*7594170eSAndroid Build Coastguard Worker        java_info,
37*7594170eSAndroid Build Coastguard Worker        JavaAidlAspectInfo(
38*7594170eSAndroid Build Coastguard Worker            jars = depset([out_jar]),
39*7594170eSAndroid Build Coastguard Worker        ),
40*7594170eSAndroid Build Coastguard Worker    ]
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Worker_java_aidl_gen_aspect = aspect(
43*7594170eSAndroid Build Coastguard Worker    implementation = _java_aidl_gen_aspect_impl,
44*7594170eSAndroid Build Coastguard Worker    attr_aspects = ["deps"],
45*7594170eSAndroid Build Coastguard Worker    attrs = {
46*7594170eSAndroid Build Coastguard Worker        "_aidl_tool": attr.label(
47*7594170eSAndroid Build Coastguard Worker            allow_files = True,
48*7594170eSAndroid Build Coastguard Worker            executable = True,
49*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
50*7594170eSAndroid Build Coastguard Worker            default = Label("//system/tools/aidl"),
51*7594170eSAndroid Build Coastguard Worker        ),
52*7594170eSAndroid Build Coastguard Worker    },
53*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
54*7594170eSAndroid Build Coastguard Worker    fragments = ["java"],
55*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo, JavaAidlAspectInfo],
56*7594170eSAndroid Build Coastguard Worker)
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Workerdef _java_aidl_library_rule_impl(ctx):
59*7594170eSAndroid Build Coastguard Worker    java_info = java_common.merge([d[JavaInfo] for d in ctx.attr.deps])
60*7594170eSAndroid Build Coastguard Worker    runtime_jars = depset(transitive = [dep[JavaAidlAspectInfo].jars for dep in ctx.attr.deps])
61*7594170eSAndroid Build Coastguard Worker    transitive_runtime_jars = depset(transitive = [java_info.transitive_runtime_jars])
62*7594170eSAndroid Build Coastguard Worker
63*7594170eSAndroid Build Coastguard Worker    return [
64*7594170eSAndroid Build Coastguard Worker        java_info,
65*7594170eSAndroid Build Coastguard Worker        DefaultInfo(
66*7594170eSAndroid Build Coastguard Worker            files = runtime_jars,
67*7594170eSAndroid Build Coastguard Worker            runfiles = ctx.runfiles(transitive_files = transitive_runtime_jars),
68*7594170eSAndroid Build Coastguard Worker        ),
69*7594170eSAndroid Build Coastguard Worker        OutputGroupInfo(default = depset()),
70*7594170eSAndroid Build Coastguard Worker    ]
71*7594170eSAndroid Build Coastguard Worker
72*7594170eSAndroid Build Coastguard Workerjava_aidl_library = rule(
73*7594170eSAndroid Build Coastguard Worker    implementation = _java_aidl_library_rule_impl,
74*7594170eSAndroid Build Coastguard Worker    attrs = {
75*7594170eSAndroid Build Coastguard Worker        # This attribute's name lets the DexArchiveAspect propagate
76*7594170eSAndroid Build Coastguard Worker        # through it. It should be changed carefully.
77*7594170eSAndroid Build Coastguard Worker        "deps": attr.label_list(
78*7594170eSAndroid Build Coastguard Worker            providers = [AidlGenInfo],
79*7594170eSAndroid Build Coastguard Worker            aspects = [_java_aidl_gen_aspect],
80*7594170eSAndroid Build Coastguard Worker            cfg = sdk_transition,
81*7594170eSAndroid Build Coastguard Worker        ),
82*7594170eSAndroid Build Coastguard Worker        "java_version": attr.string(),
83*7594170eSAndroid Build Coastguard Worker        "sdk_version": attr.string(
84*7594170eSAndroid Build Coastguard Worker            default = "system_current",
85*7594170eSAndroid Build Coastguard Worker        ),
86*7594170eSAndroid Build Coastguard Worker        "_allowlist_function_transition": attr.label(
87*7594170eSAndroid Build Coastguard Worker            default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
88*7594170eSAndroid Build Coastguard Worker        ),
89*7594170eSAndroid Build Coastguard Worker    },
90*7594170eSAndroid Build Coastguard Worker    provides = [JavaInfo],
91*7594170eSAndroid Build Coastguard Worker)
92