<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/1c8f1539e792b9680446a2062a82153dcc1a95f2">https://github.com/macports/macports-base/commit/1c8f1539e792b9680446a2062a82153dcc1a95f2</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 1c8f1539e792b9680446a2062a82153dcc1a95f2
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Fri Feb 23 16:13:44 2024 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Cache compiler versions persistently
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also cache per developer_dir, since Xcode and CLTs may be different
</span><span style='display:block; white-space:pre;color:#404040;'>    versions.
</span>---
 src/macports1.0/macports.tcl  | 71 ++++++++++++++++++++++++++++++++++---------
 src/port1.0/portconfigure.tcl |  3 +-
 2 files changed, 58 insertions(+), 16 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 998a1dc09..8978ef6cc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1622,17 +1622,31 @@ match macports.conf.default."
</span> 
 # call this just before you exit
 proc mportshutdown {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # save ping times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[file writable $::macports::portdbpath]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        catch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::portdbpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # save cached values
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file writable $portdbpath]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        global macports::ping_cache macports::compiler_version_cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {
</span>             # don't save expired entries
             set now [clock seconds]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set pinglist_fresh [dict filter $::macports::ping_cache script {host entry} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set pinglist_fresh [dict filter $ping_cache script {host entry} {
</span>                 expr {$now - [lindex $entry 1] < 86400}
             }]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set pingfile [open ${::macports::portdbpath}/pingtimes w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set pingfile [open ${portdbpath}/pingtimes w]
</span>             puts $pingfile $pinglist_fresh
             close $pingfile
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        } result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Error writing ${portdbpath}/pingtimes: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists compiler_version_cache]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                file mkdir ${portdbpath}/cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set versfile [open ${portdbpath}/cache/compiler_versions w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts $versfile $compiler_version_cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                close $versfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug "Error writing ${portdbpath}/cache/compiler_versions: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5966,20 +5980,47 @@ proc macports::set_pingtime {host ms} {
</span>     dict set ::macports::ping_cache $host [list $ms [clock seconds]]
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# get the version of a compiler (memoized)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc macports::get_compiler_version {compiler} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::compiler_version_cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# get the version of a compiler (cached)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::get_compiler_version {compiler developer_dir} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable compiler_version_cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists compiler_version_cache]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        variable xcodeversion; variable xcodecltversion; variable portdbpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        macports_try -pass_signal {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set versfile -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set versfile [open ${portdbpath}/cache/compiler_versions r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set compiler_version_cache [dict create {*}[gets $versfile]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } on error {errorInfo} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set compiler_version_cache [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "Error loading ${portdbpath}/cache/compiler_versions: $errorInfo"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } finally {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$versfile != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                close $versfile
</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;'>+        # Invalidate if Xcode or CLT version changed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {([dict exists $compiler_version_cache xcodeversion]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && $xcodeversion ne [dict get $compiler_version_cache xcodeversion])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                || ([dict exists $compiler_version_cache xcodecltversion]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && $xcodecltversion ne [dict get $compiler_version_cache xcodecltversion])} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set compiler_version_cache [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict size $compiler_version_cache] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set compiler_version_cache xcodeversion $xcodeversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set compiler_version_cache xcodecltversion $xcodecltversion
</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:#ffe0e0;'>-    if {[info exists compiler_version_cache($compiler)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return $compiler_version_cache($compiler)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $compiler_version_cache versions $developer_dir $compiler]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [dict get $compiler_version_cache versions $developer_dir $compiler]
</span>     }
 
     if {![file executable ${compiler}]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set compiler_version_cache($compiler) ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set compiler_version_cache versions $developer_dir $compiler ""
</span>         return ""
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    switch [file tail ${compiler}] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch -- [file tail ${compiler}] {
</span>         clang {
             set re {clang(?:_.*)?-([0-9.]+)}
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5995,14 +6036,14 @@ proc macports::get_compiler_version {compiler} {
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[catch {regexp ${re} [exec ${compiler} -v 2>@1] -> compiler_version}]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set compiler_version_cache($compiler) ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {regexp ${re} [exec /usr/bin/env DEVELOPER_DIR=${developer_dir} ${compiler} -v 2>@1] -> compiler_version}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set compiler_version_cache versions $developer_dir $compiler ""
</span>         return ""
     }
     if {![info exists compiler_version]} {
         return -code error "couldn't determine build number of compiler \"${compiler}\""
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set compiler_version_cache($compiler) $compiler_version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set compiler_version_cache versions $developer_dir $compiler $compiler_version
</span>     return $compiler_version
 }
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portconfigure.tcl b/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 3f1e4d011..a1d27c5a0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portconfigure.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1301,8 +1301,9 @@ proc portconfigure::get_mpi_wrapper {mpi compiler} {
</span> }
 # utility procedure: get system compiler version by running it
 proc compiler.command_line_tools_version {compiler} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global configure.developer_dir
</span>     set cc [portconfigure::configure_get_compiler cc ${compiler}]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [get_compiler_version ${cc}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [get_compiler_version ${cc} ${configure.developer_dir}]
</span> }
 # internal function to choose compiler fallback list based on platform
 proc portconfigure::get_compiler_fallback {} {
</pre><pre style='margin:0'>

</pre>