xref: /aosp_15_r20/external/skia/bazel/flags.bzl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1"""
2THIS IS THE EXTERNAL-ONLY VERSION OF THIS FILE. G3 HAS ITS OWN.
3
4This file contains helpers for defining build flags and options that are used to
5configure the Skia build.
6"""
7
8load("@bazel_skylib//lib:selects.bzl", _selects = "selects")
9
10# https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl
11load("@bazel_skylib//rules:common_settings.bzl", "string_flag", skylib_bool_flag = "bool_flag")
12
13# Re-export other symbols from bazel_skylib for convenience
14selects = _selects
15
16# Forked from https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl
17BuildSettingInfo = provider(
18    doc = "A singleton provider that contains the raw value of a multi-string build setting",
19    fields = ["values"],
20)
21
22def _multi_string_impl(ctx):
23    allowed_values = ctx.attr.values
24    values = ctx.build_setting_value
25    for v in values:
26        if v not in ctx.attr.values:
27            fail("Error setting " + str(ctx.label) + ": invalid value '" + v + "'. Allowed values are " + str(allowed_values))
28    return BuildSettingInfo(values = values)
29
30multi_string_flag = rule(
31    implementation = _multi_string_impl,
32    # https://bazel.build/rules/lib/config#string_list
33    build_setting = config.string_list(flag = True, repeatable = True),
34    attrs = {
35        "values": attr.string_list(
36            doc = "The list of allowed values for this setting. An error is raised if any other values are given.",
37        ),
38    },
39    doc = "A string-typed build setting that can be set multiple times on the command line",
40)
41
42def string_flag_with_values(name, values, default = "", multiple = False):
43    """Create a string flag and corresponding config_settings.
44
45    string_flag_with_values is a Bazel Macro that defines a flag with the given name and a set
46    of valid values for that flag. For each value, a config_setting is defined with the name
47    of the value, associated with the created flag.
48    This is defined to make the BUILD.bazel file easier to read w/o the boilerplate of defining
49    a string_flag rule and n config_settings
50    https://docs.bazel.build/versions/main/skylark/macros.html
51
52    Args:
53        name: string, the name of the flag to create and use for the config_settings
54        values: list of strings, the valid values for this flag to be set to.
55        default: string, whatever the default value should be if the flag is not set. Can be
56            empty string for both a string_flag and a multi_string flag.
57        multiple: boolean, True if the flag should be able to be set multiple times on the CLI.
58    """
59    if multiple:
60        multi_string_flag(
61            name = name,
62            # We have to specify a default value, even if that value is empty string.
63            # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings
64            build_setting_default = [default],
65            # We need to make sure empty string (the default) is in the list of acceptable values.
66            values = values + [""],
67        )
68    else:
69        string_flag(
70            name = name,
71            # We have to specify a default value, even if that value is empty string.
72            # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings
73            build_setting_default = default,
74            # We need to make sure empty string (the default) is in the list of acceptable values.
75            values = values + [""],
76        )
77
78    # For each of the values given, we define a config_setting. This allows us to use
79    # select statements, on the given setting, e.g. referencing
80    # //bazel/common_config_settings:some_valid_value_for_a_flag
81    for v in values:
82        native.config_setting(
83            name = v,
84            flag_values = {
85                ":" + name: v,
86            },
87            visibility = ["//:__subpackages__"],
88        )
89
90def bool_flag(name, default):
91    """Create a boolean flag and corresponding config_settings.
92
93    bool_flag is a Bazel Macro that defines a boolean flag with the given name two config_settings,
94    one for True, one for False. Reminder that Bazel has special syntax for unsetting boolean flags,
95    but this does not work well with aliases.
96    https://docs.bazel.build/versions/main/skylark/config.html#using-build-settings-on-the-command-line
97    Thus it is best to define both an "enabled" alias and a "disabled" alias.
98
99    Args:
100        name: string, the name of the flag to create and use for the config_settings
101        default: boolean, if the flag should default to on or off.
102    """
103
104    skylib_bool_flag(name = name, build_setting_default = default)
105    vis = ["//:__subpackages__"]
106
107    native.config_setting(
108        name = name + "_true",
109        flag_values = {
110            # The value must be a string, but it will be parsed to a boolean
111            # https://docs.bazel.build/versions/main/skylark/config.html#build-settings-and-select
112            ":" + name: "True",
113        },
114        visibility = vis,
115    )
116
117    native.config_setting(
118        name = name + "_false",
119        flag_values = {
120            ":" + name: "False",
121        },
122        visibility = vis,
123    )
124