<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/2564ab3eb1ebe37209073176f7d085ba1b2177df">https://github.com/macports/macports-base/commit/2564ab3eb1ebe37209073176f7d085ba1b2177df</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 2564ab3  Store C++ stdlib info in the registry
</span>2564ab3 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 2564ab3eb1ebe37209073176f7d085ba1b2177df
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Mar 7 02:46:20 2018 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Store C++ stdlib info in the registry
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    There are two new registry properties for ports:
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    cxx_stdlib - this can be either "libc++" or "libstdc++" for most ports
</span><span style='display:block; white-space:pre;color:#404040;'>    that use C++, or "none" for ports that don't. It can also be "mixed"
</span><span style='display:block; white-space:pre;color:#404040;'>    for ports that end up linked to both runtimes for whatever reason.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    cxx_stdlib_overridden - this is 1 if the port changed configure.cxx_stdlib
</span><span style='display:block; white-space:pre;color:#404040;'>    from its default value, 0 otherwise.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Since we need the info to figure out stdlib linkage, the 'binary'
</span><span style='display:block; white-space:pre;color:#404040;'>    registry attribute for files is now set at install time.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    All this new info is also stored in the archive metadata.
</span>---
 src/cregistry/sql.c         | 97 +++++++++++++++++++++++++++++++++++++++++++-
 src/port1.0/portinstall.tcl | 99 +++++++++++++++++++++++++++++++++++++++++++--
 src/port1.0/portutil.tcl    | 22 +++++++++-
 src/registry2.0/entryobj.c  |  6 +++
 4 files changed, 217 insertions(+), 7 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/sql.c b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 8fa681b..7231918 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -134,7 +134,7 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span> 
         /* metadata table */
         "CREATE TABLE registry.metadata (key UNIQUE, value)",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        "INSERT INTO registry.metadata (key, value) VALUES ('version', '1.203')",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "INSERT INTO registry.metadata (key, value) VALUES ('version', '1.204')",
</span>         "INSERT INTO registry.metadata (key, value) VALUES ('created', strftime('%s', 'now'))",
 
         /* ports table */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -155,6 +155,8 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span>             ", requested INTEGER"
             ", os_platform TEXT"
             ", os_major INTEGER"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            ", cxx_stdlib TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ", cxx_stdlib_overridden INTEGER"
</span>             ", UNIQUE (name, epoch, version, revision, variants)"
             ")",
         "CREATE INDEX registry.port_name ON ports"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -616,6 +618,97 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span>             continue;
         }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (sql_version(NULL, -1, version, -1, "1.204") < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            /* add */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            static char* version_1_204_queries[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if SQLITE_VERSION_NUMBER >= 3002000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "ALTER TABLE registry.ports ADD COLUMN cxx_stdlib TEXT",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "ALTER TABLE registry.ports ADD COLUMN cxx_stdlib_overridden INTEGER",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Create a temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE TEMPORARY TABLE mp_ports_backup ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", portfile TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", location TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", epoch INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", version TEXT COLLATE VERSION"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", revision INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", negated_variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", state TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", date DATETIME"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", installtype TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", archs TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", requested INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_platform TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_major INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", UNIQUE (name, epoch, version, revision, variants)"
</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;'>+                /* Copy all data into the temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "INSERT INTO mp_ports_backup SELECT id, name, portfile, location, epoch, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "version, revision, variants, negated_variants, state, date, installtype, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "archs, requested, os_platform, os_major FROM registry.ports",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Drop the original table and re-create it with the new structure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "DROP TABLE registry.ports",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE TABLE registry.ports ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", portfile TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", location TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", epoch INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", version TEXT COLLATE VERSION"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", revision INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", negated_variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", state TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", date DATETIME"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", installtype TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", archs TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", requested INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_platform TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_major INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib_overridden INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", UNIQUE (name, epoch, version, revision, variants)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ")",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE INDEX registry.port_name ON ports"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "(name, epoch, version, revision, variants)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE INDEX registry.port_state ON ports(state)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Copy all data back from temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "INSERT INTO registry.ports (id, name, portfile, location, epoch, version, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "revision, variants, negated_variants, state, date, installtype, archs, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "requested, os_platform, os_major) SELECT id, name, portfile, location, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "epoch, version, revision, variants, negated_variants, state, date, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "installtype, archs, requested, os_platform, os_major "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "FROM mp_ports_backup",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Remove temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "DROP TABLE mp_ports_backup",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "UPDATE registry.metadata SET value = '1.204' WHERE key = 'version'",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "COMMIT",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                NULL
</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;'>+            sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            stmt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if (!do_queries(db, version_1_204_queries, errPtr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                rollback_db(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 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;'>+            did_update = 1;
</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;'>+
</span>         /* add new versions here, but remember to:
          *  - finalize the version query statement and set stmt to NULL
          *  - do _not_ use "BEGIN" in your query list, since a transaction has
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -625,7 +718,7 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span>          *  - update the current version number below
          */
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (sql_version(NULL, -1, version, -1, "1.203") > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (sql_version(NULL, -1, version, -1, "1.204") > 0) {
</span>             /* the registry was already upgraded to a newer version and cannot be used anymore */
             reg_throw(errPtr, REG_INVALID, "Version number in metadata table is newer than expected.");
             sqlite3_finalize(stmt);
<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 0053ab9..b4f0b0d 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;'>@@ -34,6 +34,7 @@
</span> package provide portinstall 1.0
 package require portutil 1.0
 package require registry2 2.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require machista 1.0
</span> 
 set org.macports.install [target_new org.macports.install portinstall::install_main]
 target_provides ${org.macports.install} install
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,6 +53,60 @@ default install.asroot no
</span> 
 set_ui_prefix
 
<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 portinstall::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> proc portinstall::install_start {args} {
     global UI_PREFIX subport version revision portvariants \
            prefix registry_open registry.path
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -77,7 +132,9 @@ proc portinstall::install_start {args} {
</span> 
 proc portinstall::create_archive {location archive.type} {
     global workpath destpath portpath subport version revision portvariants \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-           epoch PortInfo installPlist \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           epoch configure.cxx_stdlib portinstall::actual_cxx_stdlib \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           portinstall::file_is_binary portinstall::cxx_stdlib_overridden \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           cxx_stdlib PortInfo installPlist \
</span>            archive.env archive.cmd archive.pre_args archive.args \
            archive.post_args archive.dir depends_lib depends_run
     set archive.env {}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -264,6 +321,8 @@ proc portinstall::create_archive {location archive.type} {
</span>          }
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set have_fileIsBinary [expr {[option os.platform] eq "darwin"}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set binary_files {}
</span>     # also save the contents for our own use later
     set installPlist {}
     set destpathLen [string length $destpath]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -275,11 +334,21 @@ proc portinstall::create_archive {location archive.type} {
</span>         set relpath [string range $fullpath $destpathLen+1 end]
         if {[string index $relpath 0] ne "+"} {
             puts $fd "$relpath"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            lappend installPlist [file join [file separator] $relpath]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set abspath [file join [file separator] $relpath]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend installPlist $abspath
</span>             if {[file isfile $fullpath]} {
                 ui_debug "checksum file: $fullpath"
                 set checksum [md5 file $fullpath]
                 puts $fd "@comment MD5:$checksum"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$have_fileIsBinary} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # test if (mach-o) binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set is_binary [fileIsBinary $fullpath]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {$is_binary} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend binary_files $fullpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    puts $fd "@comment binary:$is_binary"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set portinstall::file_is_binary($abspath) $is_binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>             }
         } else {
             lappend control $relpath
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -289,6 +358,14 @@ proc portinstall::create_archive {location archive.type} {
</span>         puts $fd "@ignore"
         puts $fd "$relpath"
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portinstall::actual_cxx_stdlib [get_actual_cxx_stdlib $binary_files]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $fd "@cxx_stdlib ${portinstall::actual_cxx_stdlib}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${portinstall::actual_cxx_stdlib} ne "none"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portinstall::cxx_stdlib_overridden [expr {${configure.cxx_stdlib} ne $cxx_stdlib}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portinstall::cxx_stdlib_overridden 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $fd "@cxx_stdlib_overridden ${portinstall::cxx_stdlib_overridden}"
</span>     close $fd
 
     # Now create the archive
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -311,7 +388,8 @@ proc portinstall::extract_contents {location type} {
</span> proc portinstall::install_main {args} {
     global subport version portpath depends_run revision user_options \
     portvariants negated_variants depends_lib PortInfo epoch \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    os.platform os.major portarchivetype installPlist registry.path porturl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    os.platform os.major portarchivetype installPlist registry.path porturl \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    portinstall::file_is_binary portinstall::actual_cxx_stdlib portinstall::cxx_stdlib_overridden
</span> 
     set oldpwd [pwd]
     if {$oldpwd eq ""} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -326,7 +404,12 @@ proc portinstall::install_main {args} {
</span>         file rename -force $archive_path $install_dir
         set location [file join $install_dir [file tail $archive_path]]
         set current_archive_type [string range [file extension $location] 1 end]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set installPlist [extract_contents $location $current_archive_type]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set contents [extract_contents $location $current_archive_type]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set installPlist [lindex $contents 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinstall::file_is_binary [lindex $contents 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cxxinfo [extract_archive_metadata $location $current_archive_type cxx_info]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portinstall::actual_cxx_stdlib [lindex $cxxinfo 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portinstall::cxx_stdlib_overridden [lindex $cxxinfo 1]
</span>     } else {
         # throws an error if an unsupported value has been configured
         archiveTypeIsSupported $portarchivetype
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -359,6 +442,10 @@ proc portinstall::install_main {args} {
</span>         $regref os_platform ${os.platform}
         $regref os_major ${os.major}
         $regref archs [get_canonical_archs]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {${portinstall::actual_cxx_stdlib} ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $regref cxx_stdlib ${portinstall::actual_cxx_stdlib}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $regref cxx_stdlib_overridden ${portinstall::cxx_stdlib_overridden}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>         # Trick to have a portable GMT-POSIX epoch-based time.
         $regref date [expr {[clock scan now -gmt true] - [clock scan "1970-1-1 00:00:00" -gmt true]}]
         if {[info exists negated_variants]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -376,6 +463,10 @@ proc portinstall::install_main {args} {
</span>         if {[info exists installPlist]} {
             # register files
             $regref map $installPlist
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach f [array names portinstall::file_is_binary] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set fileref [registry::file open [$regref id] $f]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                $fileref binary $portinstall::file_is_binary($f)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
 
         # store portfile
<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 9277e98..31fd56b 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;'>@@ -2714,6 +2714,7 @@ proc extract_archive_metadata {archive_location archive_type metadata_type} {
</span>     }
     if {$metadata_type eq "contents"} {
         set contents {}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        set binary_info {}
</span>         set ignore 0
         set sep [file separator]
         foreach line [split $raw_contents \n] {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2725,9 +2726,11 @@ proc extract_archive_metadata {archive_location archive_type metadata_type} {
</span>                 lappend contents "${sep}${line}"
             } elseif {$line eq "@ignore"} {
                 set ignore 1
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            } elseif {[string range $line 0 15] eq "@comment binary:"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend binary_info [lindex $contents end] [string range $line 16 end]
</span>             }
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return $contents
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [list $contents $binary_info]
</span>     } elseif {$metadata_type eq "portname"} {
         foreach line [split $raw_contents \n] {
             if {[lindex $line 0] eq "@portname"} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2735,6 +2738,23 @@ proc extract_archive_metadata {archive_location archive_type metadata_type} {
</span>             }
         }
         return ""
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    } elseif {$metadata_type eq "cxx_info"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set val_cxx_stdlib ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set val_cxx_stdlib_overridden ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach line [split $raw_contents \n] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[lindex $line 0] eq "@cxx_stdlib"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set val_cxx_stdlib [lindex $line 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$val_cxx_stdlib_overridden ne ""} {
</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;'>+            } elseif {[lindex $line 0] eq "@cxx_stdlib_overridden"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set val_cxx_stdlib_overridden [lindex $line 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$val_cxx_stdlib ne ""} {
</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;'>+        return [list $val_cxx_stdlib $val_cxx_stdlib_overridden]
</span>     } else {
         return -code error "unknown metadata_type: $metadata_type"
     }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/entryobj.c b/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 4ae52db..df79c97 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -39,6 +39,7 @@
</span> #include "util.h"
 
 const char* entry_props[] = {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    "id",
</span>     "name",
     "portfile",
     "location",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -54,6 +55,8 @@ const char* entry_props[] = {
</span>     "os_platform",
     "os_major",
     "requested",
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    "cxx_stdlib",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "cxx_stdlib_overridden",
</span>     NULL
 };
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -415,6 +418,7 @@ typedef struct {
</span> 
 static entry_obj_cmd_type entry_cmds[] = {
     /* keys */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    { "id", entry_obj_prop },
</span>     { "name", entry_obj_prop },
     { "portfile", entry_obj_prop },
     { "location", entry_obj_prop },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -430,6 +434,8 @@ static entry_obj_cmd_type entry_cmds[] = {
</span>     { "os_platform", entry_obj_prop },
     { "os_major", entry_obj_prop },
     { "requested", entry_obj_prop },
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    { "cxx_stdlib", entry_obj_prop },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    { "cxx_stdlib_overridden", entry_obj_prop },
</span>     /* filemap */
     { "map", entry_obj_filemap },
     { "unmap", entry_obj_filemap },
</pre><pre style='margin:0'>

</pre>