xref: /aosp_15_r20/external/cronet/build/util/java_action.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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