targets_builder.py 2.4 KB

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