<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/28666188b01ef181a93b36b7468807ae558c5d3b">https://github.com/macports/macports-base/commit/28666188b01ef181a93b36b7468807ae558c5d3b</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 28666188b Support version specifiers in platforms option
</span>28666188b is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 28666188b01ef181a93b36b7468807ae558c5d3b
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Sep 21 23:16:59 2022 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Support version specifiers in platforms option
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    To use this functionality, add one or more elements to platforms of the
</span><span style='display:block; white-space:pre;color:#404040;'>    form: platform operator version [operator version] ...
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Elements that do not have all three of these components are ignored, so
</span><span style='display:block; white-space:pre;color:#404040;'>    existing usage like 'platforms darwin' continues to be displayed but
</span><span style='display:block; white-space:pre;color:#404040;'>    doesn't do anything else.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Each element where the platform matches the current os.platform is
</span><span style='display:block; white-space:pre;color:#404040;'>    processed by applying each operator to compare os.version with the
</span><span style='display:block; white-space:pre;color:#404040;'>    corresponding version. Operators supported are ==, !=, >, <, >= and <=.
</span><span style='display:block; white-space:pre;color:#404040;'>    For == and !=, a string comparison that allows globs is used. For the
</span><span style='display:block; white-space:pre;color:#404040;'>    rest, vercmp is used.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    If any of the comparisons evaluates to false, the default value of
</span><span style='display:block; white-space:pre;color:#404040;'>    known_fail is set to yes.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Usage example: A port that works on Darwin versions between 16 and 22
</span><span style='display:block; white-space:pre;color:#404040;'>    inclusive, except for 18.2.x, and doesn't work on Linux:
</span><span style='display:block; white-space:pre;color:#404040;'>    platforms   {darwin >= 16 != 18.2.* < 23} {linux != *}
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    The special value 'any' can also be used to indicate broad
</span><span style='display:block; white-space:pre;color:#404040;'>    compatibility of binary archives (not of the port itself). This only
</span><span style='display:block; white-space:pre;color:#404040;'>    has an effect on the archive name, allowing the same archive to be used
</span><span style='display:block; white-space:pre;color:#404040;'>    on either all platforms or all versions of one or more platforms.
</span><span style='display:block; white-space:pre;color:#404040;'>    Example, the same archive will work anywhere:
</span><span style='display:block; white-space:pre;color:#404040;'>    platforms   any
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    An archive built on darwin will work on any darwin version, but not
</span><span style='display:block; white-space:pre;color:#404040;'>    on other platforms:
</span><span style='display:block; white-space:pre;color:#404040;'>    platforms   {darwin any}
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This can be combined with version specifiers if needed:
</span><span style='display:block; white-space:pre;color:#404040;'>    platforms   {freebsd any} {darwin > 15}
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/15712
</span>---
 src/port1.0/portmain.tcl |  1 +
 src/port1.0/portutil.tcl | 65 ++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 64 insertions(+), 2 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portmain.tcl b/src/port1.0/portmain.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 23bb4ef6c..154f38094 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portmain.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portmain.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -129,6 +129,7 @@ default install.group {${portutil::autoconf::install_group}}
</span> 
 # Platform Settings
 default platforms darwin
<span style='display:block; white-space:pre;background:#e0ffe0;'>+option_proc platforms _handle_platforms
</span> default os.platform {$os_platform}
 default os.subplatform {$os_subplatform}
 default os.version {$os_version}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index b78b7e8a2..e54c9f490 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -844,6 +844,67 @@ proc platform {args} {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Check platforms for compatibility
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Expected format: list of {os operator version}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Incompatible if any evaluate to false.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Version can be a glob if operator is == or !=.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _handle_platforms {option action args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global os.platform os.subplatform os.version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$action ne "set"} {
</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 compatible 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach p [lindex $args 0] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Other forms like "darwin" or "darwin any" can exist, but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # don't affect this check.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[llength $p] < 3} {
</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;'>+        set osname [lindex $p 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {${os.platform} eq $osname || ${os.subplatform} eq $osname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach {op vers} [lrange $p 1 end] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$op eq "=="} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[string match $vers ${os.version}]} {
</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;'>+                    set compatible 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {$op eq "!="} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {![string match $vers ${os.version}]} {
</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;'>+                    set compatible 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {![vercmp ${os.version} $op $vers]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set compatible 0
</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:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {!$compatible} {
</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:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {!$compatible} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        default known_fail yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Platform specifier for binary archive name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# "any" in platforms means the built archive will work on any OS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# "darwin any" means it will work on any darwin version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _get_archive_platform {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global platforms os.platform os.major
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach p $platforms {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$p eq "any"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return any_any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[lindex $p 0] eq ${os.platform} && [lindex $p 1] eq "any"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return ${os.platform}_any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return ${os.platform}_${os.major}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Portfiles may define more than one port.
 # This executes the given code in 'body' if we were opened as the specified
 # subport, and also adds it to the list of subports that are defined.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2661,12 +2722,12 @@ proc PortGroup {group version} {
</span> # return filename of the archive for this port
 proc get_portimage_name {} {
     global subport version revision portvariants os.platform os.major portarchivetype
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ret "${subport}-${version}_${revision}${portvariants}.${os.platform}_${os.major}.[join [get_canonical_archs] -].${portarchivetype}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ret "${subport}-${version}_${revision}${portvariants}.[_get_archive_platform].[join [get_canonical_archs] -].${portarchivetype}"
</span>     # should really look up NAME_MAX here, but it's 255 for all macOS so far
     # (leave 10 chars for an extension like .rmd160 on the sig file)
     if {[string length $ret] > 245 && ${portvariants} ne ""} {
         # try hashing the variants
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set ret "${subport}-${version}_${revision}+[rmd160 string ${portvariants}].${os.platform}_${os.major}.[join [get_canonical_archs] -].${portarchivetype}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ret "${subport}-${version}_${revision}+[rmd160 string ${portvariants}].[_get_archive_platform].[join [get_canonical_archs] -].${portarchivetype}"
</span>     }
     if {[string length $ret] > 245} {
         error "filename too long: $ret"
</pre><pre style='margin:0'>

</pre>