prepare_jar_build.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import os
  2. import sys
  3. import argparse
  4. # Explicitly enable local imports
  5. # Don't forget to add imported scripts to inputs of the calling command!
  6. sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  7. import process_command_files as pcf
  8. import java_pack_to_file as jcov
  9. from autotar_gendirs import unpack_dir
  10. def writelines(f, rng):
  11. f.writelines(item + '\n' for item in rng)
  12. class SourcesSorter:
  13. FILE_ARG = 1
  14. RESOURCES_DIR_ARG = 2
  15. SRCDIR_ARG = 3
  16. JSOURCES_DIR_ARG = 4
  17. def __init__(self, moddir):
  18. self.moddir = moddir
  19. self.next_arg = SourcesSorter.FILE_ARG
  20. self.cur_resources_list_file = None
  21. self.cur_jsources_list_file = None
  22. self.cur_srcdir = None
  23. self.cur_resources = []
  24. self.cur_jsources = []
  25. def sort_args(self, remaining_args):
  26. for src in remaining_args:
  27. if self.next_arg == SourcesSorter.RESOURCES_DIR_ARG:
  28. assert self.cur_resources_list_file is None
  29. self.cur_resources_list_file = src
  30. self.next_arg = SourcesSorter.FILE_ARG
  31. continue
  32. elif self.next_arg == SourcesSorter.JSOURCES_DIR_ARG:
  33. assert self.cur_jsources_list_file is None
  34. self.cur_jsources_list_file = src
  35. self.next_arg = SourcesSorter.FILE_ARG
  36. continue
  37. elif self.next_arg == SourcesSorter.SRCDIR_ARG:
  38. assert self.cur_srcdir is None
  39. self.cur_srcdir = src if os.path.isabs(src) else os.path.join(self.moddir, src)
  40. self.next_arg = SourcesSorter.FILE_ARG
  41. continue
  42. if src == '--resources':
  43. if self.cur_resources_list_file is not None:
  44. with open(self.cur_resources_list_file, 'w') as f:
  45. writelines(f, self.cur_resources)
  46. self.cur_resources_list_file = None
  47. self.cur_srcdir = None
  48. self.cur_resources = []
  49. self.next_arg = SourcesSorter.RESOURCES_DIR_ARG
  50. continue
  51. if src == '--jsources':
  52. if self.cur_jsources_list_file is not None:
  53. with open(self.cur_jsources_list_file, 'w') as f:
  54. writelines(f, self.cur_jsources)
  55. self.cur_jsources_list_file = None
  56. self.cur_jsources = []
  57. self.next_arg = SourcesSorter.JSOURCES_DIR_ARG
  58. continue
  59. elif src == '--srcdir':
  60. self.next_arg = SourcesSorter.SRCDIR_ARG
  61. continue
  62. yield src
  63. if self.cur_resources_list_file is not None:
  64. with open(self.cur_resources_list_file, 'w') as f:
  65. writelines(f, self.cur_resources)
  66. if self.cur_jsources_list_file is not None:
  67. with open(self.cur_jsources_list_file, 'w') as f:
  68. writelines(f, self.cur_jsources)
  69. class SourcesConsumer:
  70. def __init__(self, source_root, with_kotlin, with_coverage):
  71. self.source_root = source_root
  72. self.with_kotlin = with_kotlin
  73. self.with_coverage = with_coverage
  74. self.java = []
  75. self.kotlin = []
  76. self.coverage = []
  77. def consume(self, src, sorter):
  78. if src.endswith(".java"):
  79. self.java.append(src)
  80. self.kotlin.append(src)
  81. self._add_rel_src_to_coverage(src)
  82. elif self.with_kotlin and src.endswith(".kt"):
  83. self.kotlin.append(src)
  84. self._add_rel_src_to_coverage(src)
  85. else:
  86. assert sorter.cur_srcdir is not None and sorter.cur_resources_list_file is not None
  87. sorter.cur_resources.append(os.path.relpath(src, sorter.cur_srcdir))
  88. if sorter.cur_jsources_list_file is not None:
  89. assert sorter.cur_srcdir is not None
  90. sorter.cur_jsources.append(os.path.relpath(src, sorter.cur_srcdir))
  91. def _add_rel_src_to_coverage(self, src):
  92. if not self.with_coverage or not self.source_root:
  93. return
  94. rel = os.path.relpath(src, self.source_root)
  95. if not rel.startswith('..' + os.path.sep):
  96. self.coverage.append(rel)
  97. def prepare_build_dirs(bindir, with_sources_jar):
  98. dirs = ['cls', 'misc']
  99. if with_sources_jar:
  100. dirs.append('src')
  101. for dir in [os.path.join(bindir, dirname) for dirname in dirs]:
  102. if not os.path.exists(dir):
  103. os.makedirs(dir)
  104. def main():
  105. args = pcf.get_args(sys.argv[1:])
  106. parser = argparse.ArgumentParser()
  107. parser.add_argument('--with-sources-jar', action='store_true')
  108. parser.add_argument('--moddir')
  109. parser.add_argument('--bindir')
  110. parser.add_argument('--java')
  111. parser.add_argument('--kotlin')
  112. parser.add_argument('--coverage')
  113. parser.add_argument('--source-root')
  114. args, remaining_args = parser.parse_known_args(args)
  115. prepare_build_dirs(args.bindir, args.with_sources_jar)
  116. src_sorter = SourcesSorter(args.moddir)
  117. src_consumer = SourcesConsumer(
  118. source_root=args.source_root,
  119. with_kotlin=True if args.kotlin else False,
  120. with_coverage=True if args.coverage else False)
  121. for src in src_sorter.sort_args(remaining_args):
  122. if src.endswith(".gentar"):
  123. unpack_dir(src, os.path.dirname(src))
  124. continue
  125. src_consumer.consume(src, src_sorter)
  126. if args.java:
  127. with open(args.java, 'w') as f:
  128. writelines(f, src_consumer.java)
  129. if args.kotlin:
  130. with open(args.kotlin, 'w') as f:
  131. writelines(f, src_consumer.kotlin)
  132. if args.coverage:
  133. jcov.write_coverage_sources(args.coverage, args.source_root, src_consumer.coverage)
  134. return 0
  135. if __name__ == '__main__':
  136. sys.exit(main())