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