From ffbbb993d9ce2eea980d295f8c262e1eef4f468a Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Sat, 10 Oct 2026 20:55:07 -0700 Subject: [PATCH 1/2] Make daikon.bashrc ask javac or java for JAVA_HOME --- scripts/daikon.bashrc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/scripts/daikon.bashrc b/scripts/daikon.bashrc index 9949bdde44..a5d73dd3d6 100644 --- a/scripts/daikon.bashrc +++ b/scripts/daikon.bashrc @@ -8,15 +8,26 @@ ## files to .class files but have not re-made the daikon.jar file. ## You should not need to edit this file. -if [ "$(uname)" = "Darwin" ] ; then - export JAVA_HOME=${JAVA_HOME:-$(/usr/libexec/java_home)} -else - export JAVA_HOME=${JAVA_HOME:-$(dirname $(dirname $(readlink -f $(which javac))))} +# Ask the javac on the PATH which JDK it is in. This works even if javac is a +# wrapper script (as used by jenv, asdf, or mise) or the macOS /usr/bin/javac stub. +# Running Daikon requires only a JRE, so use the java on the PATH if there is no javac. +# For JDK 8, java.home is the jre/ subdirectory of the JDK. +# A failed detection does not modify JAVA_HOME in the user's shell. +daikon_java_home="$JAVA_HOME" +if [ -z "$daikon_java_home" ] ; then + if command -v javac > /dev/null 2>&1 ; then + daikon_java_home=$(javac -J-XshowSettings:properties -version 2>&1 | sed -n -e '/^ *java\.home = /{s///;s:/jre$::;p;}') + else + daikon_java_home=$(java -XshowSettings:properties -version 2>&1 | sed -n -e '/^ *java\.home = /{s///;s:/jre$::;p;}') + fi fi -if [ ! -d "$JAVA_HOME" ]; then - echo "Cannot infer JAVA_HOME; please set it. Aborting daikon.bashrc ." +if [ -z "$daikon_java_home" ] || [ ! -x "$daikon_java_home/bin/java" ] ; then + echo "No Java found at JAVA_HOME=$daikon_java_home; set JAVA_HOME or put java on the PATH. Aborting daikon.bashrc ." + unset daikon_java_home return 2 fi +export JAVA_HOME="$daikon_java_home" +unset daikon_java_home if [ ${#BASH_SOURCE[@]} -eq 0 ]; then # Cannot infer DAIKONDIR. From cf2d9dc8ed3d576b8fe39311a913232af4e932b0 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Sat, 10 Oct 2026 21:19:01 -0700 Subject: [PATCH 2/2] daikon.bashrc: require a JDK; find it quickly via symlinks; clearer errors --- scripts/daikon.bashrc | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/scripts/daikon.bashrc b/scripts/daikon.bashrc index a5d73dd3d6..fe88b064fd 100644 --- a/scripts/daikon.bashrc +++ b/scripts/daikon.bashrc @@ -8,21 +8,31 @@ ## files to .class files but have not re-made the daikon.jar file. ## You should not need to edit this file. -# Ask the javac on the PATH which JDK it is in. This works even if javac is a -# wrapper script (as used by jenv, asdf, or mise) or the macOS /usr/bin/javac stub. -# Running Daikon requires only a JRE, so use the java on the PATH if there is no javac. +# Find the JDK that contains the javac on the PATH. (Daikon requires a JDK, not +# just a JRE, because it compiles splitters at run time.) Following symlinks is +# fast, but it does not work for a wrapper script (as used by jenv, asdf, or mise) +# or for the macOS /usr/bin/javac stub, so in those cases ask the JVM instead. +# A JDK home contains a "release" file; a wrapper's directory does not. # For JDK 8, java.home is the jre/ subdirectory of the JDK. # A failed detection does not modify JAVA_HOME in the user's shell. daikon_java_home="$JAVA_HOME" -if [ -z "$daikon_java_home" ] ; then - if command -v javac > /dev/null 2>&1 ; then - daikon_java_home=$(javac -J-XshowSettings:properties -version 2>&1 | sed -n -e '/^ *java\.home = /{s///;s:/jre$::;p;}') - else - daikon_java_home=$(java -XshowSettings:properties -version 2>&1 | sed -n -e '/^ *java\.home = /{s///;s:/jre$::;p;}') +# "type -P" ignores aliases such as "alias javac='javac -g'". +if [ -z "$daikon_java_home" ] && daikon_java_home=$(type -P javac) ; then + daikon_java_home=$(readlink -f "$daikon_java_home" 2> /dev/null) + daikon_java_home="${daikon_java_home%/bin/javac}" + if [ ! -f "$daikon_java_home/release" ] ; then + daikon_java_home=$(command javac -J-XshowSettings:properties -version 2>&1 | sed -n -e 's/^ *java\.home = //p') + if [ -x "${daikon_java_home%/jre}/bin/javac" ] ; then + daikon_java_home="${daikon_java_home%/jre}" + fi fi fi -if [ -z "$daikon_java_home" ] || [ ! -x "$daikon_java_home/bin/java" ] ; then - echo "No Java found at JAVA_HOME=$daikon_java_home; set JAVA_HOME or put java on the PATH. Aborting daikon.bashrc ." +if [ -z "$daikon_java_home" ] || [ ! -x "$daikon_java_home/bin/javac" ] ; then + if [ -n "$JAVA_HOME" ] ; then + echo "JAVA_HOME=$JAVA_HOME does not contain bin/javac; set it to a JDK or unset it. Aborting daikon.bashrc ." + else + echo "Cannot find a JDK; set JAVA_HOME or put javac on the PATH. Aborting daikon.bashrc ." + fi unset daikon_java_home return 2 fi