<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>