1# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
2from __future__ import absolute_import
3from __future__ import division
4from __future__ import print_function
5from __future__ import unicode_literals
6try:
7    from builtins import object
8    from builtins import str
9except ImportError:
10    from __builtin__ import object
11    from __builtin__ import str
12import targets_cfg
13
14def pretty_list(lst, indent=8):
15    if lst is None or len(lst) == 0:
16        return ""
17
18    if len(lst) == 1:
19        return "\"%s\"" % lst[0]
20
21    separator = "\",\n%s\"" % (" " * indent)
22    res = separator.join(sorted(lst))
23    res = "\n" + (" " * indent) + "\"" + res + "\",\n" + (" " * (indent - 4))
24    return res
25
26
27class TARGETSBuilder(object):
28    def __init__(self, path):
29        self.path = path
30        self.targets_file = open(path, 'w')
31        self.targets_file.write(targets_cfg.rocksdb_target_header)
32        self.total_lib = 0
33        self.total_bin = 0
34        self.total_test = 0
35        self.tests_cfg = ""
36
37    def __del__(self):
38        self.targets_file.close()
39
40    def add_library(self, name, srcs, deps=None, headers=None):
41        headers_attr_prefix = ""
42        if headers is None:
43            headers_attr_prefix = "auto_"
44            headers = "AutoHeaders.RECURSIVE_GLOB"
45        self.targets_file.write(targets_cfg.library_template.format(
46            name=name,
47            srcs=pretty_list(srcs),
48            headers_attr_prefix=headers_attr_prefix,
49            headers=headers,
50            deps=pretty_list(deps)))
51        self.total_lib = self.total_lib + 1
52
53    def add_binary(self, name, srcs, deps=None):
54        self.targets_file.write(targets_cfg.binary_template % (
55            name,
56            pretty_list(srcs),
57            pretty_list(deps)))
58        self.total_bin = self.total_bin + 1
59
60    def register_test(self,
61                      test_name,
62                      src,
63                      is_parallel,
64                      extra_deps,
65                      extra_compiler_flags):
66        exec_mode = "serial"
67        if is_parallel:
68            exec_mode = "parallel"
69        self.tests_cfg += targets_cfg.test_cfg_template % (
70            test_name,
71            str(src),
72            str(exec_mode),
73            extra_deps,
74            extra_compiler_flags)
75
76        self.total_test = self.total_test + 1
77
78    def flush_tests(self):
79        self.targets_file.write(targets_cfg.unittests_template % self.tests_cfg)
80        self.tests_cfg = ""
81