<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>