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