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