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