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