1#!/usr/bin/env python3 2# 3# Copyright 2014 The Chromium Authors 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Invokes Android's aidl 8""" 9 10import optparse 11import os 12import re 13import sys 14import zipfile 15 16from util import build_utils 17import action_helpers # build_utils adds //build to sys.path. 18import zip_helpers 19 20 21def main(argv): 22 option_parser = optparse.OptionParser() 23 option_parser.add_option('--aidl-path', help='Path to the aidl binary.') 24 option_parser.add_option('--imports', help='Files to import.') 25 option_parser.add_option('--includes', 26 help='Directories to add as import search paths.') 27 option_parser.add_option('--srcjar', help='Path for srcjar output.') 28 action_helpers.add_depfile_arg(option_parser) 29 options, args = option_parser.parse_args(argv[1:]) 30 31 options.includes = action_helpers.parse_gn_list(options.includes) 32 33 with build_utils.TempDir() as temp_dir: 34 for f in args: 35 classname = os.path.splitext(os.path.basename(f))[0] 36 output = os.path.join(temp_dir, classname + '.java') 37 aidl_cmd = [options.aidl_path] 38 aidl_cmd += [ 39 '-p' + s for s in action_helpers.parse_gn_list(options.imports) 40 ] 41 aidl_cmd += ['-I' + s for s in options.includes] 42 aidl_cmd += [ 43 f, 44 output 45 ] 46 build_utils.CheckOutput(aidl_cmd) 47 48 with action_helpers.atomic_output(options.srcjar) as f: 49 with zipfile.ZipFile(f, 'w') as srcjar: 50 for path in build_utils.FindInDirectory(temp_dir, '*.java'): 51 with open(path) as fileobj: 52 data = fileobj.read() 53 pkg_name = re.search(r'^\s*package\s+(.*?)\s*;', data, re.M).group(1) 54 arcname = '%s/%s' % ( 55 pkg_name.replace('.', '/'), os.path.basename(path)) 56 zip_helpers.add_to_zip_hermetic(srcjar, arcname, data=data) 57 58 if options.depfile: 59 include_files = [] 60 for include_dir in options.includes: 61 include_files += build_utils.FindInDirectory(include_dir, '*.java') 62 action_helpers.write_depfile(options.depfile, options.srcjar, include_files) 63 64 65if __name__ == '__main__': 66 sys.exit(main(sys.argv)) 67