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