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