api_build_system.bzl 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. load("@com_envoyproxy_protoc_gen_validate//bazel:pgv_proto_library.bzl", "pgv_cc_proto_library")
  2. load("@com_google_protobuf//:protobuf.bzl", _py_proto_library = "py_proto_library")
  3. load("@io_bazel_rules_go//go:def.bzl", "go_test")
  4. load("@io_bazel_rules_go//proto:def.bzl", "go_grpc_library", "go_proto_library")
  5. load("@rules_proto//proto:defs.bzl", "proto_library")
  6. _PY_PROTO_SUFFIX = "_py_proto"
  7. _CC_PROTO_SUFFIX = "_cc_proto"
  8. _CC_GRPC_SUFFIX = "_cc_grpc"
  9. _GO_PROTO_SUFFIX = "_go_proto"
  10. _GO_IMPORTPATH_PREFIX = "github.com/cncf/xds/go/"
  11. _COMMON_PROTO_DEPS = [
  12. "@com_google_protobuf//:any_proto",
  13. "@com_google_protobuf//:descriptor_proto",
  14. "@com_google_protobuf//:duration_proto",
  15. "@com_google_protobuf//:empty_proto",
  16. "@com_google_protobuf//:struct_proto",
  17. "@com_google_protobuf//:timestamp_proto",
  18. "@com_google_protobuf//:wrappers_proto",
  19. "@com_google_googleapis//google/api:http_proto",
  20. "@com_google_googleapis//google/api:annotations_proto",
  21. "@com_google_googleapis//google/rpc:status_proto",
  22. "@com_envoyproxy_protoc_gen_validate//validate:validate_proto",
  23. ]
  24. def _proto_mapping(dep, proto_suffix):
  25. prefix = "@" + Label(dep).workspace_name if not dep.startswith("//") else ""
  26. return prefix + "//" + Label(dep).package + ":" + Label(dep).name + proto_suffix
  27. def _go_proto_mapping(dep):
  28. return _proto_mapping(dep, _GO_PROTO_SUFFIX)
  29. def _cc_proto_mapping(dep):
  30. return _proto_mapping(dep, _CC_PROTO_SUFFIX)
  31. def _py_proto_mapping(dep):
  32. return _proto_mapping(dep, _PY_PROTO_SUFFIX)
  33. # TODO(htuch): Convert this to native py_proto_library once
  34. # https://github.com/bazelbuild/bazel/issues/3935 and/or
  35. # https://github.com/bazelbuild/bazel/issues/2626 are resolved.
  36. def _xds_py_proto_library(name, srcs = [], deps = []):
  37. _py_proto_library(
  38. name = name + _PY_PROTO_SUFFIX,
  39. srcs = srcs,
  40. default_runtime = "@com_google_protobuf//:protobuf_python",
  41. protoc = "@com_google_protobuf//:protoc",
  42. deps = [_py_proto_mapping(dep) for dep in deps] + [
  43. "@com_envoyproxy_protoc_gen_validate//validate:validate_py",
  44. "@com_google_googleapis//google/rpc:status_py_proto",
  45. "@com_google_googleapis//google/api:annotations_py_proto",
  46. "@com_google_googleapis//google/api:http_py_proto",
  47. "@com_google_googleapis//google/api:httpbody_py_proto",
  48. ],
  49. visibility = ["//visibility:public"],
  50. )
  51. # This defines googleapis py_proto_library. The repository does not provide its definition and requires
  52. # overriding it in the consuming project (see https://github.com/grpc/grpc/issues/19255 for more details).
  53. def py_proto_library(name, deps = []):
  54. srcs = [dep[:-6] + ".proto" if dep.endswith("_proto") else dep for dep in deps]
  55. proto_deps = []
  56. # py_proto_library in googleapis specifies *_proto rules in dependencies.
  57. # By rewriting *_proto to *.proto above, the dependencies in *_proto rules are not preserved.
  58. # As a workaround, manually specify the proto dependencies for the imported python rules.
  59. if name == "annotations_py_proto":
  60. proto_deps = proto_deps + [":http_py_proto"]
  61. _py_proto_library(
  62. name = name,
  63. srcs = srcs,
  64. default_runtime = "@com_google_protobuf//:protobuf_python",
  65. protoc = "@com_google_protobuf//:protoc",
  66. deps = proto_deps + ["@com_google_protobuf//:protobuf_python"],
  67. visibility = ["//visibility:public"],
  68. )
  69. def _xds_cc_py_proto_library(
  70. name,
  71. visibility = ["//visibility:private"],
  72. srcs = [],
  73. deps = [],
  74. linkstatic = 0,
  75. has_services = 0):
  76. relative_name = ":" + name
  77. proto_library(
  78. name = name,
  79. srcs = srcs,
  80. deps = deps + _COMMON_PROTO_DEPS,
  81. visibility = visibility,
  82. )
  83. cc_proto_library_name = name + _CC_PROTO_SUFFIX
  84. pgv_cc_proto_library(
  85. name = cc_proto_library_name,
  86. linkstatic = linkstatic,
  87. cc_deps = [_cc_proto_mapping(dep) for dep in deps] + [
  88. "@com_google_googleapis//google/api:http_cc_proto",
  89. "@com_google_googleapis//google/api:httpbody_cc_proto",
  90. "@com_google_googleapis//google/api:annotations_cc_proto",
  91. "@com_google_googleapis//google/rpc:status_cc_proto",
  92. ],
  93. deps = [relative_name],
  94. visibility = ["//visibility:public"],
  95. )
  96. _xds_py_proto_library(name, srcs, deps)
  97. # Optionally define gRPC services
  98. if has_services:
  99. # TODO: neither C++ or Python service generation is supported today, follow the Envoy example to implementthis.
  100. pass
  101. def xds_proto_package(srcs = [], deps = [], has_services = False, visibility = ["//visibility:public"]):
  102. if srcs == []:
  103. srcs = native.glob(["*.proto"])
  104. name = "pkg"
  105. _xds_cc_py_proto_library(
  106. name = name,
  107. visibility = visibility,
  108. srcs = srcs,
  109. deps = deps,
  110. has_services = has_services,
  111. )
  112. compilers = ["@io_bazel_rules_go//proto:go_proto", "//bazel:pgv_plugin_go"]
  113. if has_services:
  114. compilers = ["@io_bazel_rules_go//proto:go_grpc", "//bazel:pgv_plugin_go"]
  115. go_proto_library(
  116. name = name + _GO_PROTO_SUFFIX,
  117. compilers = compilers,
  118. importpath = _GO_IMPORTPATH_PREFIX + native.package_name(),
  119. proto = name,
  120. visibility = ["//visibility:public"],
  121. deps = [_go_proto_mapping(dep) for dep in deps] + [
  122. "@com_envoyproxy_protoc_gen_validate//validate:go_default_library",
  123. "@com_github_golang_protobuf//ptypes:go_default_library_gen",
  124. "@go_googleapis//google/api:annotations_go_proto",
  125. "@go_googleapis//google/rpc:status_go_proto",
  126. "@io_bazel_rules_go//proto/wkt:any_go_proto",
  127. "@io_bazel_rules_go//proto/wkt:duration_go_proto",
  128. "@io_bazel_rules_go//proto/wkt:struct_go_proto",
  129. "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
  130. "@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
  131. ],
  132. )
  133. def xds_cc_test(name, **kwargs):
  134. native.cc_test(
  135. name = name,
  136. **kwargs
  137. )
  138. def xds_go_test(name, **kwargs):
  139. go_test(
  140. name = name,
  141. **kwargs
  142. )
  143. # Old names for backward compatibility.
  144. # TODO(roth): Remove these once all callers are migrated to the new names.
  145. def udpa_proto_package(srcs = [], deps = [], has_services = False, visibility = ["//visibility:public"]):
  146. xds_proto_package(srcs=srcs, deps=deps, has_services=has_services, visibility=visibility)
  147. def udpa_cc_test(name, **kwargs):
  148. xds_cc_test(name, **kwargs)
  149. def udpa_go_test(name, **kwargs):
  150. xds_go_test(name, **kwargs)