xref: /aosp_15_r20/external/bazelbuild-rules_android/rules/android_library/impl.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux# Copyright 2018 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux#
3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux#
7*9e965d6fSRomain Jobredeaux#    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux#
9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux# limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux"""Implementation."""
16*9e965d6fSRomain Jobredeaux
17*9e965d6fSRomain Jobredeauxload("//rules:acls.bzl", "acls")
18*9e965d6fSRomain Jobredeauxload("//rules:attrs.bzl", _attrs = "attrs")
19*9e965d6fSRomain Jobredeauxload("//rules:common.bzl", _common = "common")
20*9e965d6fSRomain Jobredeauxload("//rules:data_binding.bzl", _data_binding = "data_binding")
21*9e965d6fSRomain Jobredeauxload("//rules:idl.bzl", _idl = "idl")
22*9e965d6fSRomain Jobredeauxload("//rules:intellij.bzl", _intellij = "intellij")
23*9e965d6fSRomain Jobredeauxload("//rules:java.bzl", _java = "java")
24*9e965d6fSRomain Jobredeauxload(
25*9e965d6fSRomain Jobredeaux    "//rules:processing_pipeline.bzl",
26*9e965d6fSRomain Jobredeaux    "ProviderInfo",
27*9e965d6fSRomain Jobredeaux    "processing_pipeline",
28*9e965d6fSRomain Jobredeaux)
29*9e965d6fSRomain Jobredeauxload("//rules:proguard.bzl", _proguard = "proguard")
30*9e965d6fSRomain Jobredeauxload("//rules:providers.bzl", "AndroidLintRulesInfo", "StarlarkApkInfo")
31*9e965d6fSRomain Jobredeauxload("//rules:resources.bzl", _resources = "resources")
32*9e965d6fSRomain Jobredeauxload("//rules:utils.bzl", "get_android_sdk", "get_android_toolchain", "log", "utils")
33*9e965d6fSRomain Jobredeauxload("//rules/flags:flags.bzl", _flags = "flags")
34*9e965d6fSRomain Jobredeaux
35*9e965d6fSRomain Jobredeaux_USES_DEPRECATED_IMPLICIT_EXPORT_ERROR = (
36*9e965d6fSRomain Jobredeaux    "Use android_library.exports to explicitly specify the exported " +
37*9e965d6fSRomain Jobredeaux    "targets of %s."
38*9e965d6fSRomain Jobredeaux)
39*9e965d6fSRomain Jobredeaux
40*9e965d6fSRomain Jobredeaux_SRCS_CONTAIN_RESOURCE_LABEL_ERROR = (
41*9e965d6fSRomain Jobredeaux    "The srcs attribute of an android_library rule should not contain label " +
42*9e965d6fSRomain Jobredeaux    "with resources %s"
43*9e965d6fSRomain Jobredeaux)
44*9e965d6fSRomain Jobredeaux
45*9e965d6fSRomain Jobredeaux_IDL_IMPORT_ROOT_SET_WITHOUT_SRCS_OR_PARCELABLES_ERROR = (
46*9e965d6fSRomain Jobredeaux    "The 'idl_import_root' attribute of the android_library rule was set, " +
47*9e965d6fSRomain Jobredeaux    "but neither 'idl_srcs' nor 'idl_parcelables' were specified."
48*9e965d6fSRomain Jobredeaux)
49*9e965d6fSRomain Jobredeaux
50*9e965d6fSRomain Jobredeaux_IDL_SRC_FROM_DIFFERENT_PACKAGE_ERROR = (
51*9e965d6fSRomain Jobredeaux    "Do not import '%s' directly. You should either move the file to this " +
52*9e965d6fSRomain Jobredeaux    "package or depend on an appropriate rule there."
53*9e965d6fSRomain Jobredeaux)
54*9e965d6fSRomain Jobredeaux
55*9e965d6fSRomain Jobredeaux_IDL_USES_AOSP_COMPILER_ERROR = (
56*9e965d6fSRomain Jobredeaux    "Use of `idl_uses_aosp_compiler` is not allowed for %s."
57*9e965d6fSRomain Jobredeaux)
58*9e965d6fSRomain Jobredeaux
59*9e965d6fSRomain Jobredeaux_IDL_IDLOPTS_UNSUPPORTERD_ERROR = (
60*9e965d6fSRomain Jobredeaux    "`idlopts` is supported only if `idl_uses_aosp_compiler` is set to true."
61*9e965d6fSRomain Jobredeaux)
62*9e965d6fSRomain Jobredeaux
63*9e965d6fSRomain Jobredeaux# Android library AAR context attributes.
64*9e965d6fSRomain Jobredeaux_PROVIDERS = "providers"
65*9e965d6fSRomain Jobredeaux_VALIDATION_OUTPUTS = "validation_outputs"
66*9e965d6fSRomain Jobredeaux
67*9e965d6fSRomain Jobredeaux_AARContextInfo = provider(
68*9e965d6fSRomain Jobredeaux    "Android library AAR context object",
69*9e965d6fSRomain Jobredeaux    fields = {
70*9e965d6fSRomain Jobredeaux        _PROVIDERS: "The list of all providers to propagate.",
71*9e965d6fSRomain Jobredeaux        _VALIDATION_OUTPUTS: "List of outputs given to OutputGroupInfo _validation group",
72*9e965d6fSRomain Jobredeaux    },
73*9e965d6fSRomain Jobredeaux)
74*9e965d6fSRomain Jobredeaux
75*9e965d6fSRomain Jobredeauxdef _has_srcs(ctx):
76*9e965d6fSRomain Jobredeaux    return ctx.files.srcs or ctx.files.idl_srcs or getattr(ctx.files, "common_srcs", False)
77*9e965d6fSRomain Jobredeaux
78*9e965d6fSRomain Jobredeauxdef _uses_deprecated_implicit_export(ctx):
79*9e965d6fSRomain Jobredeaux    return (ctx.attr.deps and not (_has_srcs(ctx) or
80*9e965d6fSRomain Jobredeaux                                   ctx.attr._defined_assets or
81*9e965d6fSRomain Jobredeaux                                   ctx.files.resource_files or
82*9e965d6fSRomain Jobredeaux                                   ctx.attr.manifest or
83*9e965d6fSRomain Jobredeaux                                   ctx.attr.baseline_profiles))
84*9e965d6fSRomain Jobredeaux
85*9e965d6fSRomain Jobredeauxdef _uses_resources_and_deps_without_srcs(ctx):
86*9e965d6fSRomain Jobredeaux    return (ctx.attr.deps and
87*9e965d6fSRomain Jobredeaux            (ctx.attr._defined_assets or ctx.files.resource_files or ctx.attr.manifest) and
88*9e965d6fSRomain Jobredeaux            not _has_srcs(ctx))
89*9e965d6fSRomain Jobredeaux
90*9e965d6fSRomain Jobredeauxdef _check_deps_without_java_srcs(ctx):
91*9e965d6fSRomain Jobredeaux    if not ctx.attr.deps or _has_srcs(ctx):
92*9e965d6fSRomain Jobredeaux        return False
93*9e965d6fSRomain Jobredeaux    gfn = getattr(ctx.attr, "generator_function", "")
94*9e965d6fSRomain Jobredeaux    if _uses_deprecated_implicit_export(ctx):
95*9e965d6fSRomain Jobredeaux        log.error(_USES_DEPRECATED_IMPLICIT_EXPORT_ERROR % ctx.label)
96*9e965d6fSRomain Jobredeaux    if _uses_resources_and_deps_without_srcs(ctx):
97*9e965d6fSRomain Jobredeaux        if (acls.in_android_library_resources_without_srcs_generator_functions(gfn) or
98*9e965d6fSRomain Jobredeaux            acls.in_android_library_resources_without_srcs(str(ctx.label))):
99*9e965d6fSRomain Jobredeaux            return True
100*9e965d6fSRomain Jobredeaux    return False
101*9e965d6fSRomain Jobredeaux
102*9e965d6fSRomain Jobredeauxdef _validate_rule_context(ctx):
103*9e965d6fSRomain Jobredeaux    # Verify that idl_import_root is specified with idl_src or idl_parcelables.
104*9e965d6fSRomain Jobredeaux    if (ctx.attr._defined_idl_import_root and
105*9e965d6fSRomain Jobredeaux        not (ctx.attr._defined_idl_srcs or ctx.attr._defined_idl_parcelables)):
106*9e965d6fSRomain Jobredeaux        log.error(_IDL_IMPORT_ROOT_SET_WITHOUT_SRCS_OR_PARCELABLES_ERROR)
107*9e965d6fSRomain Jobredeaux
108*9e965d6fSRomain Jobredeaux    # Verify that idl_srcs are not from another package.
109*9e965d6fSRomain Jobredeaux    for idl_src in ctx.attr.idl_srcs:
110*9e965d6fSRomain Jobredeaux        if ctx.label.package != idl_src.label.package:
111*9e965d6fSRomain Jobredeaux            log.error(_IDL_SRC_FROM_DIFFERENT_PACKAGE_ERROR % idl_src.label)
112*9e965d6fSRomain Jobredeaux
113*9e965d6fSRomain Jobredeaux    # Ensure that the AOSP AIDL compiler is used only in allowlisted packages
114*9e965d6fSRomain Jobredeaux    if (ctx.attr.idl_uses_aosp_compiler and
115*9e965d6fSRomain Jobredeaux        not acls.in_android_library_use_aosp_aidl_compiler_allowlist(str(ctx.label))):
116*9e965d6fSRomain Jobredeaux        log.error(_IDL_USES_AOSP_COMPILER_ERROR % ctx.label)
117*9e965d6fSRomain Jobredeaux
118*9e965d6fSRomain Jobredeaux    # Check if idlopts is with idl_uses_aosp_compiler
119*9e965d6fSRomain Jobredeaux    if ctx.attr.idlopts and not ctx.attr.idl_uses_aosp_compiler:
120*9e965d6fSRomain Jobredeaux        log.error(_IDL_IDLOPTS_UNSUPPORTERD_ERROR)
121*9e965d6fSRomain Jobredeaux
122*9e965d6fSRomain Jobredeaux    return struct(
123*9e965d6fSRomain Jobredeaux        enable_deps_without_srcs = _check_deps_without_java_srcs(ctx),
124*9e965d6fSRomain Jobredeaux    )
125*9e965d6fSRomain Jobredeaux
126*9e965d6fSRomain Jobredeauxdef _exceptions_processor(ctx, **unused_ctxs):
127*9e965d6fSRomain Jobredeaux    return ProviderInfo(
128*9e965d6fSRomain Jobredeaux        name = "exceptions_ctx",
129*9e965d6fSRomain Jobredeaux        value = _validate_rule_context(ctx),
130*9e965d6fSRomain Jobredeaux    )
131*9e965d6fSRomain Jobredeaux
132*9e965d6fSRomain Jobredeauxdef _process_manifest(ctx, **unused_ctxs):
133*9e965d6fSRomain Jobredeaux    manifest_ctx = _resources.bump_min_sdk(
134*9e965d6fSRomain Jobredeaux        ctx,
135*9e965d6fSRomain Jobredeaux        manifest = ctx.file.manifest,
136*9e965d6fSRomain Jobredeaux        floor = acls.get_min_sdk_floor(str(ctx.label)),
137*9e965d6fSRomain Jobredeaux        enforce_min_sdk_floor_tool = get_android_toolchain(ctx).enforce_min_sdk_floor_tool.files_to_run,
138*9e965d6fSRomain Jobredeaux    )
139*9e965d6fSRomain Jobredeaux
140*9e965d6fSRomain Jobredeaux    return ProviderInfo(
141*9e965d6fSRomain Jobredeaux        name = "manifest_ctx",
142*9e965d6fSRomain Jobredeaux        value = manifest_ctx,
143*9e965d6fSRomain Jobredeaux    )
144*9e965d6fSRomain Jobredeaux
145*9e965d6fSRomain Jobredeauxdef _process_resources(ctx, java_package, manifest_ctx, **unused_ctxs):
146*9e965d6fSRomain Jobredeaux    # exports_manifest can be overridden by a bazel flag.
147*9e965d6fSRomain Jobredeaux    if ctx.attr.exports_manifest == _attrs.tristate.auto:
148*9e965d6fSRomain Jobredeaux        exports_manifest = ctx.fragments.android.get_exports_manifest_default
149*9e965d6fSRomain Jobredeaux    else:
150*9e965d6fSRomain Jobredeaux        exports_manifest = ctx.attr.exports_manifest == _attrs.tristate.yes
151*9e965d6fSRomain Jobredeaux
152*9e965d6fSRomain Jobredeaux    resource_apks = []
153*9e965d6fSRomain Jobredeaux    for apk in utils.collect_providers(StarlarkApkInfo, ctx.attr.resource_apks):
154*9e965d6fSRomain Jobredeaux        resource_apks.append(apk.signed_apk)
155*9e965d6fSRomain Jobredeaux
156*9e965d6fSRomain Jobredeaux    # Process Android Resources
157*9e965d6fSRomain Jobredeaux    resources_ctx = _resources.process(
158*9e965d6fSRomain Jobredeaux        ctx,
159*9e965d6fSRomain Jobredeaux        manifest = manifest_ctx.processed_manifest,
160*9e965d6fSRomain Jobredeaux        resource_files = ctx.attr.resource_files,
161*9e965d6fSRomain Jobredeaux        defined_assets = ctx.attr._defined_assets,
162*9e965d6fSRomain Jobredeaux        assets = ctx.attr.assets,
163*9e965d6fSRomain Jobredeaux        defined_assets_dir = ctx.attr._defined_assets_dir,
164*9e965d6fSRomain Jobredeaux        assets_dir = ctx.attr.assets_dir,
165*9e965d6fSRomain Jobredeaux        exports_manifest = exports_manifest,
166*9e965d6fSRomain Jobredeaux        java_package = java_package,
167*9e965d6fSRomain Jobredeaux        custom_package = ctx.attr.custom_package,
168*9e965d6fSRomain Jobredeaux        neverlink = ctx.attr.neverlink,
169*9e965d6fSRomain Jobredeaux        enable_data_binding = ctx.attr.enable_data_binding,
170*9e965d6fSRomain Jobredeaux        deps = ctx.attr.deps,
171*9e965d6fSRomain Jobredeaux        resource_apks = resource_apks,
172*9e965d6fSRomain Jobredeaux        exports = ctx.attr.exports,
173*9e965d6fSRomain Jobredeaux
174*9e965d6fSRomain Jobredeaux        # Processing behavior changing flags.
175*9e965d6fSRomain Jobredeaux        enable_res_v3 = _flags.get(ctx).android_enable_res_v3,
176*9e965d6fSRomain Jobredeaux        # TODO(b/144163743): remove fix_resource_transitivity, which was only added to emulate
177*9e965d6fSRomain Jobredeaux        # misbehavior on the Java side.
178*9e965d6fSRomain Jobredeaux        fix_resource_transitivity = bool(ctx.attr.srcs),
179*9e965d6fSRomain Jobredeaux        fix_export_exporting = acls.in_fix_export_exporting_rollout(str(ctx.label)),
180*9e965d6fSRomain Jobredeaux
181*9e965d6fSRomain Jobredeaux        # Tool and Processing related inputs
182*9e965d6fSRomain Jobredeaux        aapt = get_android_toolchain(ctx).aapt2.files_to_run,
183*9e965d6fSRomain Jobredeaux        android_jar = get_android_sdk(ctx).android_jar,
184*9e965d6fSRomain Jobredeaux        android_kit = get_android_toolchain(ctx).android_kit.files_to_run,
185*9e965d6fSRomain Jobredeaux        busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run,
186*9e965d6fSRomain Jobredeaux        java_toolchain = _common.get_java_toolchain(ctx),
187*9e965d6fSRomain Jobredeaux        host_javabase = _common.get_host_javabase(ctx),
188*9e965d6fSRomain Jobredeaux        instrument_xslt = utils.only(get_android_toolchain(ctx).add_g3itr_xslt.files.to_list()),
189*9e965d6fSRomain Jobredeaux        res_v3_dummy_manifest = utils.only(
190*9e965d6fSRomain Jobredeaux            get_android_toolchain(ctx).res_v3_dummy_manifest.files.to_list(),
191*9e965d6fSRomain Jobredeaux        ),
192*9e965d6fSRomain Jobredeaux        res_v3_dummy_r_txt = utils.only(
193*9e965d6fSRomain Jobredeaux            get_android_toolchain(ctx).res_v3_dummy_r_txt.files.to_list(),
194*9e965d6fSRomain Jobredeaux        ),
195*9e965d6fSRomain Jobredeaux        xsltproc = get_android_toolchain(ctx).xsltproc_tool.files_to_run,
196*9e965d6fSRomain Jobredeaux        zip_tool = get_android_toolchain(ctx).zip_tool.files_to_run,
197*9e965d6fSRomain Jobredeaux    )
198*9e965d6fSRomain Jobredeaux
199*9e965d6fSRomain Jobredeaux    # TODO(b/139305816): Remove the ability for android_library to be added in
200*9e965d6fSRomain Jobredeaux    # the srcs attribute of another android_library.
201*9e965d6fSRomain Jobredeaux    if resources_ctx.defines_resources:
202*9e965d6fSRomain Jobredeaux        # Verify that srcs do no contain labels.
203*9e965d6fSRomain Jobredeaux        for src in ctx.attr.srcs:
204*9e965d6fSRomain Jobredeaux            if AndroidResourcesInfo in src:
205*9e965d6fSRomain Jobredeaux                log.error(_SRCS_CONTAIN_RESOURCE_LABEL_ERROR %
206*9e965d6fSRomain Jobredeaux                          src[AndroidResourcesInfo].label)
207*9e965d6fSRomain Jobredeaux
208*9e965d6fSRomain Jobredeaux    return ProviderInfo(
209*9e965d6fSRomain Jobredeaux        name = "resources_ctx",
210*9e965d6fSRomain Jobredeaux        value = resources_ctx,
211*9e965d6fSRomain Jobredeaux    )
212*9e965d6fSRomain Jobredeaux
213*9e965d6fSRomain Jobredeauxdef _process_idl(ctx, **unused_sub_ctxs):
214*9e965d6fSRomain Jobredeaux    return ProviderInfo(
215*9e965d6fSRomain Jobredeaux        name = "idl_ctx",
216*9e965d6fSRomain Jobredeaux        value = _idl.process(
217*9e965d6fSRomain Jobredeaux            ctx,
218*9e965d6fSRomain Jobredeaux            idl_srcs = ctx.files.idl_srcs,
219*9e965d6fSRomain Jobredeaux            idl_parcelables = ctx.files.idl_parcelables,
220*9e965d6fSRomain Jobredeaux            idl_import_root =
221*9e965d6fSRomain Jobredeaux                ctx.attr.idl_import_root if ctx.attr._defined_idl_import_root else None,
222*9e965d6fSRomain Jobredeaux            idl_preprocessed = ctx.files.idl_preprocessed,
223*9e965d6fSRomain Jobredeaux            deps = utils.collect_providers(AndroidIdlInfo, ctx.attr.deps),
224*9e965d6fSRomain Jobredeaux            exports = utils.collect_providers(AndroidIdlInfo, ctx.attr.exports),
225*9e965d6fSRomain Jobredeaux            aidl = get_android_sdk(ctx).aidl,
226*9e965d6fSRomain Jobredeaux            aidl_lib = get_android_sdk(ctx).aidl_lib,
227*9e965d6fSRomain Jobredeaux            aidl_framework = get_android_sdk(ctx).framework_aidl,
228*9e965d6fSRomain Jobredeaux            uses_aosp_compiler = ctx.attr.idl_uses_aosp_compiler,
229*9e965d6fSRomain Jobredeaux            idlopts = ctx.attr.idlopts,
230*9e965d6fSRomain Jobredeaux        ),
231*9e965d6fSRomain Jobredeaux    )
232*9e965d6fSRomain Jobredeaux
233*9e965d6fSRomain Jobredeauxdef _process_data_binding(ctx, java_package, resources_ctx, **unused_sub_ctxs):
234*9e965d6fSRomain Jobredeaux    if ctx.attr.enable_data_binding and not acls.in_databinding_allowed(str(ctx.label)):
235*9e965d6fSRomain Jobredeaux        fail("This target is not allowed to use databinding and enable_data_binding is True.")
236*9e965d6fSRomain Jobredeaux    return ProviderInfo(
237*9e965d6fSRomain Jobredeaux        name = "db_ctx",
238*9e965d6fSRomain Jobredeaux        value = _data_binding.process(
239*9e965d6fSRomain Jobredeaux            ctx,
240*9e965d6fSRomain Jobredeaux            defines_resources = resources_ctx.defines_resources,
241*9e965d6fSRomain Jobredeaux            enable_data_binding = ctx.attr.enable_data_binding,
242*9e965d6fSRomain Jobredeaux            java_package = java_package,
243*9e965d6fSRomain Jobredeaux            layout_info = resources_ctx.data_binding_layout_info,
244*9e965d6fSRomain Jobredeaux            deps = utils.collect_providers(DataBindingV2Info, ctx.attr.deps),
245*9e965d6fSRomain Jobredeaux            exports = utils.collect_providers(DataBindingV2Info, ctx.attr.exports),
246*9e965d6fSRomain Jobredeaux            data_binding_exec = get_android_toolchain(ctx).data_binding_exec.files_to_run,
247*9e965d6fSRomain Jobredeaux            data_binding_annotation_processor =
248*9e965d6fSRomain Jobredeaux                get_android_toolchain(ctx).data_binding_annotation_processor,
249*9e965d6fSRomain Jobredeaux            data_binding_annotation_template =
250*9e965d6fSRomain Jobredeaux                utils.only(get_android_toolchain(ctx).data_binding_annotation_template.files.to_list()),
251*9e965d6fSRomain Jobredeaux        ),
252*9e965d6fSRomain Jobredeaux    )
253*9e965d6fSRomain Jobredeaux
254*9e965d6fSRomain Jobredeauxdef _process_proguard(ctx, idl_ctx, **unused_sub_ctxs):
255*9e965d6fSRomain Jobredeaux    return ProviderInfo(
256*9e965d6fSRomain Jobredeaux        name = "proguard_ctx",
257*9e965d6fSRomain Jobredeaux        value = _proguard.process_specs(
258*9e965d6fSRomain Jobredeaux            ctx,
259*9e965d6fSRomain Jobredeaux            proguard_configs = ctx.files.proguard_specs,
260*9e965d6fSRomain Jobredeaux            proguard_spec_providers = utils.collect_providers(
261*9e965d6fSRomain Jobredeaux                ProguardSpecProvider,
262*9e965d6fSRomain Jobredeaux                ctx.attr.deps,
263*9e965d6fSRomain Jobredeaux                ctx.attr.exports,
264*9e965d6fSRomain Jobredeaux                idl_ctx.idl_deps,
265*9e965d6fSRomain Jobredeaux            ),
266*9e965d6fSRomain Jobredeaux            proguard_allowlister =
267*9e965d6fSRomain Jobredeaux                get_android_toolchain(ctx).proguard_allowlister.files_to_run,
268*9e965d6fSRomain Jobredeaux        ),
269*9e965d6fSRomain Jobredeaux    )
270*9e965d6fSRomain Jobredeaux
271*9e965d6fSRomain Jobredeauxdef _process_jvm(ctx, exceptions_ctx, resources_ctx, idl_ctx, db_ctx, **unused_sub_ctxs):
272*9e965d6fSRomain Jobredeaux    java_info = _java.compile_android(
273*9e965d6fSRomain Jobredeaux        ctx,
274*9e965d6fSRomain Jobredeaux        ctx.outputs.lib_jar,
275*9e965d6fSRomain Jobredeaux        ctx.outputs.lib_src_jar,
276*9e965d6fSRomain Jobredeaux        srcs = ctx.files.srcs + idl_ctx.idl_java_srcs + db_ctx.java_srcs,
277*9e965d6fSRomain Jobredeaux        javac_opts = ctx.attr.javacopts + db_ctx.javac_opts,
278*9e965d6fSRomain Jobredeaux        r_java = resources_ctx.r_java,
279*9e965d6fSRomain Jobredeaux        deps =
280*9e965d6fSRomain Jobredeaux            utils.collect_providers(JavaInfo, ctx.attr.deps, idl_ctx.idl_deps),
281*9e965d6fSRomain Jobredeaux        exports = utils.collect_providers(JavaInfo, ctx.attr.exports),
282*9e965d6fSRomain Jobredeaux        plugins = utils.collect_providers(JavaPluginInfo, ctx.attr.plugins, db_ctx.java_plugins),
283*9e965d6fSRomain Jobredeaux        exported_plugins = utils.collect_providers(
284*9e965d6fSRomain Jobredeaux            JavaPluginInfo,
285*9e965d6fSRomain Jobredeaux            ctx.attr.exported_plugins,
286*9e965d6fSRomain Jobredeaux        ),
287*9e965d6fSRomain Jobredeaux        annotation_processor_additional_outputs = (
288*9e965d6fSRomain Jobredeaux            db_ctx.java_annotation_processor_additional_outputs
289*9e965d6fSRomain Jobredeaux        ),
290*9e965d6fSRomain Jobredeaux        annotation_processor_additional_inputs = (
291*9e965d6fSRomain Jobredeaux            db_ctx.java_annotation_processor_additional_inputs
292*9e965d6fSRomain Jobredeaux        ),
293*9e965d6fSRomain Jobredeaux        enable_deps_without_srcs = exceptions_ctx.enable_deps_without_srcs,
294*9e965d6fSRomain Jobredeaux        neverlink = ctx.attr.neverlink,
295*9e965d6fSRomain Jobredeaux        strict_deps = "DEFAULT",
296*9e965d6fSRomain Jobredeaux        java_toolchain = _common.get_java_toolchain(ctx),
297*9e965d6fSRomain Jobredeaux    )
298*9e965d6fSRomain Jobredeaux
299*9e965d6fSRomain Jobredeaux    providers = [java_info]
300*9e965d6fSRomain Jobredeaux
301*9e965d6fSRomain Jobredeaux    # Propagate Lint rule Jars from any exported AARs (b/229993446)
302*9e965d6fSRomain Jobredeaux    android_lint_rules = [info.lint_jars for info in utils.collect_providers(
303*9e965d6fSRomain Jobredeaux        AndroidLintRulesInfo,
304*9e965d6fSRomain Jobredeaux        ctx.attr.exports,
305*9e965d6fSRomain Jobredeaux    )]
306*9e965d6fSRomain Jobredeaux    if android_lint_rules:
307*9e965d6fSRomain Jobredeaux        providers.append(
308*9e965d6fSRomain Jobredeaux            AndroidLintRulesInfo(
309*9e965d6fSRomain Jobredeaux                lint_jars = depset(transitive = android_lint_rules),
310*9e965d6fSRomain Jobredeaux            ),
311*9e965d6fSRomain Jobredeaux        )
312*9e965d6fSRomain Jobredeaux
313*9e965d6fSRomain Jobredeaux    return ProviderInfo(
314*9e965d6fSRomain Jobredeaux        name = "jvm_ctx",
315*9e965d6fSRomain Jobredeaux        value = struct(
316*9e965d6fSRomain Jobredeaux            java_info = java_info,
317*9e965d6fSRomain Jobredeaux            providers = providers,
318*9e965d6fSRomain Jobredeaux        ),
319*9e965d6fSRomain Jobredeaux    )
320*9e965d6fSRomain Jobredeaux
321*9e965d6fSRomain Jobredeauxdef _process_aar(ctx, java_package, resources_ctx, proguard_ctx, **unused_ctx):
322*9e965d6fSRomain Jobredeaux    aar_ctx = {
323*9e965d6fSRomain Jobredeaux        _PROVIDERS: [],
324*9e965d6fSRomain Jobredeaux        _VALIDATION_OUTPUTS: [],
325*9e965d6fSRomain Jobredeaux    }
326*9e965d6fSRomain Jobredeaux
327*9e965d6fSRomain Jobredeaux    starlark_aar = _resources.make_aar(
328*9e965d6fSRomain Jobredeaux        ctx,
329*9e965d6fSRomain Jobredeaux        manifest = resources_ctx.starlark_processed_manifest,
330*9e965d6fSRomain Jobredeaux        assets = ctx.files.assets,
331*9e965d6fSRomain Jobredeaux        assets_dir = ctx.attr.assets_dir,
332*9e965d6fSRomain Jobredeaux        resource_files = resources_ctx.starlark_processed_resources if not ctx.attr.neverlink else [],
333*9e965d6fSRomain Jobredeaux        class_jar = ctx.outputs.lib_jar,
334*9e965d6fSRomain Jobredeaux        r_txt = resources_ctx.starlark_r_txt,
335*9e965d6fSRomain Jobredeaux        proguard_specs = proguard_ctx.proguard_configs,
336*9e965d6fSRomain Jobredeaux        busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run,
337*9e965d6fSRomain Jobredeaux        host_javabase = _common.get_host_javabase(ctx),
338*9e965d6fSRomain Jobredeaux    )
339*9e965d6fSRomain Jobredeaux
340*9e965d6fSRomain Jobredeaux    # TODO(b/170409221): Clean this up once Starlark migration is complete. Create and propagate
341*9e965d6fSRomain Jobredeaux    # a native aar info provider with the Starlark artifacts to avoid breaking downstream
342*9e965d6fSRomain Jobredeaux    # targets.
343*9e965d6fSRomain Jobredeaux    if not ctx.attr.neverlink:
344*9e965d6fSRomain Jobredeaux        aar_ctx[_PROVIDERS].append(AndroidLibraryAarInfo(
345*9e965d6fSRomain Jobredeaux            aar = starlark_aar,
346*9e965d6fSRomain Jobredeaux            manifest = resources_ctx.starlark_processed_manifest,
347*9e965d6fSRomain Jobredeaux            aars_from_deps = utils.collect_providers(
348*9e965d6fSRomain Jobredeaux                AndroidLibraryAarInfo,
349*9e965d6fSRomain Jobredeaux                ctx.attr.deps,
350*9e965d6fSRomain Jobredeaux                ctx.attr.exports,
351*9e965d6fSRomain Jobredeaux            ),
352*9e965d6fSRomain Jobredeaux            defines_local_resources = resources_ctx.defines_resources,
353*9e965d6fSRomain Jobredeaux        ))
354*9e965d6fSRomain Jobredeaux
355*9e965d6fSRomain Jobredeaux    return ProviderInfo(
356*9e965d6fSRomain Jobredeaux        name = "aar_ctx",
357*9e965d6fSRomain Jobredeaux        value = _AARContextInfo(**aar_ctx),
358*9e965d6fSRomain Jobredeaux    )
359*9e965d6fSRomain Jobredeaux
360*9e965d6fSRomain Jobredeauxdef _process_native(ctx, idl_ctx, **unused_ctx):
361*9e965d6fSRomain Jobredeaux    return ProviderInfo(
362*9e965d6fSRomain Jobredeaux        name = "native_ctx",
363*9e965d6fSRomain Jobredeaux        value = struct(
364*9e965d6fSRomain Jobredeaux            providers = [
365*9e965d6fSRomain Jobredeaux                AndroidNativeLibsInfo(
366*9e965d6fSRomain Jobredeaux                    depset(
367*9e965d6fSRomain Jobredeaux                        transitive = [
368*9e965d6fSRomain Jobredeaux                            p.native_libs
369*9e965d6fSRomain Jobredeaux                            for p in utils.collect_providers(
370*9e965d6fSRomain Jobredeaux                                AndroidNativeLibsInfo,
371*9e965d6fSRomain Jobredeaux                                ctx.attr.deps,
372*9e965d6fSRomain Jobredeaux                                ctx.attr.exports,
373*9e965d6fSRomain Jobredeaux                            )
374*9e965d6fSRomain Jobredeaux                        ],
375*9e965d6fSRomain Jobredeaux                        order = "preorder",
376*9e965d6fSRomain Jobredeaux                    ),
377*9e965d6fSRomain Jobredeaux                ),
378*9e965d6fSRomain Jobredeaux                AndroidCcLinkParamsInfo(
379*9e965d6fSRomain Jobredeaux                    cc_common.merge_cc_infos(
380*9e965d6fSRomain Jobredeaux                        cc_infos = [
381*9e965d6fSRomain Jobredeaux                                       info.cc_link_params_info
382*9e965d6fSRomain Jobredeaux                                       for info in utils.collect_providers(
383*9e965d6fSRomain Jobredeaux                                           JavaInfo,
384*9e965d6fSRomain Jobredeaux                                           ctx.attr.deps,
385*9e965d6fSRomain Jobredeaux                                           ctx.attr.exports,
386*9e965d6fSRomain Jobredeaux                                           idl_ctx.idl_deps,
387*9e965d6fSRomain Jobredeaux                                       )
388*9e965d6fSRomain Jobredeaux                                   ] +
389*9e965d6fSRomain Jobredeaux                                   [
390*9e965d6fSRomain Jobredeaux                                       info.link_params
391*9e965d6fSRomain Jobredeaux                                       for info in utils.collect_providers(
392*9e965d6fSRomain Jobredeaux                                           AndroidCcLinkParamsInfo,
393*9e965d6fSRomain Jobredeaux                                           ctx.attr.deps,
394*9e965d6fSRomain Jobredeaux                                           ctx.attr.exports,
395*9e965d6fSRomain Jobredeaux                                           idl_ctx.idl_deps,
396*9e965d6fSRomain Jobredeaux                                       )
397*9e965d6fSRomain Jobredeaux                                   ] +
398*9e965d6fSRomain Jobredeaux                                   utils.collect_providers(
399*9e965d6fSRomain Jobredeaux                                       CcInfo,
400*9e965d6fSRomain Jobredeaux                                       ctx.attr.deps,
401*9e965d6fSRomain Jobredeaux                                       ctx.attr.exports,
402*9e965d6fSRomain Jobredeaux                                       idl_ctx.idl_deps,
403*9e965d6fSRomain Jobredeaux                                   ),
404*9e965d6fSRomain Jobredeaux                    ),
405*9e965d6fSRomain Jobredeaux                ),
406*9e965d6fSRomain Jobredeaux            ],
407*9e965d6fSRomain Jobredeaux        ),
408*9e965d6fSRomain Jobredeaux    )
409*9e965d6fSRomain Jobredeaux
410*9e965d6fSRomain Jobredeauxdef _process_intellij(ctx, java_package, manifest_ctx, resources_ctx, idl_ctx, jvm_ctx, **unused_sub_ctxs):
411*9e965d6fSRomain Jobredeaux    android_ide_info = _intellij.make_android_ide_info(
412*9e965d6fSRomain Jobredeaux        ctx,
413*9e965d6fSRomain Jobredeaux        java_package = java_package,
414*9e965d6fSRomain Jobredeaux        manifest = manifest_ctx.processed_manifest,
415*9e965d6fSRomain Jobredeaux        defines_resources = resources_ctx.defines_resources,
416*9e965d6fSRomain Jobredeaux        merged_manifest = resources_ctx.merged_manifest,
417*9e965d6fSRomain Jobredeaux        resources_apk = resources_ctx.resources_apk,
418*9e965d6fSRomain Jobredeaux        r_jar = utils.only(resources_ctx.r_java.outputs.jars) if resources_ctx.r_java else None,
419*9e965d6fSRomain Jobredeaux        idl_import_root = idl_ctx.idl_import_root,
420*9e965d6fSRomain Jobredeaux        idl_srcs = idl_ctx.idl_srcs,
421*9e965d6fSRomain Jobredeaux        idl_java_srcs = idl_ctx.idl_java_srcs,
422*9e965d6fSRomain Jobredeaux        java_info = jvm_ctx.java_info,
423*9e965d6fSRomain Jobredeaux        signed_apk = None,  # signed_apk, always empty for android_library.
424*9e965d6fSRomain Jobredeaux        aar = getattr(ctx.outputs, "aar", None),  # Deprecate aar for android_library.
425*9e965d6fSRomain Jobredeaux        apks_under_test = [],  # apks_under_test, always empty for android_library
426*9e965d6fSRomain Jobredeaux        native_libs = dict(),  # nativelibs, always empty for android_library
427*9e965d6fSRomain Jobredeaux        idlclass = get_android_toolchain(ctx).idlclass.files_to_run,
428*9e965d6fSRomain Jobredeaux        host_javabase = _common.get_host_javabase(ctx),
429*9e965d6fSRomain Jobredeaux    )
430*9e965d6fSRomain Jobredeaux    return ProviderInfo(
431*9e965d6fSRomain Jobredeaux        name = "intellij_ctx",
432*9e965d6fSRomain Jobredeaux        value = struct(
433*9e965d6fSRomain Jobredeaux            android_ide_info = android_ide_info,
434*9e965d6fSRomain Jobredeaux            providers = [android_ide_info],
435*9e965d6fSRomain Jobredeaux        ),
436*9e965d6fSRomain Jobredeaux    )
437*9e965d6fSRomain Jobredeaux
438*9e965d6fSRomain Jobredeauxdef _process_coverage(ctx, **unused_ctx):
439*9e965d6fSRomain Jobredeaux    return ProviderInfo(
440*9e965d6fSRomain Jobredeaux        name = "coverage_ctx",
441*9e965d6fSRomain Jobredeaux        value = struct(
442*9e965d6fSRomain Jobredeaux            providers = [
443*9e965d6fSRomain Jobredeaux                coverage_common.instrumented_files_info(
444*9e965d6fSRomain Jobredeaux                    ctx,
445*9e965d6fSRomain Jobredeaux                    source_attributes = ["srcs"],
446*9e965d6fSRomain Jobredeaux                    dependency_attributes = ["assets", "deps", "exports"],
447*9e965d6fSRomain Jobredeaux                ),
448*9e965d6fSRomain Jobredeaux            ],
449*9e965d6fSRomain Jobredeaux        ),
450*9e965d6fSRomain Jobredeaux    )
451*9e965d6fSRomain Jobredeaux
452*9e965d6fSRomain Jobredeauxdef _process_baseline_profiles(ctx, **unused_ctx):
453*9e965d6fSRomain Jobredeaux    return ProviderInfo(
454*9e965d6fSRomain Jobredeaux        name = "bp_ctx",
455*9e965d6fSRomain Jobredeaux        value = struct(
456*9e965d6fSRomain Jobredeaux            providers = [
457*9e965d6fSRomain Jobredeaux                BaselineProfileProvider(depset(
458*9e965d6fSRomain Jobredeaux                    ctx.files.baseline_profiles,
459*9e965d6fSRomain Jobredeaux                    transitive = [bp.files for bp in utils.collect_providers(BaselineProfileProvider, ctx.attr.deps, ctx.attr.exports)],
460*9e965d6fSRomain Jobredeaux                )),
461*9e965d6fSRomain Jobredeaux            ],
462*9e965d6fSRomain Jobredeaux        ),
463*9e965d6fSRomain Jobredeaux    )
464*9e965d6fSRomain Jobredeaux
465*9e965d6fSRomain Jobredeaux# Order dependent, as providers will not be available to downstream processors
466*9e965d6fSRomain Jobredeaux# that may depend on the provider. Iteration order for a dictionary is based on
467*9e965d6fSRomain Jobredeaux# insertion.
468*9e965d6fSRomain JobredeauxPROCESSORS = dict(
469*9e965d6fSRomain Jobredeaux    ExceptionsProcessor = _exceptions_processor,
470*9e965d6fSRomain Jobredeaux    ManifestProcessor = _process_manifest,
471*9e965d6fSRomain Jobredeaux    ResourceProcessor = _process_resources,
472*9e965d6fSRomain Jobredeaux    IdlProcessor = _process_idl,
473*9e965d6fSRomain Jobredeaux    DataBindingProcessor = _process_data_binding,
474*9e965d6fSRomain Jobredeaux    JvmProcessor = _process_jvm,
475*9e965d6fSRomain Jobredeaux    ProguardProcessor = _process_proguard,
476*9e965d6fSRomain Jobredeaux    AarProcessor = _process_aar,
477*9e965d6fSRomain Jobredeaux    NativeProcessor = _process_native,
478*9e965d6fSRomain Jobredeaux    IntelliJProcessor = _process_intellij,
479*9e965d6fSRomain Jobredeaux    CoverageProcessor = _process_coverage,
480*9e965d6fSRomain Jobredeaux    BaselineProfilesProcessor = _process_baseline_profiles,
481*9e965d6fSRomain Jobredeaux)
482*9e965d6fSRomain Jobredeaux
483*9e965d6fSRomain Jobredeaux# TODO(b/119560471): Deprecate the usage of legacy providers.
484*9e965d6fSRomain Jobredeauxdef _make_legacy_provider(intellij_ctx, jvm_ctx, providers):
485*9e965d6fSRomain Jobredeaux    return struct(
486*9e965d6fSRomain Jobredeaux        android = _intellij.make_legacy_android_provider(intellij_ctx.android_ide_info),
487*9e965d6fSRomain Jobredeaux        java = struct(
488*9e965d6fSRomain Jobredeaux            annotation_processing = jvm_ctx.java_info.annotation_processing,
489*9e965d6fSRomain Jobredeaux            outputs = jvm_ctx.java_info.outputs,
490*9e965d6fSRomain Jobredeaux            source_jars = depset(jvm_ctx.java_info.source_jars),
491*9e965d6fSRomain Jobredeaux            transitive_deps = jvm_ctx.java_info.transitive_compile_time_jars,
492*9e965d6fSRomain Jobredeaux            transitive_runtime_deps = jvm_ctx.java_info.transitive_runtime_jars,
493*9e965d6fSRomain Jobredeaux            transitive_source_jars = jvm_ctx.java_info.transitive_source_jars,
494*9e965d6fSRomain Jobredeaux        ),
495*9e965d6fSRomain Jobredeaux        providers = providers,
496*9e965d6fSRomain Jobredeaux    )
497*9e965d6fSRomain Jobredeaux
498*9e965d6fSRomain Jobredeauxdef finalize(
499*9e965d6fSRomain Jobredeaux        ctx,
500*9e965d6fSRomain Jobredeaux        resources_ctx,
501*9e965d6fSRomain Jobredeaux        intellij_ctx,
502*9e965d6fSRomain Jobredeaux        jvm_ctx,
503*9e965d6fSRomain Jobredeaux        proguard_ctx,
504*9e965d6fSRomain Jobredeaux        providers,
505*9e965d6fSRomain Jobredeaux        validation_outputs,
506*9e965d6fSRomain Jobredeaux        **unused_ctxs):
507*9e965d6fSRomain Jobredeaux    """Creates the DefaultInfo and OutputGroupInfo providers.
508*9e965d6fSRomain Jobredeaux
509*9e965d6fSRomain Jobredeaux    Args:
510*9e965d6fSRomain Jobredeaux      ctx: The context.
511*9e965d6fSRomain Jobredeaux      resources_ctx: ProviderInfo. The resources ctx.
512*9e965d6fSRomain Jobredeaux      intellij_ctx: ProviderInfo. The intellij ctx.
513*9e965d6fSRomain Jobredeaux      jvm_ctx: ProviderInfo. The jvm ctx.
514*9e965d6fSRomain Jobredeaux      proguard_ctx: ProviderInfo. The proguard ctx.
515*9e965d6fSRomain Jobredeaux      providers: sequence of providers. The providers to propagate.
516*9e965d6fSRomain Jobredeaux      validation_outputs: sequence of Files. The validation outputs.
517*9e965d6fSRomain Jobredeaux      **unused_ctxs: Unused ProviderInfo.
518*9e965d6fSRomain Jobredeaux
519*9e965d6fSRomain Jobredeaux    Returns:
520*9e965d6fSRomain Jobredeaux      A struct with Android and Java legacy providers and a list of providers.
521*9e965d6fSRomain Jobredeaux    """
522*9e965d6fSRomain Jobredeaux    transitive_runfiles = []
523*9e965d6fSRomain Jobredeaux    if not ctx.attr.neverlink:
524*9e965d6fSRomain Jobredeaux        for p in utils.collect_providers(
525*9e965d6fSRomain Jobredeaux            DefaultInfo,
526*9e965d6fSRomain Jobredeaux            ctx.attr.deps,
527*9e965d6fSRomain Jobredeaux            ctx.attr.exports,
528*9e965d6fSRomain Jobredeaux        ):
529*9e965d6fSRomain Jobredeaux            transitive_runfiles.append(p.data_runfiles.files)
530*9e965d6fSRomain Jobredeaux            transitive_runfiles.append(p.default_runfiles.files)
531*9e965d6fSRomain Jobredeaux    runfiles = ctx.runfiles(
532*9e965d6fSRomain Jobredeaux        files = (
533*9e965d6fSRomain Jobredeaux            (resources_ctx.r_java.runtime_output_jars if resources_ctx.r_java and not ctx.attr.neverlink else []) +
534*9e965d6fSRomain Jobredeaux            ([ctx.outputs.lib_jar] if (ctx.attr.srcs or ctx.attr.idl_srcs) and not ctx.attr.neverlink else [])
535*9e965d6fSRomain Jobredeaux        ),
536*9e965d6fSRomain Jobredeaux        transitive_files = depset(transitive = transitive_runfiles),
537*9e965d6fSRomain Jobredeaux        collect_default = True,
538*9e965d6fSRomain Jobredeaux    )
539*9e965d6fSRomain Jobredeaux    files = [ctx.outputs.lib_jar]
540*9e965d6fSRomain Jobredeaux    if getattr(ctx.outputs, "resources_src_jar", None):
541*9e965d6fSRomain Jobredeaux        files.append(ctx.outputs.resources_src_jar)
542*9e965d6fSRomain Jobredeaux    if getattr(ctx.outputs, "resources_jar", None):
543*9e965d6fSRomain Jobredeaux        files.append(ctx.outputs.resources_jar)
544*9e965d6fSRomain Jobredeaux
545*9e965d6fSRomain Jobredeaux    providers.extend([
546*9e965d6fSRomain Jobredeaux        DefaultInfo(
547*9e965d6fSRomain Jobredeaux            files = depset(files),
548*9e965d6fSRomain Jobredeaux            runfiles = runfiles,
549*9e965d6fSRomain Jobredeaux        ),
550*9e965d6fSRomain Jobredeaux        OutputGroupInfo(
551*9e965d6fSRomain Jobredeaux            compilation_outputs = depset([ctx.outputs.lib_jar]),
552*9e965d6fSRomain Jobredeaux            _source_jars = depset(
553*9e965d6fSRomain Jobredeaux                [ctx.outputs.lib_src_jar],
554*9e965d6fSRomain Jobredeaux                transitive = [jvm_ctx.java_info.transitive_source_jars],
555*9e965d6fSRomain Jobredeaux            ),
556*9e965d6fSRomain Jobredeaux            _direct_source_jars = depset([ctx.outputs.lib_src_jar]),
557*9e965d6fSRomain Jobredeaux            _hidden_top_level_INTERNAL_ = depset(
558*9e965d6fSRomain Jobredeaux                resources_ctx.validation_results,
559*9e965d6fSRomain Jobredeaux                transitive = [
560*9e965d6fSRomain Jobredeaux                    info._hidden_top_level_INTERNAL_
561*9e965d6fSRomain Jobredeaux                    for info in utils.collect_providers(
562*9e965d6fSRomain Jobredeaux                        OutputGroupInfo,
563*9e965d6fSRomain Jobredeaux                        ctx.attr.deps,
564*9e965d6fSRomain Jobredeaux                        ctx.attr.exports,
565*9e965d6fSRomain Jobredeaux                    )
566*9e965d6fSRomain Jobredeaux                ] + [proguard_ctx.transitive_proguard_configs],
567*9e965d6fSRomain Jobredeaux            ),
568*9e965d6fSRomain Jobredeaux            _validation = depset(validation_outputs),
569*9e965d6fSRomain Jobredeaux        ),
570*9e965d6fSRomain Jobredeaux    ])
571*9e965d6fSRomain Jobredeaux    return _make_legacy_provider(intellij_ctx, jvm_ctx, providers)
572*9e965d6fSRomain Jobredeaux
573*9e965d6fSRomain Jobredeaux_PROCESSING_PIPELINE = processing_pipeline.make_processing_pipeline(
574*9e965d6fSRomain Jobredeaux    processors = PROCESSORS,
575*9e965d6fSRomain Jobredeaux    finalize = finalize,
576*9e965d6fSRomain Jobredeaux)
577*9e965d6fSRomain Jobredeaux
578*9e965d6fSRomain Jobredeauxdef impl(ctx):
579*9e965d6fSRomain Jobredeaux    """The rule implementation.
580*9e965d6fSRomain Jobredeaux
581*9e965d6fSRomain Jobredeaux    Args:
582*9e965d6fSRomain Jobredeaux      ctx: The context.
583*9e965d6fSRomain Jobredeaux
584*9e965d6fSRomain Jobredeaux    Returns:
585*9e965d6fSRomain Jobredeaux      A legacy struct provider.
586*9e965d6fSRomain Jobredeaux    """
587*9e965d6fSRomain Jobredeaux    java_package = _java.resolve_package_from_label(ctx.label, ctx.attr.custom_package)
588*9e965d6fSRomain Jobredeaux    return processing_pipeline.run(ctx, java_package, _PROCESSING_PIPELINE)
589