blob: 21cafad9564e8f97a63c16dec29016f972429132 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Utilities for handling Java code."""
import os
def JavaHomeAndSuffix():
"""Find the directory that the JDK is installed in.
The JDK install directory is expected to have a bin directory that contains
at a minimum the java and javac executables. If the environment variable
JAVA_HOME is set then it must point to such a directory. Otherwise, we look
for javac on the PATH and check that it is inside a JDK install directory.
Returns:
A tuple where the first element is the JDK install directory and the second
element is a suffix that must be appended to executables in that directory
('' on Unix-like systems, '.exe' on Windows).
Raises:
RuntimeError: If JAVA_HOME is set but is not a JDK install directory, or
otherwise if a JDK install directory cannot be found based on the PATH.
"""
def ResultForJdkAt(path):
"""Return (path, suffix) if path is a JDK install directory, else None."""
def IsExecutable(binary):
return os.path.isfile(binary) and os.access(binary, os.X_OK)
def ResultFor(path):
for suffix in ['', '.exe']:
if all(IsExecutable(os.path.join(path, 'bin', binary + suffix))
for binary in ['java', 'javac', 'jar']):
return (path, suffix)
return None
result = ResultFor(path)
if not result:
head, tail = os.path.split(path)
if tail == 'jre':
result = ResultFor(head)
return result
java_home = os.getenv('JAVA_HOME')
if java_home:
result = ResultForJdkAt(java_home)
if result:
return result
else:
raise RuntimeError(
'JAVA_HOME is set but does not reference a valid JDK: %s' % java_home)
for path_dir in os.environ['PATH'].split(os.pathsep):
maybe_root, last = os.path.split(path_dir)
if last == 'bin':
result = ResultForJdkAt(maybe_root)
if result:
return result
raise RuntimeError('Did not find JDK in PATH and JAVA_HOME is not set')