srpc.bzl 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. """
  2. Rules for building C++ srpc with Bazel.
  3. """
  4. load("@rules_cc//cc:defs.bzl", "cc_library")
  5. tool_path = ":srpc_generator"
  6. def srpc_cc_library(
  7. name,
  8. srcs,
  9. deps = [],
  10. type = "proto",
  11. out_prefix = "",
  12. visibility = None):
  13. output_directory = (
  14. ("$(@D)/%s" % (out_prefix)) if len(srcs) > 1 else ("$(@D)")
  15. )
  16. proto_output_headers = [
  17. (out_prefix + "%s.srpc.h") % (s.replace(".%s" % type, "").split("/")[-1])
  18. for s in srcs
  19. ]
  20. thrift_output_headers = [
  21. (out_prefix + "%s.thrift.h") % (s.replace(".%s" % type, "").split("/")[-1])
  22. for s in srcs
  23. ]
  24. if type == "thrift":
  25. output_headers = proto_output_headers + thrift_output_headers
  26. gen_proto = "thrift"
  27. if type == "proto":
  28. output_headers = proto_output_headers
  29. gen_proto = "protobuf"
  30. genrule_cmd = " ".join([
  31. "SRCS=($(SRCS));",
  32. "for f in $${SRCS[@]:0:%s}; do" % len(srcs),
  33. "$(location %s)" % (tool_path),
  34. " %s " % gen_proto,
  35. "$$f",
  36. output_directory + ";",
  37. "done",
  38. ])
  39. srcs_lib = "%s_srcs" % (name)
  40. native.genrule(
  41. name = srcs_lib,
  42. srcs = srcs,
  43. outs = output_headers,
  44. tools = [tool_path],
  45. cmd = genrule_cmd,
  46. output_to_bindir = True,
  47. message = "Generating srpc files for %s:" % (name),
  48. )
  49. runtime_deps = deps + [":srpc"]
  50. print(runtime_deps)
  51. cc_library(
  52. name = name,
  53. hdrs = [
  54. ":" + srcs_lib,
  55. ],
  56. srcs = [
  57. ":" + srcs_lib,
  58. ],
  59. features = [
  60. "-parse_headers",
  61. ],
  62. deps = runtime_deps,
  63. includes = [],
  64. linkstatic = 1,
  65. visibility = visibility,
  66. )