| Colin Cross | 9b1aa0c | 2020-06-25 17:12:28 -0700 | [diff] [blame] | 1 | #!/usr/bin/env python3 | 
|  | 2 | # | 
|  | 3 | # Copyright 2018 Google Inc. All rights reserved. | 
|  | 4 | # | 
|  | 5 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 6 | # you may not use this file except in compliance with the License. | 
|  | 7 | # You may obtain a copy of the License at | 
|  | 8 | # | 
|  | 9 | #     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 10 | # | 
|  | 11 | # Unless required by applicable law or agreed to in writing, software | 
|  | 12 | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 14 | # See the License for the specific language governing permissions and | 
|  | 15 | # limitations under the License. | 
|  | 16 |  | 
|  | 17 | # Generates kotlinc module xml file to drive kotlinc | 
|  | 18 |  | 
|  | 19 | import argparse | 
|  | 20 | import os | 
|  | 21 |  | 
|  | 22 | from ninja_rsp import NinjaRspFileReader | 
|  | 23 |  | 
|  | 24 | def parse_args(): | 
|  | 25 | """Parse commandline arguments.""" | 
|  | 26 |  | 
|  | 27 | def convert_arg_line_to_args(arg_line): | 
|  | 28 | for arg in arg_line.split(): | 
|  | 29 | if arg.startswith('#'): | 
|  | 30 | return | 
|  | 31 | if not arg.strip(): | 
|  | 32 | continue | 
|  | 33 | yield arg | 
|  | 34 |  | 
|  | 35 | parser = argparse.ArgumentParser(fromfile_prefix_chars='@') | 
|  | 36 | parser.convert_arg_line_to_args = convert_arg_line_to_args | 
|  | 37 | parser.add_argument('--out', dest='out', | 
|  | 38 | help='file to which the module.xml contents will be written.') | 
|  | 39 | parser.add_argument('--classpath', dest='classpath', action='append', default=[], | 
|  | 40 | help='classpath to pass to kotlinc.') | 
|  | 41 | parser.add_argument('--name', dest='name', | 
|  | 42 | help='name of the module.') | 
|  | 43 | parser.add_argument('--out_dir', dest='out_dir', | 
|  | 44 | help='directory to which kotlinc will write output files.') | 
|  | 45 | parser.add_argument('--srcs', dest='srcs', action='append', default=[], | 
|  | 46 | help='file containing whitespace separated list of source files.') | 
|  | 47 | parser.add_argument('--common_srcs', dest='common_srcs', action='append', default=[], | 
|  | 48 | help='file containing whitespace separated list of common multiplatform source files.') | 
|  | 49 |  | 
|  | 50 | return parser.parse_args() | 
|  | 51 |  | 
|  | 52 | def main(): | 
|  | 53 | """Program entry point.""" | 
|  | 54 | args = parse_args() | 
|  | 55 |  | 
|  | 56 | if not args.out: | 
|  | 57 | raise RuntimeError('--out argument is required') | 
|  | 58 |  | 
|  | 59 | if not args.name: | 
|  | 60 | raise RuntimeError('--name argument is required') | 
|  | 61 |  | 
|  | 62 | with open(args.out, 'w') as f: | 
|  | 63 | # Print preamble | 
|  | 64 | f.write('<modules>\n') | 
|  | 65 | f.write('  <module name="%s" type="java-production" outputDir="%s">\n' % (args.name, args.out_dir or '')) | 
|  | 66 |  | 
|  | 67 | # Print classpath entries | 
|  | 68 | for c in args.classpath: | 
|  | 69 | for entry in c.split(':'): | 
|  | 70 | path = os.path.abspath(entry) | 
|  | 71 | f.write('    <classpath path="%s"/>\n' % path) | 
|  | 72 |  | 
|  | 73 | # For each rsp file, print source entries | 
|  | 74 | for rsp_file in args.srcs: | 
|  | 75 | for src in NinjaRspFileReader(rsp_file): | 
|  | 76 | path = os.path.abspath(src) | 
|  | 77 | if src.endswith('.java'): | 
|  | 78 | f.write('    <javaSourceRoots path="%s"/>\n' % path) | 
|  | 79 | elif src.endswith('.kt'): | 
|  | 80 | f.write('    <sources path="%s"/>\n' % path) | 
|  | 81 | else: | 
|  | 82 | raise RuntimeError('unknown source file type %s' % file) | 
|  | 83 |  | 
|  | 84 | for rsp_file in args.common_srcs: | 
|  | 85 | for src in NinjaRspFileReader(rsp_file): | 
|  | 86 | path = os.path.abspath(src) | 
|  | 87 | f.write('    <sources path="%s"/>\n' % path) | 
|  | 88 | f.write('    <commonSources path="%s"/>\n' % path) | 
|  | 89 |  | 
|  | 90 | f.write('  </module>\n') | 
|  | 91 | f.write('</modules>\n') | 
|  | 92 |  | 
|  | 93 | if __name__ == '__main__': | 
|  | 94 | main() |