create_java_binary_script.py (4721B)
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 """Creates a simple script to run a java "binary". 8 9 This creates a script that sets up the java command line for running a java 10 jar. This includes correctly setting the classpath and the main class. 11 """ 12 13 import argparse 14 import os 15 import sys 16 17 from util import build_utils 18 import action_helpers # build_utils adds //build to sys.path. 19 20 # The java command must be executed in the current directory because there may 21 # be user-supplied paths in the args. The script receives the classpath relative 22 # to the directory that the script is written in and then, when run, must 23 # recalculate the paths relative to the current directory. 24 script_template = """\ 25 #!/usr/bin/env python3 26 # 27 # This file was generated by build/android/gyp/create_java_binary_script.py 28 29 import argparse 30 import os 31 import sys 32 33 self_dir = os.path.dirname(__file__) 34 classpath = [{classpath}] 35 extra_program_args = {extra_program_args} 36 java_path = {java_path} 37 if os.getcwd() != self_dir: 38 offset = os.path.relpath(self_dir, os.getcwd()) 39 fix_path = lambda p: os.path.normpath(os.path.join(offset, p)) 40 classpath = [fix_path(p) for p in classpath] 41 java_path = fix_path(java_path) 42 java_cmd = [java_path] 43 44 # https://github.com/iBotPeaches/Apktool/issues/3174 45 # https://chromium-review.googlesource.com/c/chromium/src/+/4697557/3 46 java_cmd += ['-Djdk.util.zip.disableZip64ExtraFieldValidation=true'] 47 48 # This is a simple argparser for jvm, jar, and classpath arguments. 49 parser = argparse.ArgumentParser(add_help=False) 50 parser.add_argument('--jar-args') 51 parser.add_argument('--jvm-args') 52 parser.add_argument('--classpath') 53 # Test_runner parses the classpath for sharding junit tests. 54 known_args, unknown_args = parser.parse_known_args(sys.argv[1:]) 55 56 if known_args.jvm_args: 57 jvm_arguments = known_args.jvm_args.strip('"').split() 58 java_cmd.extend(jvm_arguments) 59 if known_args.jar_args: 60 jar_arguments = known_args.jar_args.strip('"').split() 61 if unknown_args: 62 raise Exception('There are unknown arguments') 63 else: 64 jar_arguments = unknown_args 65 66 if known_args.classpath: 67 classpath += [known_args.classpath] 68 69 {extra_flags} 70 java_cmd += ['-classpath', ':'.join(classpath), \"{main_class}\"] 71 java_cmd.extend(extra_program_args) 72 java_cmd.extend(jar_arguments) 73 os.execvp(java_cmd[0], java_cmd) 74 """ 75 76 def main(argv): 77 argv = build_utils.ExpandFileArgs(argv) 78 parser = argparse.ArgumentParser() 79 parser.add_argument('--output', 80 required=True, 81 help='Output path for executable script.') 82 parser.add_argument( 83 '--main-class', 84 required=True, 85 help='Name of the java class with the "main" entry point.') 86 parser.add_argument('--max-heap-size', 87 required=True, 88 help='Argument for -Xmx') 89 parser.add_argument('--classpath', 90 action='append', 91 default=[], 92 help='Classpath for running the jar.') 93 parser.add_argument('--enable-asserts', 94 action='store_true', 95 help='Enable Java assert statements') 96 parser.add_argument('--tiered-stop-at-level-one', 97 action='store_true', 98 help='JVM flag: -XX:TieredStopAtLevel=1.') 99 parser.add_argument('extra_program_args', 100 nargs='*', 101 help='This captures all ' 102 'args after "--" to pass as extra args to the java cmd.') 103 104 args = parser.parse_args(argv) 105 106 extra_flags = [f'java_cmd.append("-Xmx{args.max_heap_size}")'] 107 if args.enable_asserts: 108 extra_flags.append('java_cmd.append("-enableassertions")') 109 if args.tiered_stop_at_level_one: 110 extra_flags.append('java_cmd.append("-XX:TieredStopAtLevel=1")') 111 112 classpath = [] 113 for cp_arg in args.classpath: 114 classpath += action_helpers.parse_gn_list(cp_arg) 115 116 run_dir = os.path.dirname(args.output) 117 classpath = [os.path.relpath(p, run_dir) for p in classpath] 118 119 java_path = os.path.relpath( 120 os.path.join(build_utils.JAVA_HOME, 'bin', 'java'), run_dir) 121 122 with action_helpers.atomic_output(args.output, mode='w') as script: 123 script.write( 124 script_template.format(classpath=('"%s"' % '", "'.join(classpath)), 125 java_path=repr(java_path), 126 main_class=args.main_class, 127 extra_program_args=repr(args.extra_program_args), 128 extra_flags='\n'.join(extra_flags))) 129 130 os.chmod(args.output, 0o750) 131 132 133 if __name__ == '__main__': 134 sys.exit(main(sys.argv[1:]))