[Cmake-commits] CMake branch, next, updated. v3.4.1-1987-ga10f081

Brad King brad.king at kitware.com
Fri Jan 15 14:53:41 EST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  a10f0819c3ddff6527b8ff2524a66079a245468e (commit)
       via  3ec9226779776811240bde88a3f173c29aa935b5 (commit)
      from  e37e3f18ca209a04568c1d40420fb385fff71aad (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a10f0819c3ddff6527b8ff2524a66079a245468e
commit a10f0819c3ddff6527b8ff2524a66079a245468e
Merge: e37e3f1 3ec9226
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Jan 15 14:53:41 2016 -0500
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Jan 15 14:53:41 2016 -0500

    Merge topic 'rpath-preserve-compiler-defined' into next
    
    3ec92267 install: Do not remove compiler-defined RPATH entries


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3ec9226779776811240bde88a3f173c29aa935b5
commit 3ec9226779776811240bde88a3f173c29aa935b5
Author:     Lior Goldberg <liorgol.dev at gmail.com>
AuthorDate: Fri Dec 25 15:08:51 2015 +0200
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 15 14:53:24 2016 -0500

    install: Do not remove compiler-defined RPATH entries
    
    Some compilers may add their own RPATH entries when invoking the linker.
    For example, a GCC installation may contain the following definition in
    the specs file:
    
      *link_libgcc:
      %D -rpath <<some specific rpath in which libstdc++.so can be found>>
    
    In this case binaries may contain RPATH entries that CMake did not add.
    When we update the RPATH on installation we must preserve these entries
    even if CMake thinks the INSTALL_RPATH value should be empty.
    
    Fix this by always using file(RPATH_CHANGE) and teach it to behave as
    file(RPATH_REMOVE) if the actual RPATH in the file is empty after
    replacing the build-tree RPATH with the install-tree RPATH.  This will
    preserve any compiler-added RPATH value instead of removing it.

diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx
index 1158a27..5e88fa2 100644
--- a/Source/cmInstallTargetGenerator.cxx
+++ b/Source/cmInstallTargetGenerator.cxx
@@ -791,18 +791,10 @@ cmInstallTargetGenerator
       }
 
     // Write a rule to run chrpath to set the install-tree RPATH
-    if(newRpath.empty())
-      {
-      os << indent << "file(RPATH_REMOVE\n"
-         << indent << "     FILE \"" << toDestDirPath << "\")\n";
-      }
-    else
-      {
-      os << indent << "file(RPATH_CHANGE\n"
-         << indent << "     FILE \"" << toDestDirPath << "\"\n"
-         << indent << "     OLD_RPATH \"" << oldRpath << "\"\n"
-         << indent << "     NEW_RPATH \"" << newRpath << "\")\n";
-      }
+    os << indent << "file(RPATH_CHANGE\n"
+       << indent << "     FILE \"" << toDestDirPath << "\"\n"
+       << indent << "     OLD_RPATH \"" << oldRpath << "\"\n"
+       << indent << "     NEW_RPATH \"" << newRpath << "\")\n";
     }
 }
 
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 008272c..a89a6e0b 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2565,6 +2565,7 @@ bool cmSystemTools::ChangeRPath(std::string const& file,
     *changed = false;
     }
   int rp_count = 0;
+  bool remove_rpath = true;
   cmSystemToolsRPathInfo rp[2];
   {
   // Parse the ELF binary.
@@ -2622,6 +2623,7 @@ bool cmSystemTools::ChangeRPath(std::string const& file,
       // If it contains the new rpath instead then it is okay.
       if(cmSystemToolsFindRPath(se[i]->Value, newRPath) != std::string::npos)
         {
+        remove_rpath = false;
         continue;
         }
       if(emsg)
@@ -2642,13 +2644,30 @@ bool cmSystemTools::ChangeRPath(std::string const& file,
     rp[rp_count].Size = se[i]->Size;
     rp[rp_count].Name = se_name[i];
 
+    std::string::size_type prefix_len = pos;
+
+    // If oldRPath was at the end of the file's RPath, and newRPath is empty,
+    // we should remove the unnecessary ':' at the end.
+    if (newRPath.empty() &&
+        pos > 0 &&
+        se[i]->Value[pos - 1] == ':' &&
+        pos + oldRPath.length() == se[i]->Value.length())
+      {
+      prefix_len--;
+      }
+
     // Construct the new value which preserves the part of the path
     // not being changed.
-    rp[rp_count].Value = se[i]->Value.substr(0, pos);
+    rp[rp_count].Value = se[i]->Value.substr(0, prefix_len);
     rp[rp_count].Value += newRPath;
     rp[rp_count].Value += se[i]->Value.substr(pos+oldRPath.length(),
                                               oldRPath.npos);
 
+    if (!rp[rp_count].Value.empty())
+      {
+      remove_rpath = false;
+      }
+
     // Make sure there is enough room to store the new rpath and at
     // least one null terminator.
     if(rp[rp_count].Size < rp[rp_count].Value.length()+1)
@@ -2673,6 +2692,12 @@ bool cmSystemTools::ChangeRPath(std::string const& file,
     return true;
     }
 
+  // If the resulting rpath is empty, just remove the entire entry instead.
+  if (remove_rpath)
+    {
+    return cmSystemTools::RemoveRPath(file, emsg, changed);
+    }
+
   {
   // Open the file for update.
   cmsys::ofstream f(file.c_str(),

-----------------------------------------------------------------------

Summary of changes:


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list