xref: /aosp_15_r20/external/bazelbuild-rules_android/mobile_install/mi.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"""Aspect for mobile-install."""
15*9e965d6fSRomain Jobredeaux
16*9e965d6fSRomain Jobredeauxload(":adapters.bzl", "adapters")
17*9e965d6fSRomain Jobredeauxload(":debug.bzl", "debug")
18*9e965d6fSRomain Jobredeauxload(":tools.bzl", "TOOL_ATTRS")
19*9e965d6fSRomain Jobredeauxload("//rules/flags:flags.bzl", "flags")
20*9e965d6fSRomain Jobredeaux
21*9e965d6fSRomain Jobredeauxdef aspect_impl(target, ctx):
22*9e965d6fSRomain Jobredeaux    """Calls the adapter for a given rule and returns its providers.
23*9e965d6fSRomain Jobredeaux
24*9e965d6fSRomain Jobredeaux    Args:
25*9e965d6fSRomain Jobredeaux      target: Target of the MI command
26*9e965d6fSRomain Jobredeaux      ctx: Current context
27*9e965d6fSRomain Jobredeaux
28*9e965d6fSRomain Jobredeaux    Returns:
29*9e965d6fSRomain Jobredeaux      A list of providers
30*9e965d6fSRomain Jobredeaux    """
31*9e965d6fSRomain Jobredeaux    adapter = adapters.get(ctx.rule.kind)
32*9e965d6fSRomain Jobredeaux
33*9e965d6fSRomain Jobredeaux    if not adapter:
34*9e965d6fSRomain Jobredeaux        return []
35*9e965d6fSRomain Jobredeaux
36*9e965d6fSRomain Jobredeaux    # Debug.
37*9e965d6fSRomain Jobredeaux    infos = adapter.adapt(target, ctx)
38*9e965d6fSRomain Jobredeaux    if flags.get(ctx).debug:
39*9e965d6fSRomain Jobredeaux        infos.append(OutputGroupInfo(**debug.make_output_groups(infos)))
40*9e965d6fSRomain Jobredeaux    return infos
41*9e965d6fSRomain Jobredeaux
42*9e965d6fSRomain Jobredeauxdef make_aspect(
43*9e965d6fSRomain Jobredeaux        dex_shards = 16,
44*9e965d6fSRomain Jobredeaux        is_cmd = True,
45*9e965d6fSRomain Jobredeaux        is_test = False,
46*9e965d6fSRomain Jobredeaux        res_shards = 1,
47*9e965d6fSRomain Jobredeaux        tools = TOOL_ATTRS):
48*9e965d6fSRomain Jobredeaux    """Make aspect for incremental android apps.
49*9e965d6fSRomain Jobredeaux
50*9e965d6fSRomain Jobredeaux    Args:
51*9e965d6fSRomain Jobredeaux      dex_shards: Number of dex shards to split the project across.
52*9e965d6fSRomain Jobredeaux      is_cmd: A Boolean, when True the aspect is running in the context of the
53*9e965d6fSRomain Jobredeaux        mobile-install command. If False it is as a rule (e.g. mi_test).
54*9e965d6fSRomain Jobredeaux      res_shards: Number of Android resource shards during processing.
55*9e965d6fSRomain Jobredeaux    Returns:
56*9e965d6fSRomain Jobredeaux      A configured aspect.
57*9e965d6fSRomain Jobredeaux    """
58*9e965d6fSRomain Jobredeaux    attrs = dict(
59*9e965d6fSRomain Jobredeaux        _mi_dex_shards = attr.int(default = dex_shards),
60*9e965d6fSRomain Jobredeaux        _mi_is_cmd = attr.bool(default = is_cmd),
61*9e965d6fSRomain Jobredeaux        _mi_res_shards = attr.int(default = res_shards),
62*9e965d6fSRomain Jobredeaux        _mi_is_test = attr.bool(default = is_test),
63*9e965d6fSRomain Jobredeaux    )
64*9e965d6fSRomain Jobredeaux    attrs.update(tools)
65*9e965d6fSRomain Jobredeaux    return aspect(
66*9e965d6fSRomain Jobredeaux        attr_aspects = adapters.get_all_aspect_attrs(),
67*9e965d6fSRomain Jobredeaux        attrs = attrs,
68*9e965d6fSRomain Jobredeaux        required_aspect_providers = [
69*9e965d6fSRomain Jobredeaux            [JavaInfo],  # JavaLiteProtoLibrary aspect.
70*9e965d6fSRomain Jobredeaux        ],
71*9e965d6fSRomain Jobredeaux        fragments = ["cpp", "java"],
72*9e965d6fSRomain Jobredeaux        host_fragments = ["jvm"],
73*9e965d6fSRomain Jobredeaux        implementation = aspect_impl,
74*9e965d6fSRomain Jobredeaux    )
75*9e965d6fSRomain Jobredeaux
76*9e965d6fSRomain Jobredeaux# MIASPECT allows you to run the aspect directly on a Blaze/Bazel command.
77*9e965d6fSRomain Jobredeaux#
78*9e965d6fSRomain Jobredeaux# Example:
79*9e965d6fSRomain Jobredeaux#   bazel build \
80*9e965d6fSRomain Jobredeaux#     --aspects=@rules_android//mobile_install:mi.bzl%MIASPECT
81*9e965d6fSRomain Jobredeaux#     --output_groups=mobile_install_INTERNAL_,mobile_install_launcher_INTERNAL_,-_,-defaults \
82*9e965d6fSRomain Jobredeaux#     java/com/example/exampleapp:exampleapp
83*9e965d6fSRomain JobredeauxMIASPECT = make_aspect()
84*9e965d6fSRomain JobredeauxMIRESASPECT = MIASPECT  # Deprecated, needs to get removed from MobileInstallCommand.java first.
85