<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/c8190214b54cb4e80bb6b613c0b78d1ed1a926f2">https://github.com/macports/macports-base/commit/c8190214b54cb4e80bb6b613c0b78d1ed1a926f2</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit c8190214b54cb4e80bb6b613c0b78d1ed1a926f2
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Mar 7 06:56:30 2018 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Check C++ stdlib in rev-upgrade
</span>---
 src/macports1.0/macports.tcl | 102 ++++++++++++++++++++++++++++++++++++++++++-
 src/port1.0/portinstall.tcl  |  54 -----------------------
 2 files changed, 100 insertions(+), 56 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 c4bb831..61cdbe8 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;'>@@ -1377,6 +1377,7 @@ proc macports::worker_init {workername portpath porturl portbuildpath options va
</span>     $workername alias realpath realpath
     $workername alias _mportsearchpath _mportsearchpath
     $workername alias _portnameactive _portnameactive
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    $workername alias get_actual_cxx_stdlib macports::get_actual_cxx_stdlib
</span> 
     # New Registry/Receipts stuff
     $workername alias registry_new registry::new_entry
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4433,6 +4434,61 @@ proc macports::reclaim_main {opts} {
</span>     return 0
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# given a list of binaries, determine which C++ stdlib is used (if any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::get_actual_cxx_stdlib {binaries} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$binaries eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return "none"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set handle [machista::create_handle]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$handle eq "NULL"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        error "Error creating libmachista handle"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set stdlibs {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach b $binaries {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set resultlist [machista::parse_file $handle $b]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set returncode [lindex $resultlist 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result     [lindex $resultlist 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$returncode != $machista::SUCCESS} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$returncode == $machista::EMAGIC} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # not a Mach-O file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # ignore silently, these are only static libs anyway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug "Error parsing file ${b}: [machista::strerror $returncode]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</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 architecture [$result cget -mt_archs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        while {$architecture ne "NULL"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set loadcommand [$architecture cget -mat_loadcmds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            while {$loadcommand ne "NULL"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set libname [file tail [$loadcommand cget -mlt_install_name]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[string match libc++*.dylib $libname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set stdlibs(libc++) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {[string match libstdc++*.dylib $libname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set stdlibs(libstdc++) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set loadcommand [$loadcommand cget -next]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set architecture [$architecture cget -next]
</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;'>+    machista::destroy_handle $handle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists stdlibs(libc++)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists stdlibs(libstdc++)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return "mixed"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return "libc++"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {[info exists stdlibs(libstdc++)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return "libstdc++"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return "none"
</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;'>+
</span> ##
 # Execute the rev-upgrade scan and attempt to rebuild all ports found to be
 # broken. Depends on the revupgrade_mode setting from macports.conf.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4549,7 +4605,39 @@ proc macports::revupgrade_scanandrebuild {broken_port_counts_name opts} {
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set broken_files {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set maybe_cxx_ports [registry::entry search state installed cxx_stdlib -null]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set maybe_cxx_len [llength $maybe_cxx_ports]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$maybe_cxx_len > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "$macports::ui_prefix Updating database of C++ stdlib usage"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set i 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$fancy_output} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $revupgrade_progress start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        registry::write {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach maybe_port $maybe_cxx_ports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$fancy_output} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    $revupgrade_progress update $i $maybe_cxx_len
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                incr i
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set portid [$maybe_port id]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set binary_files {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach maybe_binary [$maybe_port imagefiles] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set filehandle [registry::file open $portid $maybe_binary]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {![catch {$filehandle binary} isbinary] && $isbinary} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend binary_files [$filehandle actual_path]
</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;'>+                $maybe_port cxx_stdlib [get_actual_cxx_stdlib $binary_files]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # can't tell after the fact, assume not overridden
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                $maybe_port cxx_stdlib_overridden 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;'>+        if {$fancy_output} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $revupgrade_progress finish
</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;'>+    set broken_files {}
</span>     set binaries [registry::file search active 1 binary 1]
     set binary_count [llength $binaries]
     if {$binary_count > 0} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4781,7 +4869,17 @@ proc macports::revupgrade_scanandrebuild {broken_port_counts_name opts} {
</span>                 ui_error "Broken file $file doesn't belong to any port."
             }
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set broken_ports [lsort -unique $broken_ports]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # check for mismatched cxx_stdlib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {${macports::cxx_stdlib} eq "libc++"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set wrong_stdlib libstdc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set wrong_stdlib libc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set broken_cxx_ports [registry::entry search state installed cxx_stdlib_overridden 0 cxx_stdlib $wrong_stdlib]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach cxx_port $broken_cxx_ports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_info "[$cxx_port name] is using $wrong_stdlib (this installation is configured to use ${macports::cxx_stdlib})"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set broken_ports [lsort -unique [concat $broken_ports $broken_cxx_ports]]
</span> 
         if {$macports::revupgrade_mode eq "rebuild"} {
             # don't try to rebuild ports that don't exist in the tree
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portinstall.tcl b/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index b4f0b0d..a288bd6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -53,60 +53,6 @@ default install.asroot no
</span> 
 set_ui_prefix
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# given a list of binaries, determine which C++ stdlib is used (if any)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portinstall::get_actual_cxx_stdlib {binaries} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$binaries eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "none"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set handle [machista::create_handle]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$handle eq "NULL"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        error "Error creating libmachista handle"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set stdlibs {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach b $binaries {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set resultlist [machista::parse_file $handle $b]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set returncode [lindex $resultlist 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set result     [lindex $resultlist 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$returncode != $machista::SUCCESS} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$returncode == $machista::EMAGIC} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # not a Mach-O file
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # ignore silently, these are only static libs anyway
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_debug "Error parsing file ${b}: [machista::strerror $returncode]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set architecture [$result cget -mt_archs]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        while {$architecture ne "NULL"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set loadcommand [$architecture cget -mat_loadcmds]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            while {$loadcommand ne "NULL"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set libname [file tail [$loadcommand cget -mlt_install_name]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {[string match libc++*.dylib $libname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set stdlibs(libc++) 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } elseif {[string match libstdc++*.dylib $libname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set stdlibs(libstdc++) 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set loadcommand [$loadcommand cget -next]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set architecture [$architecture cget -next]
</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;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    machista::destroy_handle $handle
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists stdlibs(libc++)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists stdlibs(libstdc++)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return "mixed"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return "libc++"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } elseif {[info exists stdlibs(libstdc++)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "libstdc++"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "none"
</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;'>-
</span> proc portinstall::install_start {args} {
     global UI_PREFIX subport version revision portvariants \
            prefix registry_open registry.path
</pre><pre style='margin:0'>

</pre>