1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2015 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker"""Wrapper script to run java command as action with gn.""" 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Workerimport os 9*6777b538SAndroid Build Coastguard Workerimport subprocess 10*6777b538SAndroid Build Coastguard Workerimport sys 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard WorkerEXIT_SUCCESS = 0 13*6777b538SAndroid Build Coastguard WorkerEXIT_FAILURE = 1 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Workerdef IsExecutable(path): 17*6777b538SAndroid Build Coastguard Worker """Returns whether file at |path| exists and is executable. 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker Args: 20*6777b538SAndroid Build Coastguard Worker path: absolute or relative path to test. 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker Returns: 23*6777b538SAndroid Build Coastguard Worker True if the file at |path| exists, False otherwise. 24*6777b538SAndroid Build Coastguard Worker """ 25*6777b538SAndroid Build Coastguard Worker return os.path.isfile(path) and os.access(path, os.X_OK) 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Workerdef FindCommand(command): 29*6777b538SAndroid Build Coastguard Worker """Looks up for |command| in PATH. 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker Args: 32*6777b538SAndroid Build Coastguard Worker command: name of the command to lookup, if command is a relative or 33*6777b538SAndroid Build Coastguard Worker absolute path (i.e. contains some path separator) then only that 34*6777b538SAndroid Build Coastguard Worker path will be tested. 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker Returns: 37*6777b538SAndroid Build Coastguard Worker Full path to command or None if the command was not found. 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker On Windows, this respects the PATHEXT environment variable when the 40*6777b538SAndroid Build Coastguard Worker command name does not have an extension. 41*6777b538SAndroid Build Coastguard Worker """ 42*6777b538SAndroid Build Coastguard Worker fpath, _ = os.path.split(command) 43*6777b538SAndroid Build Coastguard Worker if fpath: 44*6777b538SAndroid Build Coastguard Worker if IsExecutable(command): 45*6777b538SAndroid Build Coastguard Worker return command 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker if sys.platform == 'win32': 48*6777b538SAndroid Build Coastguard Worker # On Windows, if the command does not have an extension, cmd.exe will 49*6777b538SAndroid Build Coastguard Worker # try all extensions from PATHEXT when resolving the full path. 50*6777b538SAndroid Build Coastguard Worker command, ext = os.path.splitext(command) 51*6777b538SAndroid Build Coastguard Worker if not ext: 52*6777b538SAndroid Build Coastguard Worker exts = os.environ['PATHEXT'].split(os.path.pathsep) 53*6777b538SAndroid Build Coastguard Worker else: 54*6777b538SAndroid Build Coastguard Worker exts = [ext] 55*6777b538SAndroid Build Coastguard Worker else: 56*6777b538SAndroid Build Coastguard Worker exts = [''] 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker for path in os.environ['PATH'].split(os.path.pathsep): 59*6777b538SAndroid Build Coastguard Worker for ext in exts: 60*6777b538SAndroid Build Coastguard Worker path = os.path.join(path, command) + ext 61*6777b538SAndroid Build Coastguard Worker if IsExecutable(path): 62*6777b538SAndroid Build Coastguard Worker return path 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker return None 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Workerdef main(): 68*6777b538SAndroid Build Coastguard Worker java_path = FindCommand('java') 69*6777b538SAndroid Build Coastguard Worker if not java_path: 70*6777b538SAndroid Build Coastguard Worker sys.stderr.write('java: command not found\n') 71*6777b538SAndroid Build Coastguard Worker sys.exit(EXIT_FAILURE) 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker args = sys.argv[1:] 74*6777b538SAndroid Build Coastguard Worker if len(args) < 2 or args[0] != '-jar': 75*6777b538SAndroid Build Coastguard Worker sys.stderr.write('usage: %s -jar JARPATH [java_args]...\n' % sys.argv[0]) 76*6777b538SAndroid Build Coastguard Worker sys.exit(EXIT_FAILURE) 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker return subprocess.check_call([java_path] + args) 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 82*6777b538SAndroid Build Coastguard Worker sys.exit(main()) 83