summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/buckifier/targets_builder.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/rocksdb/buckifier/targets_builder.py')
-rw-r--r--src/rocksdb/buckifier/targets_builder.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/rocksdb/buckifier/targets_builder.py b/src/rocksdb/buckifier/targets_builder.py
new file mode 100644
index 000000000..343b2207d
--- /dev/null
+++ b/src/rocksdb/buckifier/targets_builder.py
@@ -0,0 +1,150 @@
+# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+try:
+ from builtins import object, str
+except ImportError:
+ from __builtin__ import object, str
+import pprint
+
+import targets_cfg
+
+
+def pretty_list(lst, indent=8):
+ if lst is None or len(lst) == 0:
+ return ""
+
+ if len(lst) == 1:
+ return '"%s"' % lst[0]
+
+ separator = '",\n%s"' % (" " * indent)
+ res = separator.join(sorted(lst))
+ res = "\n" + (" " * indent) + '"' + res + '",\n' + (" " * (indent - 4))
+ return res
+
+
+class TARGETSBuilder(object):
+ def __init__(self, path, extra_argv):
+ self.path = path
+ header = targets_cfg.rocksdb_target_header_template.format(
+ extra_argv=extra_argv
+ )
+ with open(path, "wb") as targets_file:
+ targets_file.write(header.encode("utf-8"))
+ self.total_lib = 0
+ self.total_bin = 0
+ self.total_test = 0
+ self.tests_cfg = ""
+
+ def add_library(
+ self,
+ name,
+ srcs,
+ deps=None,
+ headers=None,
+ extra_external_deps="",
+ link_whole=False,
+ external_dependencies=None,
+ extra_test_libs=False,
+ ):
+ if headers is not None:
+ headers = "[" + pretty_list(headers) + "]"
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ targets_cfg.library_template.format(
+ name=name,
+ srcs=pretty_list(srcs),
+ headers=headers,
+ deps=pretty_list(deps),
+ extra_external_deps=extra_external_deps,
+ link_whole=link_whole,
+ external_dependencies=pretty_list(external_dependencies),
+ extra_test_libs=extra_test_libs,
+ ).encode("utf-8")
+ )
+ self.total_lib = self.total_lib + 1
+
+ def add_rocksdb_library(self, name, srcs, headers=None, external_dependencies=None):
+ if headers is not None:
+ headers = "[" + pretty_list(headers) + "]"
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ targets_cfg.rocksdb_library_template.format(
+ name=name,
+ srcs=pretty_list(srcs),
+ headers=headers,
+ external_dependencies=pretty_list(external_dependencies),
+ ).encode("utf-8")
+ )
+ self.total_lib = self.total_lib + 1
+
+ def add_binary(
+ self,
+ name,
+ srcs,
+ deps=None,
+ extra_preprocessor_flags=None,
+ extra_bench_libs=False,
+ ):
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ targets_cfg.binary_template.format(
+ name=name,
+ srcs=pretty_list(srcs),
+ deps=pretty_list(deps),
+ extra_preprocessor_flags=pretty_list(extra_preprocessor_flags),
+ extra_bench_libs=extra_bench_libs,
+ ).encode("utf-8")
+ )
+ self.total_bin = self.total_bin + 1
+
+ def add_c_test(self):
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ b"""
+add_c_test_wrapper()
+"""
+ )
+
+ def add_test_header(self):
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ b"""
+ # Generate a test rule for each entry in ROCKS_TESTS
+ # Do not build the tests in opt mode, since SyncPoint and other test code
+ # will not be included.
+"""
+ )
+
+ def add_fancy_bench_config(
+ self,
+ name,
+ bench_config,
+ slow,
+ expected_runtime,
+ sl_iterations,
+ regression_threshold,
+ ):
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ targets_cfg.fancy_bench_template.format(
+ name=name,
+ bench_config=pprint.pformat(bench_config),
+ slow=slow,
+ expected_runtime=expected_runtime,
+ sl_iterations=sl_iterations,
+ regression_threshold=regression_threshold,
+ ).encode("utf-8")
+ )
+
+ def register_test(self, test_name, src, deps, extra_compiler_flags):
+ with open(self.path, "ab") as targets_file:
+ targets_file.write(
+ targets_cfg.unittests_template.format(
+ test_name=test_name,
+ test_cc=str(src),
+ deps=deps,
+ extra_compiler_flags=extra_compiler_flags,
+ ).encode("utf-8")
+ )
+ self.total_test = self.total_test + 1