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