targets_builder.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
  2. try:
  3. from builtins import object, str
  4. except ImportError:
  5. from __builtin__ import object, str
  6. import pprint
  7. import targets_cfg
  8. class LiteralValue:
  9. def __init__(self, value):
  10. self.value = value
  11. def __str__(self):
  12. return str(self.value)
  13. def smart_quote_value(val):
  14. if isinstance(val, LiteralValue):
  15. return str(val)
  16. return '"%s"' % val
  17. def pretty_list(lst, indent=8):
  18. if lst is None or len(lst) == 0:
  19. return ""
  20. if len(lst) == 1:
  21. return smart_quote_value(lst[0])
  22. separator = ',\n%s' % (" " * indent)
  23. res = separator.join(sorted(map(smart_quote_value, lst)))
  24. res = "\n" + (" " * indent) + res + ',\n' + (" " * (indent - 4))
  25. return res
  26. class TARGETSBuilder:
  27. def __init__(self, path, extra_argv):
  28. self.path = path
  29. header = targets_cfg.rocksdb_target_header_template.format(
  30. extra_argv=extra_argv
  31. )
  32. with open(path, "wb") as targets_file:
  33. targets_file.write(header.encode("utf-8"))
  34. self.total_lib = 0
  35. self.total_bin = 0
  36. self.total_test = 0
  37. self.tests_cfg = ""
  38. def add_library(
  39. self,
  40. name,
  41. srcs,
  42. deps=None,
  43. headers=None,
  44. extra_external_deps="",
  45. link_whole=False,
  46. external_dependencies=None,
  47. extra_test_libs=False,
  48. ):
  49. if headers is not None:
  50. if isinstance(headers, LiteralValue):
  51. headers = str(headers)
  52. else:
  53. headers = "[" + pretty_list(headers) + "]"
  54. else:
  55. headers = "[]"
  56. with open(self.path, "ab") as targets_file:
  57. targets_file.write(
  58. targets_cfg.library_template.format(
  59. name=name,
  60. srcs=pretty_list(srcs),
  61. headers=headers,
  62. deps=pretty_list(deps),
  63. extra_external_deps=extra_external_deps,
  64. link_whole=link_whole,
  65. external_dependencies=pretty_list(external_dependencies),
  66. extra_test_libs=extra_test_libs,
  67. ).encode("utf-8")
  68. )
  69. self.total_lib = self.total_lib + 1
  70. def add_rocksdb_library(self, name, srcs, headers=None, external_dependencies=None):
  71. headers = "[" + pretty_list(headers) + "]"
  72. with open(self.path, "ab") as targets_file:
  73. targets_file.write(
  74. targets_cfg.rocksdb_library_template.format(
  75. name=name,
  76. srcs=pretty_list(srcs),
  77. headers=headers,
  78. external_dependencies=pretty_list(external_dependencies),
  79. ).encode("utf-8")
  80. )
  81. self.total_lib = self.total_lib + 1
  82. def add_binary(
  83. self,
  84. name,
  85. srcs,
  86. deps=None,
  87. extra_preprocessor_flags=None,
  88. extra_bench_libs=False,
  89. ):
  90. with open(self.path, "ab") as targets_file:
  91. targets_file.write(
  92. targets_cfg.binary_template.format(
  93. name=name,
  94. srcs=pretty_list(srcs),
  95. deps=pretty_list(deps),
  96. extra_preprocessor_flags=pretty_list(extra_preprocessor_flags),
  97. extra_bench_libs=extra_bench_libs,
  98. ).encode("utf-8")
  99. )
  100. self.total_bin = self.total_bin + 1
  101. def add_c_test(self):
  102. with open(self.path, "ab") as targets_file:
  103. targets_file.write(
  104. b"""
  105. add_c_test_wrapper()
  106. """
  107. )
  108. def add_test_header(self):
  109. with open(self.path, "ab") as targets_file:
  110. targets_file.write(
  111. b"""
  112. # Generate a test rule for each entry in ROCKS_TESTS
  113. # Do not build the tests in opt mode, since SyncPoint and other test code
  114. # will not be included.
  115. """
  116. )
  117. def add_fancy_bench_config(
  118. self,
  119. name,
  120. bench_config,
  121. slow,
  122. expected_runtime,
  123. sl_iterations,
  124. regression_threshold,
  125. ):
  126. with open(self.path, "ab") as targets_file:
  127. targets_file.write(
  128. targets_cfg.fancy_bench_template.format(
  129. name=name,
  130. bench_config=pprint.pformat(bench_config),
  131. slow=slow,
  132. expected_runtime=expected_runtime,
  133. sl_iterations=sl_iterations,
  134. regression_threshold=regression_threshold,
  135. ).encode("utf-8")
  136. )
  137. def register_test(self, test_name, src, deps, extra_compiler_flags):
  138. with open(self.path, "ab") as targets_file:
  139. targets_file.write(
  140. targets_cfg.unittests_template.format(
  141. test_name=test_name,
  142. test_cc=str(src),
  143. deps=deps,
  144. extra_compiler_flags=extra_compiler_flags,
  145. ).encode("utf-8")
  146. )
  147. self.total_test = self.total_test + 1
  148. def export_file(self, name):
  149. with open(self.path, "a") as targets_file:
  150. targets_file.write(
  151. targets_cfg.export_file_template.format(name=name)
  152. )