| 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], |
| ), |
| }, |
| ) |