138 lines
4.7 KiB
Python
Executable File
138 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright 2014 The Chromium Authors
|
|
# 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 argparse
|
|
import os
|
|
import sys
|
|
|
|
from util import build_utils
|
|
import action_helpers # build_utils adds //build to sys.path.
|
|
|
|
# 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 python3
|
|
#
|
|
# 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}]
|
|
extra_program_args = {extra_program_args}
|
|
java_path = {java_path}
|
|
if os.getcwd() != self_dir:
|
|
offset = os.path.relpath(self_dir, os.getcwd())
|
|
fix_path = lambda p: os.path.normpath(os.path.join(offset, p))
|
|
classpath = [fix_path(p) for p in classpath]
|
|
java_path = fix_path(java_path)
|
|
java_cmd = [java_path]
|
|
# This is a simple argparser for jvm, jar, and classpath arguments.
|
|
parser = argparse.ArgumentParser(add_help=False)
|
|
parser.add_argument('--jar-args')
|
|
parser.add_argument('--jvm-args')
|
|
parser.add_argument('--classpath')
|
|
# Test_runner parses the classpath for sharding junit tests.
|
|
parser.add_argument('--print-classpath', action='store_true',
|
|
help='Prints the classpass. Used by test_runner.')
|
|
known_args, unknown_args = parser.parse_known_args(sys.argv[1:])
|
|
|
|
if known_args.print_classpath:
|
|
sys.stdout.write(':'.join(classpath))
|
|
sys.exit(0)
|
|
|
|
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]
|
|
|
|
{extra_flags}
|
|
java_cmd.extend(
|
|
['-classpath', ':'.join(classpath), '-enableassertions', \"{main_class}\"])
|
|
java_cmd.extend(extra_program_args)
|
|
java_cmd.extend(jar_arguments)
|
|
os.execvp(java_cmd[0], java_cmd)
|
|
"""
|
|
|
|
def main(argv):
|
|
argv = build_utils.ExpandFileArgs(argv)
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--output',
|
|
required=True,
|
|
help='Output path for executable script.')
|
|
parser.add_argument(
|
|
'--main-class',
|
|
required=True,
|
|
help='Name of the java class with the "main" entry point.')
|
|
parser.add_argument('--max-heap-size',
|
|
required=True,
|
|
help='Argument for -Xmx')
|
|
parser.add_argument('--classpath',
|
|
action='append',
|
|
default=[],
|
|
help='Classpath for running the jar.')
|
|
parser.add_argument('--tiered-stop-at-level-one',
|
|
action='store_true',
|
|
help='JVM flag: -XX:TieredStopAtLevel=1.')
|
|
parser.add_argument('--use-jdk-11',
|
|
action='store_true',
|
|
help='Use older JDK11 instead of modern JDK.')
|
|
parser.add_argument('extra_program_args',
|
|
nargs='*',
|
|
help='This captures all '
|
|
'args after "--" to pass as extra args to the java cmd.')
|
|
|
|
args = parser.parse_args(argv)
|
|
|
|
extra_flags = [f'java_cmd.append("-Xmx{args.max_heap_size}")']
|
|
if args.tiered_stop_at_level_one:
|
|
extra_flags.append('java_cmd.append("-XX:TieredStopAtLevel=1")')
|
|
|
|
classpath = []
|
|
for cp_arg in args.classpath:
|
|
classpath += action_helpers.parse_gn_list(cp_arg)
|
|
|
|
run_dir = os.path.dirname(args.output)
|
|
classpath = [os.path.relpath(p, run_dir) for p in classpath]
|
|
|
|
if args.use_jdk_11:
|
|
java_home = build_utils.JAVA_11_HOME_DEPRECATED
|
|
else:
|
|
java_home = build_utils.JAVA_HOME
|
|
java_path = os.path.relpath(os.path.join(java_home, 'bin', 'java'), run_dir)
|
|
|
|
with action_helpers.atomic_output(args.output, mode='w') as script:
|
|
script.write(
|
|
script_template.format(classpath=('"%s"' % '", "'.join(classpath)),
|
|
java_path=repr(java_path),
|
|
main_class=args.main_class,
|
|
extra_program_args=repr(args.extra_program_args),
|
|
extra_flags='\n'.join(extra_flags)))
|
|
|
|
os.chmod(args.output, 0o750)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv[1:]))
|