<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/0a16172a98aa72bfd806a82c63b7dd82cce3dd90">https://github.com/macports/macports-ports/commit/0a16172a98aa72bfd806a82c63b7dd82cce3dd90</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 0a16172a98aa72bfd806a82c63b7dd82cce3dd90
</span>Author: Janosch Peters <janosch1@mailbox.org>
AuthorDate: Thu Sep 23 11:07:24 2021 +0200
<span style='display:block; white-space:pre;color:#404040;'> Move utility functions to 'java' namespace
</span>---
_resources/port1.0/group/java-1.0.tcl | 342 +++++++++++++++++-----------------
1 file changed, 172 insertions(+), 170 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 67d028f396f..b54fd88b3a9 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;'>@@ -31,206 +31,208 @@ set java_version_not_found no
</span> pre-fetch {
if { ${java_version_not_found} } {
# Check again, incase java became available, .e.g openjdk installed as a dependency
<span style='display:block; white-space:pre;background:#ffe0e0;'>- java_set_env
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ java::java_set_env
</span> # If still not present, error out
if { ${java_version_not_found} } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_error "${name} requires Java ${java.version} but no such installation could be found."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return -code error "missing required Java version"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_error "${name} requires Java ${java.version} but no such installation could be found."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -code error "missing required Java version"
</span> }
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Search for a good value for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc find_java_home {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set home_value ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Default setting to found, until proved otherwise below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global java_version_not_found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set java_version_not_found no
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global java.version java.fallback
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ${java.version} ne "" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "java-portgroup: Trying to find JVM version: ${java.version}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # If on arm automatically adjust to the *-zulu fallback versions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # as required, as currently these are the only ones supporting arm.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # To be reviewed as support for arm comes for the other versions.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Following regex matches openjdk<version> only.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { [option configure.build_arch] eq "arm64" &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [regexp {openjdk(\d{1,2}$)} ${java.fallback}] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set newjdk ${java.fallback}-zulu
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Redefining java fallback ${java.fallback} to ${newjdk} for arm compatibility"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- java.fallback ${newjdk}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+port::register_callback java::java_set_env
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+namespace eval java {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Search for a good value for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc find_java_home {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set home_value ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Default setting to found, until proved otherwise below
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global java_version_not_found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set java_version_not_found no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global java.version java.fallback
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ${java.version} ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "java-portgroup: Trying to find JVM version: ${java.version}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # If on arm automatically adjust to the *-zulu fallback versions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # as required, as currently these are the only ones supporting arm.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # To be reviewed as support for arm comes for the other versions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Following regex matches openjdk<version> only.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { [option configure.build_arch] eq "arm64" &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [regexp {openjdk(\d{1,2}$)} ${java.fallback}] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set newjdk ${java.fallback}-zulu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "Redefining java fallback ${java.fallback} to ${newjdk} for arm compatibility"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ java.fallback ${newjdk}
</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;'>+ # 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><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # See https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global os.platform os.major
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Don't return an error because that would prevent the port from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # even being indexed when the required Java is missing. Instead, set
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # a flag to be checked at pre-fetch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set java_version_not_found yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set home_value $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "java-portgroup: Discovered matching JAVA_HOME: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # For macOS >= Big Sur, the JDK discovery was re-implemented because
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # the previous approach relied on '/usr/libexec/java_home -v' whose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # behaviour changed with Big Sur. The new implementation can
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # handle wildcards on the major version, but not on the minor version:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # 1.8+, 9* works, 1.7.35+ won't.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # See https://trac.macports.org/ticket/61445
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global os.platform os.major
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><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} && [catch {set val [get_jvm_bigsur ${java.version}] } ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- || !${big_sur_workaround} && [catch {set val [exec "/usr/libexec/java_home" "-f" "-v" ${java.version}] } ] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Don't return an error because that would prevent the port from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # even being indexed when the required Java is missing. Instead, set
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # a flag to be checked at pre-fetch.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set java_version_not_found yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set home_value $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "java-portgroup: Discovered matching JAVA_HOME: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Default to any valid value that made it through the environment
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ![file isdirectory $home_value] && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [info exists ::env(JAVA_HOME)] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set val $::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { [file isdirectory $val] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set home_value $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "Discovered JAVA_HOME via env: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # Default to any valid value that made it through the environment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ![file isdirectory $home_value] && \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- [info exists ::env(JAVA_HOME)] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set val $::env(JAVA_HOME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { [file isdirectory $val] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # First, ask the system where java home is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ![file isdirectory $home_value] && ![catch {set val [exec "/usr/libexec/java_home"]}] } {
</span> set home_value $val
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Discovered JAVA_HOME via env: $home_value"
</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:#ffe0e0;'>- }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # First, ask the system where java home is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ![file isdirectory $home_value] && ![catch {set val [exec "/usr/libexec/java_home"]}] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set home_value $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Discovered JAVA_HOME via /usr/libexec/java_home: $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;'>- # Fall back to more conventional way to find java home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ![file isdirectory $home_value] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach loc { "/System/Library/Frameworks/JavaVM.framework/Home" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { [file isdirectory $loc] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set home_value $loc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Discovered JAVA_HOME via search path: $home_value"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Fall back to more conventional way to find java home
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ![file isdirectory $home_value] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach loc { "/System/Library/Frameworks/JavaVM.framework/Home" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { [file isdirectory $loc] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set home_value $loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "Discovered JAVA_HOME via search path: $home_value"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # Warn user if we couldn't find a likely JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ![file isdirectory $home_value]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "No value for java JAVA_HOME was automatically discovered"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Warn user if we couldn't find a likely JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ![file isdirectory $home_value]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "No value for java JAVA_HOME was automatically discovered"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # Add dependency if required
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if { ${java_version_not_found} && ${java.fallback} ne "" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Adding dependency on JDK fallback ${java.fallback}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- depends_lib-append port:${java.fallback}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Add dependency if required
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if { ${java_version_not_found} && ${java.fallback} ne "" } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug "Adding dependency on JDK fallback ${java.fallback}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_lib-append port:${java.fallback}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return $home_value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $home_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc java_set_env {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Set the best value we can find for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set java_home [find_java_home]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- configure.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- build.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- destroot.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- java.home ${java_home}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc java_set_env {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Set the best value we can find for JAVA_HOME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set java_home [find_java_home]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ configure.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ build.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ destroot.env-append JAVA_HOME=${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ java.home ${java_home}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-port::register_callback java_set_env
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc get_jvm_bigsur { version_requested } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Normalize version numbers 1.x -> x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set version_requested [regsub {^1\.} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Sort the JVMs we found on the system descending
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set versions_found [sort_dict [find_jvm_versions]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "java-portgroup: Detected JVMs: $versions_found"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Match the systems JVMs with the one requested by MacPorts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Higher JVM Versions win
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return [match_jvm_version $version_requested $versions_found]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</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 "java-portgroup: 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:#ffe0e0;'>-# Find JVM versions by using /usr/libexec/java_home -V (not -v!)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns a dict with unique major versions as key and the corresponding
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# java_home as value:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# dict[major_version]=java_home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc find_jvm_versions {} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[catch {exec /usr/libexec/java_home -V} result options]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Extract JVM versions and corresponding JAVA_HOMEs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set vm_versions [regexp -all -inline -- { +(\d+(?:\.\d+)+)[^/]+(\/[^\0\n]+)} $result]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # %3=0 -> Regex match, ignored.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # %3=1 -> Version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # %3=2 -> JAVA_HOME.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- for {set idx 0} {$idx < [llength $vm_versions]} {incr idx 3} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set vers [lindex $vm_versions $idx+1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Normalize version 1.x -> x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set vers [regsub {^1\.} $vers ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Extract major version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set vers [regsub {(\.\d+)+} $vers ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set path [lindex $vm_versions $idx+2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dict append version_path_dict $vers $path
</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 with unique major versions as key and the corresponding
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # java_home as value:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # dict[major_version]=java_home
</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:#ffe0e0;'>- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set details [dict get $options -errorcode]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug "Error executing /usr/libexec/java_home -V"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set version_path_dict
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set version_path_dict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Match a normalized major version string like 7, 8*, 9+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_jvm_version { version_requested versions_found } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[string first "+" $version_requested] != -1} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set version_requested [regsub {\+} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- match_less_equal $version_requested $versions_found
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set version_requested [regsub {\*} $version_requested ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- match_equal $version_requested $versions_found
</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:#ffe0e0;'>-}
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# whose key is equal to search_key.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$search_key == $td_key} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # whose key is equal to search_key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc match_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$search_key == $td_key} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $ret_value
</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:#ffe0e0;'>- return -code error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# whose key is less or equal to search_key.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc match_less_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$search_key <= $td_key} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return $ret_value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Returns the value of the first dictionary entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # whose key is less or equal to search_key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @param search_key The key that is to be found in the dictionary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @param target_dict The dictionary which should be searched for search_key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @return The value of the first entry that matched.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Returns an error, if no such entry is found.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc match_less_equal { search_key target_dict } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach td_key [dict keys $target_dict] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$search_key <= $td_key} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ret_value [dict get $target_dict $td_key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $ret_value
</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:#ffe0e0;'>- return -code error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Sorts a dictionary decreasing by its keys
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param The dictionary that is to be sorted decreasing by its keys
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @return A sorted dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc sort_dict { unsorted_dict } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set keys_unsorted [dict keys $unsorted_dict]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set keys_sorted [lsort -decreasing $keys_unsorted]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach key $keys_sorted {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set value [dict get $unsorted_dict $key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dict append sorted_dict $key $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Sorts a dictionary decreasing by its keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @param The dictionary that is to be sorted decreasing by its keys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # @return A sorted dictionary
</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 keys_unsorted [dict keys $unsorted_dict]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set keys_sorted [lsort -decreasing $keys_unsorted]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach key $keys_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set value [dict get $unsorted_dict $key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict append sorted_dict $key $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return $sorted_dict
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return $sorted_dict
</span> }
</pre><pre style='margin:0'>
</pre>