On Wed, 14 Oct 2009, Bill Janssen wrote:
Andi Vajda <va...@apache.org> wrote:
On Wed, 14 Oct 2009, Bill Janssen wrote:
Andi Vajda <va...@apache.org> wrote:
The same approach could be used for figuring out the Java stuff. Have
a small class running in Java tell us.
You would think, wouldn't you? But then you'll often end up with gcj.
And it would tell you by looking at System.getProperties(), no ?
Sure. But what do you do then?
Emit an error message that says "sorry, gcj is not supported, please use
OpenJDK or Sun JDK" and abort.
The JDK/JRE distinction is another killer.
Indeed but then trying to compile that small class would fail telling
us that there is no JDK.
Maybe I'm just dense, but my requirements may be more extreme than
PyLucene's. I need "jar", "keytool" and "jarsigner", too.
So, if these things are in the JDK, then so is javac and building this small
class works. If javac is not there, no JDK is there and the build aborts.
If someone has a doctored Java install, with javac but not these other
tools, they're on their own.
Here's the fragment of UpLib's configure.in I use for Java configuation:
# it would be nice to know where JAVA_HOME is
JAVA_HOME is returned by System.getProperty('java.home'). Java should know
best. If you can build and run that class, it means you have a JDK and you
can now ask it to tell you about itself.
Andi..
AC_ARG_WITH(javahome, [ --with-javahome=JAVA_HOME_PATH], java_home=$with_javahome,
java_home="")
if test "x$java_home" != "x"; then
AC_MSG_CHECKING(JAVA_HOME value)
if test -d "$java_home"; then
JAVAHOME=$java_home
AC_SUBST(JAVAHOME)
AC_MSG_RESULT([$JAVAHOME])
else
AC_MSG_ERROR([Invalid non-directory value specified for --with-javahome])
fi
fi
if test "x$JAVAHOME" = "x"; then
if test "$OS_TARGET" = "Linux"; then
AC_MSG_CHECKING(for JAVA_HOME)
JAVAHOME=`$PYTHON unix/linux/figure-linux-java.py`
if test "$JAVAHOME" != ""; then
AC_MSG_RESULT($JAVAHOME)
else
AC_MSG_ERROR(No java installation found on this machine.)
fi
elif test "$OS_TARGET" = "Darwin"; then
if test -x /usr/libexec/java_home; then
JAVAHOME=`/usr/libexec/java_home -v 1.5`
else
JAVAHOME=/Library/Java/Home
fi
elif test "$OS_TARGET" = "win32"; then
AC_MSG_CHECKING(for JAVA_HOME)
JAVAHOME=`"$PYTHON" win32/find-javahome.py`
if test "$JAVAHOME" != ""; then
AC_MSG_RESULT($JAVAHOME)
else
AC_MSG_ERROR(No java installation found on this machine.)
fi
else
AC_PATH_PROG(JAVAC, "javac")
AC_PATH_PROG(JAVA, "java")
if test "x$JAVAC" = "x" -o "x$JAVA" = "x"; then
AC_ERROR([No value for Java home, and either "java" or "javac" can't be
found on the path.])
fi
AC_MSG_CHECKING(for JAVA_HOME)
result=`["$JAVAC" -classpath ./java ./java/testProperty.java; "$JAVA"
-classpath ./java testProperty home.java]`
if test -d "$result"; then
JAVAHOME=$result
AC_MSG_RESULT([$JAVAHOME])
else
AC_MSG_ERROR([Can't find JAVA_HOME; use --with-javahome=PATH to specify
the path for JAVA_HOME])
fi
fi
fi
AC_PATH_PROG(JAVA, "java", , [ "$JAVAHOME/jre/bin" "$JAVAHOME/bin" $PATH ])
AC_PATH_PROG(JAVAC, "javac", , [ "$JAVAHOME/bin" $PATH ])
AC_PATH_PROG(JAR, "jar", , [ "$JAVAHOME/bin" $PATH ])
AC_PATH_PROG(KEYTOOL, "keytool", , [ "$JAVAHOME/jre/bin" "$JAVAHOME/bin" $PATH
])
AC_PATH_PROG(JARSIGNER, "jarsigner", , [ "$JAVAHOME/jre/bin" "$JAVAHOME/bin"
$PATH ])
# what version of java?
java_version=`"$JAVA" -version 2>&1 | head -1 | sed -e 's/java version //g' -e
's/"//g'`
AC_SUBST(JAVA_MAJOR_VERSION)
AC_SUBST(JAVA_MINOR_VERSION)
AC_SUBST(JAVA_MICRO_VERSION)
AC_MSG_RESULT([looking at Java version $java_version...])
JAVA_MAJOR_VERSION=[`"$PYTHON" -c "\
import sys, re
print re.split('[\.\_]', '$java_version')[0]"`]
JAVA_MINOR_VERSION=[`"$PYTHON" -c "\
import sys, re
print re.split('[\.\_]', '$java_version')[1]"`]
JAVA_MICRO_VERSION=[`"$PYTHON" -c "\
import sys, re
print re.split('[\.\_]', '$java_version')[2]"`]
JAVA_BUILD_VERSION=[`"$PYTHON" -c "\
import sys, re
splits=re.split('[\.\_]', '$java_version')
print ((len(splits) > 3) and splits[3]) or 5"`]
AC_SUBST(JAVA_HOTSPOT_FLAGS)
JAVA_HOTSPOT_FLAGS=""
if test $JAVA_MAJOR_VERSION -eq 1 -a $JAVA_MINOR_VERSION -eq 6 -a
$JAVA_MICRO_VERSION -eq 0 -a $JAVA_BUILD_VERSION -gt 3 -a $JAVA_BUILD_VERSION
-lt 11 ; then
JAVA_HOTSPOT_FLAGS="-Xint"
AC_MSG_RESULT([This version of Java ($java_version) contains a Hotspot bug
which causes corrupt Lucene indices. JIT compilation will be disabled.])
fi
AC_SUBST(JAVA_COMPAT_FLAG)
AC_SUBST(JAVA_HAS_COOKIE_HANDLING)
JAVA_COMPAT_FLAG=""
JAVA_HAS_COOKIE_HANDLING=yes
if test $JAVA_MAJOR_VERSION -ge 1 -a $JAVA_MINOR_VERSION -gt 4 ; then
if test "$need1dot4" = "yes" ; then
JAVA_COMPAT_FLAG="-source 1.4 -target 1.4"
JAVA_HAS_COOKIE_HANDLING=no
AC_MSG_RESULT(Java version is $java_version; using JAVA_COMPAT_FLAG of
"$JAVA_COMPAT_FLAG")
else
AC_MSG_RESULT(Java version is $java_version; no JAVA_COMPAT_FLAG needed)
fi
elif test $JAVA_MAJOR_VERSION -eq 1 -a $JAVA_MINOR_VERSION -lt 4; then
AC_MSG_ERROR(Java version is $java_version; we need at least 1.4.2.)
elif test $JAVA_MAJOR_VERSION -eq 1 -a $JAVA_MINOR_VERSION -eq 4 -a
$JAVA_MICRO_VERSION -lt 2; then
AC_MSG_ERROR(Java version is $java_version; we need at least 1.4.2.)
else
if test $JAVA_MINOR_VERSION -lt 5; then
JAVA_HAS_COOKIE_HANDLING=no
fi
AC_MSG_RESULT(Java version is $java_version; no JAVA_COMPAT_FLAG needed)
fi
if test "$JAVA_HAS_COOKIE_HANDLING" = "no"; then
AC_MSG_RESULT([No cookie handling in Java clients; password must be passed on
each call])
fi
# check for Java debug flags
AC_MSG_CHECKING(for Java debug)
AC_ARG_ENABLE(java-debug, [ --enable-java-debug], JAVADEBUGFLAGS="$enableval",
JAVADEBUGFLAGS="-g")
AC_SUBST(JAVADEBUGFLAGS)
if test "$JAVADEBUGFLAGS" = "no"; then
AC_MSG_RESULT(no)
JAVADEBUGFLAGS=""
elif test "$JAVADEBUGFLAGS" = "yes"; then
JAVADEBUGFLAGS="-g"
AC_MSG_RESULT(yes: $JAVADEBUGFLAGS)
else
if test $JAVA_MAJOR_VERSION -eq 1 -a $JAVA_MINOR_VERSION -eq 4; then
JAVADEBUGFLAGS="$JAVADEBUGFLAGS -deprecation"
fi
AC_MSG_RESULT(yes: $JAVADEBUGFLAGS)
fi
AC_MSG_CHECKING(for Java classpath separator character)
AC_SUBST(JAVACLASSPATHSEP)
if test "$OS_TARGET" = "win32"; then
JAVACLASSPATHSEP=";"
else
JAVACLASSPATHSEP=":"
fi
AC_MSG_RESULT($JAVACLASSPATHSEP)