api_build_system.bzl 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. load("@rules_cc//cc:defs.bzl", "cc_test")
  2. load("@com_envoyproxy_protoc_gen_validate//bazel:pgv_proto_library.bzl", "pgv_cc_proto_library")
  3. load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library")
  4. load("@com_google_protobuf//:protobuf.bzl", _py_proto_library = "py_proto_library")
  5. load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
  6. load("@io_bazel_rules_go//go:def.bzl", "go_test")
  7. load("@rules_proto//proto:defs.bzl", "proto_library")
  8. load(
  9. "//bazel:external_proto_deps.bzl",
  10. "EXTERNAL_PROTO_CC_BAZEL_DEP_MAP",
  11. "EXTERNAL_PROTO_GO_BAZEL_DEP_MAP",
  12. "EXTERNAL_PROTO_PY_BAZEL_DEP_MAP",
  13. )
  14. _PY_PROTO_SUFFIX = "_py_proto"
  15. _CC_PROTO_SUFFIX = "_cc_proto"
  16. _CC_GRPC_SUFFIX = "_cc_grpc"
  17. _GO_PROTO_SUFFIX = "_go_proto"
  18. _GO_IMPORTPATH_PREFIX = "github.com/envoyproxy/go-control-plane/"
  19. _COMMON_PROTO_DEPS = [
  20. "@com_google_protobuf//:any_proto",
  21. "@com_google_protobuf//:descriptor_proto",
  22. "@com_google_protobuf//:duration_proto",
  23. "@com_google_protobuf//:empty_proto",
  24. "@com_google_protobuf//:struct_proto",
  25. "@com_google_protobuf//:timestamp_proto",
  26. "@com_google_protobuf//:wrappers_proto",
  27. "@com_google_googleapis//google/api:http_proto",
  28. "@com_google_googleapis//google/api:httpbody_proto",
  29. "@com_google_googleapis//google/api:annotations_proto",
  30. "@com_google_googleapis//google/rpc:status_proto",
  31. "@com_envoyproxy_protoc_gen_validate//validate:validate_proto",
  32. ]
  33. def _proto_mapping(dep, proto_dep_map, proto_suffix):
  34. mapped = proto_dep_map.get(dep)
  35. if mapped == None:
  36. prefix = "@" + Label(dep).workspace_name if not dep.startswith("//") else ""
  37. return prefix + "//" + Label(dep).package + ":" + Label(dep).name + proto_suffix
  38. return mapped
  39. def _go_proto_mapping(dep):
  40. return _proto_mapping(dep, EXTERNAL_PROTO_GO_BAZEL_DEP_MAP, _GO_PROTO_SUFFIX)
  41. def _cc_proto_mapping(dep):
  42. return _proto_mapping(dep, EXTERNAL_PROTO_CC_BAZEL_DEP_MAP, _CC_PROTO_SUFFIX)
  43. def _py_proto_mapping(dep):
  44. return _proto_mapping(dep, EXTERNAL_PROTO_PY_BAZEL_DEP_MAP, _PY_PROTO_SUFFIX)
  45. # TODO(htuch): Convert this to native py_proto_library once
  46. # https://github.com/bazelbuild/bazel/issues/3935 and/or
  47. # https://github.com/bazelbuild/bazel/issues/2626 are resolved.
  48. def _api_py_proto_library(name, srcs = [], deps = []):
  49. _py_proto_library(
  50. name = name + _PY_PROTO_SUFFIX,
  51. srcs = srcs,
  52. default_runtime = "@com_google_protobuf//:protobuf_python",
  53. protoc = "@com_google_protobuf//:protoc",
  54. deps = [_py_proto_mapping(dep) for dep in deps] + [
  55. "@com_envoyproxy_protoc_gen_validate//validate:validate_py",
  56. "@com_google_googleapis//google/rpc:status_py_proto",
  57. "@com_google_googleapis//google/api:annotations_py_proto",
  58. "@com_google_googleapis//google/api:http_py_proto",
  59. "@com_google_googleapis//google/api:httpbody_py_proto",
  60. ],
  61. visibility = ["//visibility:public"],
  62. )
  63. # This defines googleapis py_proto_library. The repository does not provide its definition and requires
  64. # overriding it in the consuming project (see https://github.com/grpc/grpc/issues/19255 for more details).
  65. def py_proto_library(name, deps = [], plugin = None):
  66. srcs = [dep[:-6] + ".proto" if dep.endswith("_proto") else dep for dep in deps]
  67. proto_deps = []
  68. # py_proto_library in googleapis specifies *_proto rules in dependencies.
  69. # By rewriting *_proto to *.proto above, the dependencies in *_proto rules are not preserved.
  70. # As a workaround, manually specify the proto dependencies for the imported python rules.
  71. if name == "annotations_py_proto":
  72. proto_deps = proto_deps + [":http_py_proto"]
  73. # checked.proto depends on syntax.proto, we have to add this dependency manually as well.
  74. if name == "checked_py_proto":
  75. proto_deps = proto_deps + [":syntax_py_proto"]
  76. # py_proto_library does not support plugin as an argument yet at gRPC v1.25.0:
  77. # https://github.com/grpc/grpc/blob/v1.25.0/bazel/python_rules.bzl#L72.
  78. # plugin should also be passed in here when gRPC version is greater than v1.25.x.
  79. _py_proto_library(
  80. name = name,
  81. srcs = srcs,
  82. default_runtime = "@com_google_protobuf//:protobuf_python",
  83. protoc = "@com_google_protobuf//:protoc",
  84. deps = proto_deps + ["@com_google_protobuf//:protobuf_python"],
  85. visibility = ["//visibility:public"],
  86. )
  87. def _api_cc_grpc_library(name, proto, deps = []):
  88. cc_grpc_library(
  89. name = name,
  90. srcs = [proto],
  91. deps = deps,
  92. proto_only = False,
  93. grpc_only = True,
  94. visibility = ["//visibility:public"],
  95. )
  96. def api_cc_py_proto_library(
  97. name,
  98. visibility = ["//visibility:private"],
  99. srcs = [],
  100. deps = [],
  101. linkstatic = 0,
  102. has_services = 0):
  103. relative_name = ":" + name
  104. proto_library(
  105. name = name,
  106. srcs = srcs,
  107. deps = deps + _COMMON_PROTO_DEPS,
  108. visibility = visibility,
  109. )
  110. cc_proto_library_name = name + _CC_PROTO_SUFFIX
  111. pgv_cc_proto_library(
  112. name = cc_proto_library_name,
  113. linkstatic = linkstatic,
  114. cc_deps = [_cc_proto_mapping(dep) for dep in deps] + [
  115. "@com_google_googleapis//google/api:http_cc_proto",
  116. "@com_google_googleapis//google/api:httpbody_cc_proto",
  117. "@com_google_googleapis//google/api:annotations_cc_proto",
  118. "@com_google_googleapis//google/rpc:status_cc_proto",
  119. ],
  120. deps = [relative_name],
  121. visibility = ["//visibility:public"],
  122. )
  123. _api_py_proto_library(name, srcs, deps)
  124. # Optionally define gRPC services
  125. if has_services:
  126. # TODO: when Python services are required, add to the below stub generations.
  127. cc_grpc_name = name + _CC_GRPC_SUFFIX
  128. cc_proto_deps = [cc_proto_library_name] + [_cc_proto_mapping(dep) for dep in deps]
  129. _api_cc_grpc_library(name = cc_grpc_name, proto = relative_name, deps = cc_proto_deps)
  130. def api_cc_test(name, **kwargs):
  131. cc_test(
  132. name = name,
  133. **kwargs
  134. )
  135. def api_go_test(name, **kwargs):
  136. go_test(
  137. name = name,
  138. **kwargs
  139. )
  140. def api_proto_package(
  141. name = "pkg",
  142. srcs = [],
  143. deps = [],
  144. has_services = False,
  145. visibility = ["//visibility:public"]):
  146. if srcs == []:
  147. srcs = native.glob(["*.proto"])
  148. name = "pkg"
  149. api_cc_py_proto_library(
  150. name = name,
  151. visibility = visibility,
  152. srcs = srcs,
  153. deps = deps,
  154. has_services = has_services,
  155. )
  156. compilers = ["@io_bazel_rules_go//proto:go_proto", "@envoy_api//bazel:pgv_plugin_go"]
  157. if has_services:
  158. compilers = ["@io_bazel_rules_go//proto:go_grpc", "@envoy_api//bazel:pgv_plugin_go"]
  159. # Because RBAC proro depends on googleapis syntax.proto and checked.proto,
  160. # which share the same go proto library, it causes duplicative dependencies.
  161. # Thus, we use depset().to_list() to remove duplicated depenencies.
  162. go_proto_library(
  163. name = name + _GO_PROTO_SUFFIX,
  164. compilers = compilers,
  165. importpath = _GO_IMPORTPATH_PREFIX + native.package_name(),
  166. proto = name,
  167. visibility = ["//visibility:public"],
  168. deps = depset([_go_proto_mapping(dep) for dep in deps] + [
  169. "@com_envoyproxy_protoc_gen_validate//validate:go_default_library",
  170. "@com_github_golang_protobuf//ptypes:go_default_library_gen",
  171. "@go_googleapis//google/api:annotations_go_proto",
  172. "@go_googleapis//google/rpc:status_go_proto",
  173. "@io_bazel_rules_go//proto/wkt:any_go_proto",
  174. "@io_bazel_rules_go//proto/wkt:duration_go_proto",
  175. "@io_bazel_rules_go//proto/wkt:struct_go_proto",
  176. "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
  177. "@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
  178. ]).to_list(),
  179. )