xref: /aosp_15_r20/external/angle/build/util/java_action.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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