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? > > 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. Here's the fragment of UpLib's configure.in I use for Java configuation: # it would be nice to know where JAVA_HOME is 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)