blob: 2e9eace7ed05fff638cfc1083609ef31f16a11e2 [file] [log] [blame]
load("//go:def.bzl", "GoArchive", "GoLibrary", "GoSource")
load("//proto:compiler.bzl", "GoProtoCompiler")
_proto_library_suffix = "proto"
_go_proto_library_suffix = "go_proto"
# NOTE: since protobuf 3.14, the WKTs no longer use these paths. They're only
# used by gogo below. Not clear if that actually works or if we should
# continue supporting gogo.
WELL_KNOWN_TYPE_PACKAGES = {
"any": ("github.com/golang/protobuf/ptypes/any", []),
"api": ("google.golang.org/genproto/protobuf/api", ["source_context", "type"]),
"compiler_plugin": ("github.com/golang/protobuf/protoc-gen-go/plugin", ["descriptor"]),
"descriptor": ("github.com/golang/protobuf/protoc-gen-go/descriptor", []),
"duration": ("github.com/golang/protobuf/ptypes/duration", []),
"empty": ("github.com/golang/protobuf/ptypes/empty", []),
"field_mask": ("google.golang.org/genproto/protobuf/field_mask", []),
"source_context": ("google.golang.org/genproto/protobuf/source_context", []),
"struct": ("github.com/golang/protobuf/ptypes/struct", []),
"timestamp": ("github.com/golang/protobuf/ptypes/timestamp", []),
"type": ("google.golang.org/genproto/protobuf/ptype", ["any", "source_context"]),
"wrappers": ("github.com/golang/protobuf/ptypes/wrappers", []),
}
GOGO_WELL_KNOWN_TYPE_REMAPS = [
"Mgoogle/protobuf/{}.proto=github.com/gogo/protobuf/types".format(wkt)
for wkt, (go_package, _) in WELL_KNOWN_TYPE_PACKAGES.items()
if "protoc-gen-go" not in go_package
] + [
"Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor",
"Mgoogle/protobuf/compiler_plugin.proto=github.com/gogo/protobuf/protoc-gen-gogo/plugin",
]
# NOTE: only used by gogo.
WELL_KNOWN_TYPE_RULES = {
wkt: Label("//proto/wkt:{}_{}".format(wkt, _go_proto_library_suffix))
for wkt in WELL_KNOWN_TYPE_PACKAGES.keys()
}
PROTO_RUNTIME_DEPS = [
"@com_github_golang_protobuf//proto:go_default_library",
"@org_golang_google_protobuf//proto:go_default_library",
"@org_golang_google_protobuf//reflect/protoreflect:go_default_library",
"@org_golang_google_protobuf//runtime/protoiface:go_default_library",
"@org_golang_google_protobuf//runtime/protoimpl:go_default_library",
]
# In protobuf 3.14, the 'option go_package' declarations were changed in the
# Well Known Types to point to the APIv2 packages below. Consequently, generated
# proto code will import APIv2 packages instead of the APIv1 packages, even
# when the APIv1 compiler is used (which is still the default).
#
# protobuf 3.14 is now the minimum supported version, so we no longer depend
# on the APIv1 packages.
WELL_KNOWN_TYPES_APIV2 = [
"@org_golang_google_protobuf//types/descriptorpb",
"@org_golang_google_protobuf//types/known/anypb",
"@org_golang_google_protobuf//types/known/apipb",
"@org_golang_google_protobuf//types/known/durationpb",
"@org_golang_google_protobuf//types/known/emptypb",
"@org_golang_google_protobuf//types/known/fieldmaskpb",
"@org_golang_google_protobuf//types/known/sourcecontextpb",
"@org_golang_google_protobuf//types/known/structpb",
"@org_golang_google_protobuf//types/known/timestamppb",
"@org_golang_google_protobuf//types/known/typepb",
"@org_golang_google_protobuf//types/known/wrapperspb",
"@org_golang_google_protobuf//types/pluginpb",
]
def _go_proto_wrapper_compile(go, compiler, protos, imports, importpath):
return []
def _go_proto_wrapper_impl(ctx):
return [
ctx.attr.library[GoLibrary],
ctx.attr.library[GoSource],
GoProtoCompiler(
deps = ctx.attr._deps,
compile = _go_proto_wrapper_compile,
valid_archive = True,
),
]
go_proto_wrapper = rule(
implementation = _go_proto_wrapper_impl,
attrs = {
"library": attr.label(
mandatory = True,
providers = [GoLibrary, GoSource],
),
"_deps": attr.label_list(
default = PROTO_RUNTIME_DEPS,
providers = [GoLibrary, GoSource, GoArchive],
),
},
)