blob: b0ab900d5989ade90a47ae7e394b336610761cf9 [file] [log] [blame]
"""An indirection layer for referencing flags whether they are native or defined in Starlark."""
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
visibility([
"//third_party/grpc/bazel",
"//bazel/flags",
"//bazel/private/...",
])
# Maps flag names to their native reference
_FLAGS = {
"protocopt": struct(
native = lambda ctx: getattr(ctx.fragments.proto, "experimental_protoc_opts"),
default = [],
),
"experimental_proto_descriptor_sets_include_source_info": struct(
native = lambda ctx: getattr(ctx.attr, "_experimental_proto_descriptor_sets_include_source_info_native")[BuildSettingInfo].value,
default = False,
),
"proto_compiler": struct(native = lambda ctx: getattr(ctx.attr, "_proto_compiler_native")[BuildSettingInfo].value, default = "@bazel_tools//tools/proto:protoc"),
"strict_proto_deps": struct(
native = lambda ctx: getattr(ctx.attr, "_strict_proto_deps_native")[BuildSettingInfo].value,
default = "error",
),
"strict_public_imports": struct(
native = lambda ctx: getattr(ctx.attr, "_strict_public_imports_native")[BuildSettingInfo].value,
default = "off",
),
"cc_proto_library_header_suffixes": struct(
native = lambda ctx: getattr(ctx.fragments.proto, "cc_proto_library_header_suffixes"),
default = [".pb.h"],
),
"cc_proto_library_source_suffixes": struct(
native = lambda ctx: getattr(ctx.fragments.proto, "cc_proto_library_source_suffixes"),
default = [".pb.cc"],
),
"proto_toolchain_for_java": struct(
native = lambda ctx: getattr(ctx.attr, "_aspect_java_proto_toolchain"),
default = "@bazel_tools//tools/proto:java_toolchain",
),
"proto_toolchain_for_javalite": struct(
native = lambda ctx: getattr(ctx.attr, "_aspect_proto_toolchain_for_javalite"),
default = "@bazel_tools//tools/proto:javalite_toolchain",
),
"proto_toolchain_for_cc": struct(
native = lambda ctx: getattr(ctx.attr, "_aspect_cc_proto_toolchain"),
default = "@bazel_tools//tools/proto:cc_toolchain",
),
}
def get_flag_value(ctx, flag_name):
"""Returns the value of the given flag in Starlark if it's set, otherwise reads the Java flag value, if the proto fragment exists.
Args:
ctx: The rule context.
flag_name: The name of the flag to get the value for.
Returns:
The value of the flag.
"""
# We probably got here from toolchains.find_toolchain. Leave the attribute alone.
if flag_name not in _FLAGS:
return getattr(ctx.attr, "_" + flag_name)
starlark_flag = getattr(ctx.attr, "_" + flag_name)
# Label flags don't have a BuildSettingInfo, just get the value.
if "toolchain" in flag_name:
starlark_flag_is_set = starlark_flag.label != _FLAGS[flag_name].default
starlark_value = starlark_flag
else:
starlark_flag_is_set = starlark_flag[BuildSettingInfo].value != _FLAGS[flag_name].default
starlark_value = starlark_flag[BuildSettingInfo].value
# Starlark flags take precedence over native flags.
# Also of course, use the Starlark value if the proto fragment no longer exists.
if starlark_flag_is_set or not hasattr(ctx.fragments, "proto"):
return starlark_value
else:
return _FLAGS[flag_name].native(ctx)