1#!/usr/bin/env python 2# Copyright 2017 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6 7import argparse 8import os 9import string 10import sys 11 12from util import build_utils 13 14SCRIPT_TEMPLATE = string.Template("""\ 15#!/usr/bin/env python 16# 17# This file was generated by build/android/gyp/create_apk_operations_script.py 18 19import os 20import sys 21 22def main(): 23 script_directory = os.path.dirname(__file__) 24 resolve = lambda p: p if p is None else os.path.abspath(os.path.join( 25 script_directory, p)) 26 sys.path.append(resolve(${APK_OPERATIONS_DIR})) 27 import apk_operations 28 output_dir = resolve(${OUTPUT_DIR}) 29 try: 30 apk_operations.Run( 31 output_dir, 32 resolve(${APK_PATH}), 33 [resolve(p) for p in ${ADDITIONAL_APK_PATHS}], 34 resolve(${INC_JSON_PATH}), 35 ${FLAGS_FILE}, 36 ${TARGET_CPU}, 37 resolve(${MAPPING_PATH})) 38 except TypeError: 39 rel_output_dir = os.path.relpath(output_dir) 40 rel_script_path = os.path.relpath(sys.argv[0], output_dir) 41 sys.stderr.write('Script out-of-date. Rebuild via:\\n') 42 sys.stderr.write(' ninja -C %s %s\\n' % (rel_output_dir, rel_script_path)) 43 return 1 44 45 46if __name__ == '__main__': 47 sys.exit(main()) 48""") 49 50 51def main(args): 52 args = build_utils.ExpandFileArgs(args) 53 parser = argparse.ArgumentParser() 54 parser.add_argument('--script-output-path', 55 help='Output path for executable script.') 56 parser.add_argument('--apk-path') 57 parser.add_argument('--incremental-install-json-path') 58 parser.add_argument('--command-line-flags-file') 59 parser.add_argument('--target-cpu') 60 parser.add_argument( 61 '--additional-apk-path', 62 action='append', 63 dest='additional_apk_paths', 64 default=[], 65 help='Paths to APKs to be installed prior to --apk-path.') 66 parser.add_argument('--proguard-mapping-path') 67 args = parser.parse_args(args) 68 69 def relativize(path): 70 """Returns the path relative to the output script directory.""" 71 if path is None: 72 return path 73 return os.path.relpath(path, os.path.dirname(args.script_output_path)) 74 apk_operations_dir = os.path.join(os.path.dirname(__file__), os.path.pardir) 75 apk_operations_dir = relativize(apk_operations_dir) 76 77 with open(args.script_output_path, 'w') as script: 78 script_dict = { 79 'APK_OPERATIONS_DIR': repr(apk_operations_dir), 80 'OUTPUT_DIR': repr(relativize('.')), 81 'APK_PATH': repr(relativize(args.apk_path)), 82 'ADDITIONAL_APK_PATHS': 83 [relativize(p) for p in args.additional_apk_paths], 84 'INC_JSON_PATH': repr(relativize(args.incremental_install_json_path)), 85 'MAPPING_PATH': repr(relativize(args.proguard_mapping_path)), 86 'FLAGS_FILE': repr(args.command_line_flags_file), 87 'TARGET_CPU': repr(args.target_cpu), 88 } 89 script.write(SCRIPT_TEMPLATE.substitute(script_dict)) 90 os.chmod(args.script_output_path, 0750) 91 return 0 92 93 94if __name__ == '__main__': 95 sys.exit(main(sys.argv[1:])) 96