blob: 3eb6757112d3c97001bf5a532a485f0797737d66 [file] [log] [blame] [edit]
# Copyright 2023 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", _bool_flag = "bool_flag")
visibility("public")
def config_setting_not(name, target, visibility = None):
native.alias(
name = name,
actual = select({
target: "//bazel/build_defs/bool_flag:always_false",
"//conditions:default": "//bazel/build_defs/bool_flag:always_true",
}),
visibility = visibility,
)
def config_setting_all(name, targets, visibility = None):
selects.config_setting_group(
name = name,
match_all = targets,
visibility = visibility,
)
def config_setting_any(name, targets, visibility = None):
selects.config_setting_group(
name = name,
match_any = targets,
visibility = visibility,
)
def config_setting_not_all(name, targets, visibility = None):
all_name = "_{name}_all".format(name = name)
config_setting_all(
name = all_name,
targets = targets,
visibility = ["//visibility:private"],
)
config_setting_not(
name = name,
target = all_name,
visibility = visibility,
)
def config_setting_mutually_exclusive(name, target, mutually_exclusive_with, visibility = None):
nand_name = "_{name}_not_all".format(name = name)
config_setting_not_all(
name = nand_name,
targets = [target, mutually_exclusive_with],
visibility = ["//visibility:private"],
)
native.alias(
name = name,
actual = select(
{nand_name: target},
no_match_error = "{lhs} and {rhs} are mutually exclusive".format(
lhs = target,
rhs = mutually_exclusive_with,
),
),
visibility = visibility,
)
def config_setting_requires(name, target, requires, error = None, visibility = None):
# Valid iff (not target) OR requires
inverted = "_{name}_not_target".format(name = name)
config_setting_not(
name = inverted,
target = target,
visibility = ["//visibility:private"],
)
valid = "_{name}_valid".format(name = name)
config_setting_any(
name = valid,
targets = [inverted, requires],
visibility = ["//visibility:private"],
)
native.alias(
name = name,
actual = select(
{valid: target},
no_match_error = error or "{target} requires {requires}".format(
target = target,
requires = requires,
),
),
visibility = visibility,
)
def bool_flag(name, default, custom_condition = False, visibility = None):
"""Creates a bool flag and a {name}_enabled/_disabled config_setting.
Args:
name: (str) The name of your flag
default: (bool) Whether the flag is enabled by default
custom_condition: (bool) If true, generates _{name}_enabled instead of
{name}_enabled, and you're required to define your own {name}_enabled.
visibility: The visibility of the config_settings.
"""
_bool_flag(
name = name,
build_setting_default = default,
visibility = visibility,
)
native.config_setting(
name = "{prefix}{name}_enabled".format(
prefix = "_" if custom_condition else "",
name = name,
),
flag_values = {
":{name}".format(name = name): "True",
},
visibility = ["//visibility:private"] if custom_condition else visibility,
)
config_setting_not(
name = "{name}_disabled".format(name = name),
target = ":{name}_enabled".format(name = name),
visibility = visibility,
)