xref: /aosp_15_r20/build/bazel/rules/common.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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