<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/46bc1af4c830b63440f10d1743d99a3092392061">https://github.com/macports/macports-base/commit/46bc1af4c830b63440f10d1743d99a3092392061</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 46bc1af4c830b63440f10d1743d99a3092392061
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat Mar 9 11:23:05 2024 +1100
<span style='display:block; white-space:pre;color:#404040;'> Cache xcodecltversion
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Also refresh cached xcodeversion if OS major version changes.
</span>---
src/macports1.0/macports.tcl | 91 +++++++++++++++++++++++++++++++++++---------
1 file changed, 72 insertions(+), 19 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 e479274cb..f88e31f46 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;'>@@ -540,6 +540,7 @@ proc macports::save_cache {filename cache} {
</span> proc macports::setxcodeinfo {name1 name2 op} {
variable xcodeversion; variable xcodebuildcmd
variable developer_dir; variable portdbpath
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ variable os_major
</span>
trace remove variable xcodeversion read macports::setxcodeinfo
trace remove variable xcodebuildcmd read macports::setxcodeinfo
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -551,6 +552,17 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span> set xcodeversion {}
# First try the cache
set xcodeinfo_cache [load_cache xcodeinfo]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Refresh everything if the OS major version changed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[dict exists $xcodeinfo_cache os_major]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && [dict get $xcodeinfo_cache os_major] != $os_major
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodeinfo_cache [dict create]
</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;'>+ # The same cache file is used for xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set clt_refreshed [set_xcodecltversion xcodeinfo_cache]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Figure out which file to check to see if Xcode was updated
if {[file extension [file dirname [file dirname $developer_dir]]] eq ".app"} {
# New style, Developer dir inside Xcode.app
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -560,6 +572,7 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span> set checkfile ${developer_dir}/Applications/Xcode.app/Contents/Info.plist
}
set checkfile_found [file isfile $checkfile]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcode_refresh 1
</span> if {$checkfile_found && [dict exists $xcodeinfo_cache $checkfile mtime]
&& [dict exists $xcodeinfo_cache $checkfile xcodeversion]
&& [dict exists $xcodeinfo_cache $checkfile xcodebuildcmd]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -570,12 +583,16 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span> if {!${xcodebuildcmd_overridden}} {
set xcodebuildcmd [dict get $xcodeinfo_cache $checkfile xcodebuildcmd]
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {!$clt_refreshed} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcode_refresh 0
</span> } else {
ui_debug "Xcode mtime has changed, refreshing version info"
}
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$xcode_refresh} {
</span> macports_try -pass_signal {
set xcodebuild [findBinary xcodebuild $macports::autoconf::xcodebuild_path]
if {!${xcodeversion_overridden}} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -644,6 +661,7 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span> set xcodebuildcmd none
}
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
if {[file writable $portdbpath]} {
if {$checkfile_found} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -656,9 +674,10 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span> }
}
# Remove any entries for Xcode installations that no longer exist
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set xcodeinfo_cache [dict filter $xcodeinfo_cache script {filename info} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- file isfile $filename
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodeinfo_cache [dict filter $xcodeinfo_cache script {key info} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ expr {[string index $key 0] ne "/" || [file isfile $key]}
</span> }]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set xcodeinfo_cache os_major $os_major
</span> save_cache xcodeinfo $xcodeinfo_cache
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -777,13 +796,27 @@ proc macports::_is_valid_developer_dir {dir} {
</span> }
# deferred calculation of xcodecltversion
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc macports::set_xcodecltversion {name1 name2 op} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @return 1 if cachevar has been updated, 0 otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::set_xcodecltversion {cachevar} {
</span> variable xcodecltversion
<span style='display:block; white-space:pre;background:#ffe0e0;'>- trace remove variable xcodecltversion read macports::set_xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace remove variable xcodecltversion read macports::setxcodeinfo
</span>
if {[info exists xcodecltversion]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Same test as used to set the default for use_xcode
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![file executable /Library/Developer/CommandLineTools/usr/bin/make]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</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;'>+ upvar $cachevar cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[dict exists $cache clt version] && [dict exists $cache clt mtime]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && [dict exists $cache clt checkfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && [file mtime [dict get $cache clt checkfile]] == [dict get $cache clt mtime]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodecltversion [dict get $cache clt version]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</span> }
# Potential names for the CLTs pkg on different OS versions.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -791,9 +824,10 @@ proc macports::set_xcodecltversion {name1 name2 op} {
</span>
if {[catch {exec -ignorestderr /usr/sbin/pkgutil --pkgs=com\\.apple\\.pkg\\.([join $pkgnames |]) 2> /dev/null} result]} {
set xcodecltversion none
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</span> }
set pkgs [split $result \n]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ set found_pkgname {}
</span> # Check in order from newest to oldest, just in case something
# stuck around from an older OS version.
foreach pkgname $pkgnames {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -804,16 +838,34 @@ proc macports::set_xcodecltversion {name1 name2 op} {
</span> lassign [split $line] name val
if {$name eq "version:"} {
set xcodecltversion $val
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set found_pkgname $fullpkgname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span> }
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$found_pkgname ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> } else {
ui_debug "set_xcodecltversion: Failed to get info for installed pkg ${fullpkgname}: $result"
}
}
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$found_pkgname ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # TODO: See if there are more possible locations.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach dir {/Library/Apple/System/Library/Receipts /private/var/db/receipts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set checkfile ${dir}/${found_pkgname}.plist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[file exists $checkfile]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set cache clt checkfile $checkfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set cache clt mtime [file mtime $checkfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dict set cache clt version $xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1
</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;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0
</span> }
proc macports::set_xcode_license_unaccepted {name1 name2 op} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1553,18 +1605,19 @@ match macports.conf.default."
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if {![info exists xcodeversion] || ![info exists xcodebuildcmd]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # We'll resolve these later (if needed)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable xcodeversion read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable xcodebuildcmd read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {![info exists xcodecltversion]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {$os_platform eq "darwin"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable xcodecltversion read macports::set_xcodecltversion
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set xcodecltversion {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$os_platform eq "darwin"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![info exists xcodeversion] || ![info exists xcodebuildcmd] || ![info exists xcodecltversion]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # We'll resolve these later (if needed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable xcodeversion read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable xcodebuildcmd read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable xcodecltversion read macports::setxcodeinfo
</span> }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodeversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodebuildcmd none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set xcodecltversion none
</span> }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> if {![info exists xcode_license_unaccepted]} {
if {$os_platform eq "darwin"} {
trace add variable xcode_license_unaccepted read macports::set_xcode_license_unaccepted
</pre><pre style='margin:0'>
</pre>