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("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Workerdef get_dep_targets(attrs, *, predicate = lambda _: True): 18*7594170eSAndroid Build Coastguard Worker """get_dep_targets returns all targets listed in the current rule's attributes 19*7594170eSAndroid Build Coastguard Worker 20*7594170eSAndroid Build Coastguard Worker Args: 21*7594170eSAndroid Build Coastguard Worker attrs (dict[str, attr]): dictionary containing the rule's attributes. 22*7594170eSAndroid Build Coastguard Worker This may come from `ctx.attr` if called from a rule, or 23*7594170eSAndroid Build Coastguard Worker `ctx.rule.attr` if called from an aspect. 24*7594170eSAndroid Build Coastguard Worker predicate (function(Target) -> bool): a function used to filter out 25*7594170eSAndroid Build Coastguard Worker unwanted targets; if predicate(target) == False, then do not include 26*7594170eSAndroid Build Coastguard Worker target 27*7594170eSAndroid Build Coastguard Worker Returns: 28*7594170eSAndroid Build Coastguard Worker targets (dict[str, list[Target]]): map of attr to list of Targets for which 29*7594170eSAndroid Build Coastguard Worker predicate returns True 30*7594170eSAndroid Build Coastguard Worker """ 31*7594170eSAndroid Build Coastguard Worker targets = {} 32*7594170eSAndroid Build Coastguard Worker for a in dir(attrs): 33*7594170eSAndroid Build Coastguard Worker if a.startswith("_"): 34*7594170eSAndroid Build Coastguard Worker # Ignore private attributes 35*7594170eSAndroid Build Coastguard Worker continue 36*7594170eSAndroid Build Coastguard Worker targets[a] = [] 37*7594170eSAndroid Build Coastguard Worker value = getattr(attrs, a) 38*7594170eSAndroid Build Coastguard Worker vlist = value if type(value) == type([]) else [value] 39*7594170eSAndroid Build Coastguard Worker for item in vlist: 40*7594170eSAndroid Build Coastguard Worker if type(item) == "Target" and predicate(item): 41*7594170eSAndroid Build Coastguard Worker targets[a].append(item) 42*7594170eSAndroid Build Coastguard Worker return targets 43*7594170eSAndroid Build Coastguard Worker 44*7594170eSAndroid Build Coastguard Worker_BP2BUILD_LABEL_SUFFIXES = [ 45*7594170eSAndroid Build Coastguard Worker # cc rules 46*7594170eSAndroid Build Coastguard Worker "_bp2build_cc_library_static", 47*7594170eSAndroid Build Coastguard Worker "_cc_proto_lite", 48*7594170eSAndroid Build Coastguard Worker "_aidl_code_gen", 49*7594170eSAndroid Build Coastguard Worker "_cc_aidl_library", 50*7594170eSAndroid Build Coastguard Worker] 51*7594170eSAndroid Build Coastguard Worker 52*7594170eSAndroid Build Coastguard Workerdef strip_bp2build_label_suffix(name): 53*7594170eSAndroid Build Coastguard Worker for suffix in _BP2BUILD_LABEL_SUFFIXES: 54*7594170eSAndroid Build Coastguard Worker name = name.removesuffix(suffix) 55*7594170eSAndroid Build Coastguard Worker return name 56*7594170eSAndroid Build Coastguard Worker 57*7594170eSAndroid Build Coastguard Workerdef _repeatable_string_flag_impl(ctx): 58*7594170eSAndroid Build Coastguard Worker return [BuildSettingInfo(value = [v for v in ctx.build_setting_value])] 59*7594170eSAndroid Build Coastguard Worker 60*7594170eSAndroid Build Coastguard Workerrepeatable_string_flag = rule( 61*7594170eSAndroid Build Coastguard Worker implementation = _repeatable_string_flag_impl, 62*7594170eSAndroid Build Coastguard Worker build_setting = config.string(flag = True, allow_multiple = True), 63*7594170eSAndroid Build Coastguard Worker) 64