summaryrefslogtreecommitdiffstats
path: root/chromium/build/android/gyp/create_java_binary_script.py
blob: 7ea0efb22d86212fd224df85a31ae3c1a9cfeaab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env python
#
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Creates a simple script to run a java "binary".

This creates a script that sets up the java command line for running a java
jar. This includes correctly setting the classpath and the main class.
"""

import optparse
import os
import sys

from util import build_utils

# The java command must be executed in the current directory because there may
# be user-supplied paths in the args. The script receives the classpath relative
# to the directory that the script is written in and then, when run, must
# recalculate the paths relative to the current directory.
script_template = """\
#!/usr/bin/env python
#
# This file was generated by build/android/gyp/create_java_binary_script.py

import argparse
import os
import sys

self_dir = os.path.dirname(__file__)
classpath = [{classpath}]
bootclasspath = [{bootclasspath}]
extra_program_args = {extra_program_args}
if os.getcwd() != self_dir:
  offset = os.path.relpath(self_dir, os.getcwd())
  classpath = [os.path.join(offset, p) for p in classpath]
  bootclasspath = [os.path.join(offset, p) for p in bootclasspath]
java_cmd = ['java']
# This is a simple argparser for jvm, jar, and classpath arguments.
parser = argparse.ArgumentParser()
parser.add_argument('--jar-args')
parser.add_argument('--jvm-args')
parser.add_argument('--classpath')
known_args, unknown_args = parser.parse_known_args(sys.argv[1:])

if known_args.jvm_args:
  jvm_arguments = known_args.jvm_args.strip('"').split()
  java_cmd.extend(jvm_arguments)
if known_args.jar_args:
  jar_arguments = known_args.jar_args.strip('"').split()
  if unknown_args:
    raise Exception('There are unknown arguments')
else:
  jar_arguments = unknown_args

if known_args.classpath:
  classpath += [known_args.classpath]

{noverify_flag}
if bootclasspath:
    java_cmd.append('-Xbootclasspath/p:' + ':'.join(bootclasspath))
java_cmd.extend(
    ['-classpath', ':'.join(classpath), '-enableassertions', \"{main_class}\"])
java_cmd.extend(extra_program_args)
java_cmd.extend(jar_arguments)
os.execvp('java', java_cmd)
"""

def main(argv):
  argv = build_utils.ExpandFileArgs(argv)
  parser = optparse.OptionParser()
  parser.add_option('--output', help='Output path for executable script.')
  parser.add_option('--main-class',
      help='Name of the java class with the "main" entry point.')
  parser.add_option('--classpath', action='append', default=[],
      help='Classpath for running the jar.')
  parser.add_option('--bootclasspath', action='append', default=[],
      help='zip/jar files to add to bootclasspath for java cmd.')
  parser.add_option('--noverify', action='store_true',
      help='JVM flag: noverify.')

  options, extra_program_args = parser.parse_args(argv)

  if (options.noverify):
    noverify_flag = 'java_cmd.append("-noverify")'
  else:
    noverify_flag = ''

  classpath = []
  for cp_arg in options.classpath:
    classpath += build_utils.ParseGnList(cp_arg)

  bootclasspath = []
  for bootcp_arg in options.bootclasspath:
    bootclasspath += build_utils.ParseGnList(bootcp_arg)

  run_dir = os.path.dirname(options.output)
  bootclasspath = [os.path.relpath(p, run_dir) for p in bootclasspath]
  classpath = [os.path.relpath(p, run_dir) for p in classpath]

  with build_utils.AtomicOutput(options.output) as script:
    script.write(script_template.format(
      classpath=('"%s"' % '", "'.join(classpath)),
      bootclasspath=('"%s"' % '", "'.join(bootclasspath)
                     if bootclasspath else ''),
      main_class=options.main_class,
      extra_program_args=repr(extra_program_args),
      noverify_flag=noverify_flag))

  os.chmod(options.output, 0750)


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))