#!/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 and jar arguments. parser = argparse.ArgumentParser() parser.add_argument('--jar-args') parser.add_argument('--jvm-args') 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 {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() build_utils.AddDepfileOption(parser) parser.add_option('--output', help='Output path for executable script.') parser.add_option('--jar-path', help='Path to the main jar.') 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 = [options.jar_path] 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 open(options.output, 'w') 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 options.depfile: build_utils.WriteDepfile(options.depfile, options.output) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))