| """ | |
| THIS IS THE EXTERNAL-ONLY VERSION OF THIS FILE. G3 HAS ITS OWN. | |
| This file contains helpers for defining build flags and options that are used to | |
| configure the Skia build. | |
| """ | |
| load("@bazel_skylib//lib:selects.bzl", _selects = "selects") | |
| # https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl | |
| load("@bazel_skylib//rules:common_settings.bzl", "string_flag", skylib_bool_flag = "bool_flag") | |
| # Re-export other symbols from bazel_skylib for convenience | |
| selects = _selects | |
| # Forked from https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl | |
| BuildSettingInfo = provider( | |
| doc = "A singleton provider that contains the raw value of a multi-string build setting", | |
| fields = ["values"], | |
| ) | |
| def _multi_string_impl(ctx): | |
| allowed_values = ctx.attr.values | |
| values = ctx.build_setting_value | |
| for v in values: | |
| if v not in ctx.attr.values: | |
| fail("Error setting " + str(ctx.label) + ": invalid value '" + v + "'. Allowed values are " + str(allowed_values)) | |
| return BuildSettingInfo(values = values) | |
| multi_string_flag = rule( | |
| implementation = _multi_string_impl, | |
| # https://bazel.build/rules/lib/config#string_list | |
| build_setting = config.string_list(flag = True, repeatable = True), | |
| attrs = { | |
| "values": attr.string_list( | |
| doc = "The list of allowed values for this setting. An error is raised if any other values are given.", | |
| ), | |
| }, | |
| doc = "A string-typed build setting that can be set multiple times on the command line", | |
| ) | |
| def string_flag_with_values(name, values, default = "", multiple = False): | |
| """Create a string flag and corresponding config_settings. | |
| string_flag_with_values is a Bazel Macro that defines a flag with the given name and a set | |
| of valid values for that flag. For each value, a config_setting is defined with the name | |
| of the value, associated with the created flag. | |
| This is defined to make the BUILD.bazel file easier to read w/o the boilerplate of defining | |
| a string_flag rule and n config_settings | |
| https://docs.bazel.build/versions/main/skylark/macros.html | |
| Args: | |
| name: string, the name of the flag to create and use for the config_settings | |
| values: list of strings, the valid values for this flag to be set to. | |
| default: string, whatever the default value should be if the flag is not set. Can be | |
| empty string for both a string_flag and a multi_string flag. | |
| multiple: boolean, True if the flag should be able to be set multiple times on the CLI. | |
| """ | |
| if multiple: | |
| multi_string_flag( | |
| name = name, | |
| # We have to specify a default value, even if that value is empty string. | |
| # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings | |
| build_setting_default = [default], | |
| # We need to make sure empty string (the default) is in the list of acceptable values. | |
| values = values + [""], | |
| ) | |
| else: | |
| string_flag( | |
| name = name, | |
| # We have to specify a default value, even if that value is empty string. | |
| # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings | |
| build_setting_default = default, | |
| # We need to make sure empty string (the default) is in the list of acceptable values. | |
| values = values + [""], | |
| ) | |
| # For each of the values given, we define a config_setting. This allows us to use | |
| # select statements, on the given setting, e.g. referencing | |
| # //bazel/common_config_settings:some_valid_value_for_a_flag | |
| for v in values: | |
| native.config_setting( | |
| name = v, | |
| flag_values = { | |
| ":" + name: v, | |
| }, | |
| visibility = ["//:__subpackages__"], | |
| ) | |
| def bool_flag(name, default): | |
| """Create a boolean flag and corresponding config_settings. | |
| bool_flag is a Bazel Macro that defines a boolean flag with the given name two config_settings, | |
| one for True, one for False. Reminder that Bazel has special syntax for unsetting boolean flags, | |
| but this does not work well with aliases. | |
| https://docs.bazel.build/versions/main/skylark/config.html#using-build-settings-on-the-command-line | |
| Thus it is best to define both an "enabled" alias and a "disabled" alias. | |
| Args: | |
| name: string, the name of the flag to create and use for the config_settings | |
| default: boolean, if the flag should default to on or off. | |
| """ | |
| skylib_bool_flag(name = name, build_setting_default = default) | |
| vis = ["//:__subpackages__"] | |
| native.config_setting( | |
| name = name + "_true", | |
| flag_values = { | |
| # The value must be a string, but it will be parsed to a boolean | |
| # https://docs.bazel.build/versions/main/skylark/config.html#build-settings-and-select | |
| ":" + name: "True", | |
| }, | |
| visibility = vis, | |
| ) | |
| native.config_setting( | |
| name = name + "_false", | |
| flag_values = { | |
| ":" + name: "False", | |
| }, | |
| visibility = vis, | |
| ) |