<pre style='margin:0'>
Landon Fuller (landonf) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/8d70ce38f4fde7edb6bba3dd21127fb3ec502fa5">https://github.com/macports/macports-ports/commit/8d70ce38f4fde7edb6bba3dd21127fb3ec502fa5</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 8d70ce38f4fde7edb6bba3dd21127fb3ec502fa5
</span>Author: Janosch Peters <janosch1@mailbox.org>
AuthorDate: Mon Jan 4 13:42:08 2021 +0100

<span style='display:block; white-space:pre;color:#404040;'>    java-pg: Better workaround for Big Sur JVM detection
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Trac: https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    With this workaround, the check for ${java.version} works as
</span><span style='display:block; white-space:pre;color:#404040;'>    expected for values like 1.7, 1.8+ or 9 in Big Sur. If the "+"
</span><span style='display:block; white-space:pre;color:#404040;'>    selector is used and there are more than one candidate, the
</span><span style='display:block; white-space:pre;color:#404040;'>    highest JVM version wins.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    "+" and "*" can only be used on the major version, e.g. 1.8+ or 11*.
</span><span style='display:block; white-space:pre;color:#404040;'>    Things like 1.8.56* are not supported, as they are not used in a
</span><span style='display:block; white-space:pre;color:#404040;'>    single port at the moment.
</span>---
 _resources/port1.0/group/java-1.0.tcl | 120 +++++++++++++++++++++++++---------
 1 file changed, 89 insertions(+), 31 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/_resources/port1.0/group/java-1.0.tcl b/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index d7519780a5f..a5e31928be1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/_resources/port1.0/group/java-1.0.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -34,19 +34,11 @@ pre-fetch {
</span>         java_set_env
         # If still not present, error out
         if { ${java_version_not_found} } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            global os.platform os.major
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {${os.platform} eq "darwin" && ${os.major} >= 20} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # The following check is broken on macOS 11 Big Sur so we
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # temporarily give up on ensuring an exact Java version. See
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_warn "Failed to confirm that required Java was installed; see https://trac.macports.org/ticket/61445"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span>                 ui_error "${name} requires Java ${java.version} but no such installation could be found."
                 return -code error "missing required Java version"
             }
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span> 
 # Search for a good value for JAVA_HOME
 proc find_java_home {} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -69,39 +61,26 @@ proc find_java_home {} {
</span>             ui_debug "Redefining java fallback ${java.fallback} to ${newjdk} for arm compatibility"
             java.fallback ${newjdk}
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # /usr/libexec/java_home on Big Sur appears to have a bug where it won't
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # honor the -f flag if the JAVA_HOME envar is set. See
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # https://stackoverflow.com/a/64917842/448068
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Temporarily unset and stash the value here.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Also it seems that wildcard syntax does not work, so we remove them.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # For macOS >= Big Sur, the JDK discovery was re-implemented because
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # the previous approach relied on '/usr/libexec/java_home -v' whose
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # behaviour changed with Big Sur. The new implementation can
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # handle wildcards on the major version, but not on the minor version:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # 1.8+, 9* works, 1.7.35+ won't.
</span>         #
         # See https://trac.macports.org/ticket/61445
         global os.platform os.major
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set big_sur_workaround [expr {${os.platform} eq "darwin" && ${os.major} == 20}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {${big_sur_workaround}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set java.version [string map {+ "" * ""} ${java.version}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[info exists ::env(JAVA_HOME)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set env_java_home $::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                unset ::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { [catch {set val [exec "/usr/libexec/java_home" "-f" "-v" ${java.version}]}] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set big_sur_workaround [expr {${os.platform} eq "darwin" && ${os.major} >= 20}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if { ${big_sur_workaround} && [catch {set val [get_jvm_bigsur ${java.version}] } ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        || !${big_sur_workaround} && [catch {set val [exec "/usr/libexec/java_home" "-f" "-v" ${java.version}] } ] } {
</span>             # Don't return an error because that would prevent the port from
             # even being indexed when the required Java is missing. Instead, set
             # a flag to be checked at pre-fetch.
             set java_version_not_found yes
         } else {
             set home_value $val
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "Discovered JAVA_HOME via /usr/libexec/java_home -f -v: $home_value"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Restore original JAVA_HOME value stashed above
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {${big_sur_workaround} && [info exists env_java_home]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ::env(JAVA_HOME) ${env_java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Discovered JAVA_HOME via /usr/libexec/java_home: $home_value"
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -154,4 +133,83 @@ proc java_set_env {} {
</span>     destroot.env-append    JAVA_HOME=${java_home}
     java.home ${java_home}
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> port::register_callback java_set_env
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc get_jvm_bigsur { version_requested } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Normalize version numbers 1.x -> x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set version_requested [regsub {^1\.} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Sort the JVMs we found on the system descending
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set versions_found [sort_dict [find_jvm_versions]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_debug "Big Sur Workaround - Detected JVMs: $versions_found"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Match the systems JVMs with the one requested by MacPorts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Higher JVM Versions win
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [match_jvm_version $version_requested $versions_found]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Find JVM versions by using /usr/libexec/java_home -V (not -v!)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Returns a dict of unique(!) major versions [major_version path]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc find_jvm_versions {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {exec /usr/libexec/java_home -V} result options]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Extract JVM versions and corresponding JAVA_HOMEs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set vm_versions [regexp -all -inline -- { +(\d+(?:\.\d+)+)[^/]+(\/[^\0\n]+)} $result]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # %3=0 -> Regex match, ignored.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # %3=1 -> Version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # %3=2 -> JAVA_HOME.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        for {set idx 0} {$idx < [llength $vm_versions]} {incr idx 3} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set vers [lindex $vm_versions $idx+1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Normalize version 1.x -> x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set vers [regsub {^1\.} $vers ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Extract major version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set vers [regsub {(\.\d+)+} $vers ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set path [lindex $vm_versions $idx+2]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict append version_path_dict $vers $path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set details [dict get $options -errorcode]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Error executing /usr/libexec/java_home -V"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set version_path_dict
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Match a normalized major version string like 7, 8*, 9+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc match_jvm_version { version_requested versions_found } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[string first "+" $version_requested] != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set version_requested [regsub {\+} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        match_less_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set version_requested [regsub {\*} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        match_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc match_equal { version version_list } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach vl_item [dict keys $version_list] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$version == $vl_item} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set java_home [dict get $version_list $vl_item]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $java_home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return -code error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc match_less_equal { version version_list } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach vl_item [dict keys $version_list] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$version <= $vl_item} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set java_home [dict get $version_list $vl_item]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $java_home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return -code error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc sort_dict { unsorted_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dkeys [dict keys $unsorted_dict]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dkeys_sorted [lsort -decreasing $dkeys]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach place $dkeys_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set jvm_path [dict get $unsorted_dict $place]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict append version_path_dict $place $jvm_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $version_path_dict
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>

</pre>