<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/d5ecda98d56985aa9c257a902ad13ffc5c592da8">https://github.com/macports/macports-base/commit/d5ecda98d56985aa9c257a902ad13ffc5c592da8</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new d5ecda98d Allow portindex -p to override arbitrary variables
</span>d5ecda98d is described below

<span style='display:block; white-space:pre;color:#808000;'>commit d5ecda98d56985aa9c257a902ad13ffc5c592da8
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Apr 15 13:48:16 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Allow portindex -p to override arbitrary variables
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Files containing overrides for each supported platform will be added to
</span><span style='display:block; white-space:pre;color:#404040;'>    an appropriate repo for the use of the portindex job.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/71755
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://github.com/macports/macports-base/pull/361
</span>---
 src/macports1.0/macports.tcl |  18 ++++++
 src/port/portindex.tcl       | 131 ++++++++++++++++++++++++-------------------
 2 files changed, 91 insertions(+), 58 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 4139f2bff..3ed5ee0c4 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;'>@@ -1898,6 +1898,24 @@ proc mportshutdown {} {
</span>     registry::close
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Override variables. Used by portindex to evaluate Portfiles as though
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# on a different platform.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# vars: a list of pairs of variable names and their desired values.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::override_vars {vars} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {varname value} $vars {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # only allow overrides of existing variables in the macports namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[namespace which -variable ::macports::${varname}] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_warn "Not overriding $varname because it does not exist in the macports namespace"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Remove any traces that might overwrite the var
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach t [trace info variable ::macports::${varname}] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            trace remove variable ::macports::${varname} {*}$t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        variable $varname $value
</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> # link plist for xcode 4.3's benefit
 proc macports::copy_xcode_plist {target_homedir} {
     variable user_home; variable macportsuser
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/portindex.tcl b/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 1ef950267..0d6349e6b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> #!@TCLSH@
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span> # Traverse through all ports, creating an index and archiving port directories
 # if requested
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -16,17 +16,17 @@ set stats [dict create \
</span> set extended_mode 0
 array set ui_options        [list ports_no_old_index_warning 1]
 array set global_options    [list ports_no_load_quick_index 1]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set port_options            [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set var_overrides           [list]
</span> 
 # Pass global options into mportinit
 mportinit ui_options global_options
 
 # Standard procedures
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc print_usage args {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts "Usage: $::argv0 \[-dfe\] \[-o output directory\] \[-p plat_ver_\[cxxlib_\]arch\] \[directory\]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc print_usage {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "Usage: $::argv0 \[-defx\] \[-o output directory\] \[-p plat_ver_arch\] \[directory\]"
</span>     puts "-d:\tOutput debugging information"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts "-f:\tDo a full re-index instead of updating"
</span>     puts "-e:\tExit code indicates if ports failed to parse"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "-f:\tDo a full re-index instead of updating"
</span>     puts "-o:\tOutput all files to specified directory"
     puts "-p:\tPretend to be on another platform"
     puts "-x:\tInclude extra (optional) information in the PortIndex, like variant description and port notes."
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -77,7 +77,7 @@ proc _index_from_portinfo {portinfo {is_subport no}} {
</span>     return [list [dict get $portinfo name] $len $keep_portinfo]
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc _open_port {portdir absportdir port_options {subport {}}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _open_port {portdir absportdir {subport {}}} {
</span>     global macports::prefix
     # Make sure $prefix expands to '${prefix}' so that the PortIndex is
     # portable across prefixes, see https://trac.macports.org/ticket/53169 and
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -86,7 +86,9 @@ proc _open_port {portdir absportdir port_options {subport {}}} {
</span>     macports_try -pass_signal {
         set prefix {${prefix}}
         if {$subport ne {}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            dict set port_options subport $subport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set port_options [dict create subport $subport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set port_options {}
</span>         }
         set mport [mportopen file://$absportdir $port_options]
     } finally {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -102,7 +104,7 @@ proc _open_port {portdir absportdir port_options {subport {}}} {
</span> }
 
 proc pindex {portdir jobnum {subport {}}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global directory full_reindex qindex oldmtime ui_options port_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global directory full_reindex qindex oldmtime ui_options
</span>     try {
         tsv::set status $jobnum 1
         set absportdir [file join $directory $portdir]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -149,7 +151,7 @@ proc pindex {portdir jobnum {subport {}}} {
</span>         }
 
         macports_try -pass_signal {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set portinfo [_open_port $portdir $absportdir $port_options $subport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set portinfo [_open_port $portdir $absportdir $subport]
</span>             if {$is_subport} {
                 puts "Adding subport $subport"
             } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -188,7 +190,7 @@ proc pindex {portdir jobnum {subport {}}} {
</span> 
 proc init_threads {} {
     global worker_init_script qindex keepkeys ui_options \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-           global_options port_options directory \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           global_options var_overrides directory \
</span>            full_reindex oldfd oldmtime maxjobs poolid pending_jobs \
            nextjobnum
     append worker_init_script \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -196,7 +198,6 @@ proc init_threads {} {
</span>         [list set keepkeys $keepkeys] \n \
         [list array set ui_options [array get ui_options]] \n \
         [list array set global_options [array get global_options]] \n \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        [list set port_options $port_options] \n \
</span>         [list set directory $directory] \n \
         [list set full_reindex $full_reindex] \n \
         [list mportinit ui_options global_options] \n \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -205,11 +206,15 @@ proc init_threads {} {
</span>         global outpath
         append worker_init_script \n \
             [list set outpath $outpath] \n \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            {set oldfd [open $outpath r]} \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            {set oldfd [open $outpath r]}
</span>     }
     if {[info exists oldmtime]} {
         append worker_init_script \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            [list set oldmtime $oldmtime] \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n [list set oldmtime $oldmtime]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$var_overrides ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        append worker_init_script \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n [list macports::override_vars $var_overrides]
</span>     }
     set maxjobs [macports::get_parallel_jobs no]
     set poolid [tpool::create -minworkers 1 -maxworkers $maxjobs -initcmd $worker_init_script]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -304,68 +309,78 @@ if {$argc > 8} {
</span>     exit 1
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-for {set i 0} {$i < $argc} {incr i} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set arg [lindex $argv $i]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    switch -regex -- $arg {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        {^-.+} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$arg eq "-d"} { # Turn on debug output
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc parse_args {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global argc argv
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    for {set i 0} {$i < $argc} {incr i} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set arg [lindex $argv $i]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        switch -glob -- $arg {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -d { # Turn on debug output
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global ui_options
</span>                 set ui_options(ports_debug) yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$arg eq "-o"} { # Set output directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -e { # Non-zero exit code on errors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global permit_error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set permit_error 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -f { # Completely rebuild index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global full_reindex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set full_reindex 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -o { # Set output directory
</span>                 incr i
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                global outdir
</span>                 set outdir [file join [pwd] [lindex $argv $i]]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$arg eq "-p"} { # Set platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -p { # Simulate platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global var_overrides
</span>                 incr i
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set platlist [split [lindex $argv $i] _]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set os_platform [lindex $platlist 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set os_major [lindex $platlist 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {[llength $platlist] > 3} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set cxx_stdlib [lindex $platlist 2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    switch -- $cxx_stdlib {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        libcxx {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set cxx_stdlib libc++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        libstdcxx {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set cxx_stdlib libstdc++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            puts stderr "Unknown C++ standard library: $cxx_stdlib (use libcxx or libstdcxx)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            print_usage
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            exit 1
</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;'>-                    set os_arch [lindex $platlist 3]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set plat_arg [lindex $argv $i]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[string match file:* $plat_arg]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Read variables to override from a file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set filename [string range $plat_arg [string first : $plat_arg]+1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set fd [open $filename r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    gets $fd var_overrides
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    close $fd
</span>                 } else {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Use basic variable overrides based on platform name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set platlist [split $plat_arg _]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[llength $platlist] != 3} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        puts stderr "Platform specifier should be of the form plat_ver_arch"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        print_usage
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set os_platform [lindex $platlist 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set os_major [lindex $platlist 1]
</span>                     if {$os_platform eq "macosx"} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if {$os_major < 10} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set cxx_stdlib libstdc++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set cxx_stdlib libc++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set cxx_stdlib [expr {$os_major < 10 ? "libstdc++" : "libc++"}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend var_overrides macports::os_subplatform $os_platform \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              macports::cxx_stdlib $cxx_stdlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set os_platform darwin
</span>                     }
                     set os_arch [lindex $platlist 2]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend var_overrides macports::os_platform $os_platform \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          macports::os_major $os_major \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          macports::os_version ${os_major}.0.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          macports::os_arch $os_arch
</span>                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$os_platform eq "macosx"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend port_options os.subplatform $os_platform os.universal_supported yes cxx_stdlib $cxx_stdlib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set os_platform darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                lappend port_options os.platform $os_platform os.major $os_major os.version ${os_major}.0.0 os.arch $os_arch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$arg eq "-f"} { # Completely rebuild index
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set full_reindex 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$arg eq "-x"} { # Build extended portindex (include extra information , eg.: notes, variant description, conflicts etc.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -x { # Build extended portindex (include extra information , eg.: notes, variant description, conflicts etc.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global extended_mode
</span>                 set extended_mode 1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$arg eq "-e"} { # Non-zero exit code on errors
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set permit_error 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            -* {
</span>                 puts stderr "Unknown option: $arg"
                 print_usage
                 exit 1
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set directory [file join [pwd] $arg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            default {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                global directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set directory [file join [pwd] $arg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
     }
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+parse_args
</span> 
 if {![info exists directory]} {
     set directory .
</pre><pre style='margin:0'>

</pre>