瀏覽代碼

ENH: When preserving potentially static portions of original user link lines recognize shared library names by their extension and skip them.

Brad King 17 年之前
父節點
當前提交
3a5bdaa213

+ 14 - 2
Source/cmComputeLinkDepends.cxx

@@ -24,6 +24,7 @@
 #include "cmake.h"
 #include "cmake.h"
 
 
 #include <cmsys/stl/algorithm>
 #include <cmsys/stl/algorithm>
+#include <cmsys/RegularExpression.hxx>
 
 
 #include <assert.h>
 #include <assert.h>
 
 
@@ -197,6 +198,12 @@ void cmComputeLinkDepends::SetOldLinkDirMode(bool b)
   this->OldLinkDirMode = b;
   this->OldLinkDirMode = b;
 }
 }
 
 
+//----------------------------------------------------------------------------
+void cmComputeLinkDepends::SetSharedRegex(std::string const& regex)
+{
+  this->SharedRegexString = regex;
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 std::vector<cmComputeLinkDepends::LinkEntry> const&
 std::vector<cmComputeLinkDepends::LinkEntry> const&
 cmComputeLinkDepends::Compute()
 cmComputeLinkDepends::Compute()
@@ -874,6 +881,9 @@ void cmComputeLinkDepends::CheckWrongConfigItem(std::string const& item)
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void cmComputeLinkDepends::PreserveOriginalEntries()
 void cmComputeLinkDepends::PreserveOriginalEntries()
 {
 {
+  // Regular expression to match shared libraries.
+  cmsys::RegularExpression shared_lib(this->SharedRegexString.c_str());
+
   // Skip the part of the input sequence that already appears in the
   // Skip the part of the input sequence that already appears in the
   // output.
   // output.
   std::vector<int>::const_iterator in = this->OriginalEntries.begin();
   std::vector<int>::const_iterator in = this->OriginalEntries.begin();
@@ -882,7 +892,8 @@ void cmComputeLinkDepends::PreserveOriginalEntries()
         out != this->FinalLinkOrder.end())
         out != this->FinalLinkOrder.end())
     {
     {
     cmTarget* tgt = this->EntryList[*in].Target;
     cmTarget* tgt = this->EntryList[*in].Target;
-    if(tgt && tgt->GetType() != cmTarget::STATIC_LIBRARY)
+    if((tgt && tgt->GetType() != cmTarget::STATIC_LIBRARY) ||
+       (!tgt && shared_lib.find(this->EntryList[*in].Item)))
       {
       {
       // Skip input items known to not be static libraries.
       // Skip input items known to not be static libraries.
       ++in;
       ++in;
@@ -905,7 +916,8 @@ void cmComputeLinkDepends::PreserveOriginalEntries()
   while(in != this->OriginalEntries.end())
   while(in != this->OriginalEntries.end())
     {
     {
     cmTarget* tgt = this->EntryList[*in].Target;
     cmTarget* tgt = this->EntryList[*in].Target;
-    if(tgt && tgt->GetType() != cmTarget::STATIC_LIBRARY)
+    if((tgt && tgt->GetType() != cmTarget::STATIC_LIBRARY) ||
+       (!tgt && shared_lib.find(this->EntryList[*in].Item)))
       {
       {
       // Skip input items known to not be static libraries.
       // Skip input items known to not be static libraries.
       ++in;
       ++in;

+ 5 - 0
Source/cmComputeLinkDepends.h

@@ -58,6 +58,10 @@ public:
   std::set<cmTarget*> const& GetOldWrongConfigItems() const
   std::set<cmTarget*> const& GetOldWrongConfigItems() const
     { return this->OldWrongConfigItems; }
     { return this->OldWrongConfigItems; }
 
 
+  /** Set a regular expression that matches strings ending in a shared
+      library extension.  */
+  void SetSharedRegex(std::string const& regex);
+
 private:
 private:
 
 
   // Context information.
   // Context information.
@@ -137,6 +141,7 @@ private:
   // Preservation of original link line.
   // Preservation of original link line.
   std::vector<int> OriginalEntries;
   std::vector<int> OriginalEntries;
   void PreserveOriginalEntries();
   void PreserveOriginalEntries();
+  std::string SharedRegexString;
 
 
   // Compatibility help.
   // Compatibility help.
   bool OldLinkDirMode;
   bool OldLinkDirMode;

+ 4 - 1
Source/cmComputeLinkInformation.cxx

@@ -511,6 +511,7 @@ bool cmComputeLinkInformation::Compute()
   // Compute the ordered link line items.
   // Compute the ordered link line items.
   cmComputeLinkDepends cld(this->Target, this->Config);
   cmComputeLinkDepends cld(this->Target, this->Config);
   cld.SetOldLinkDirMode(this->OldLinkDirMode);
   cld.SetOldLinkDirMode(this->OldLinkDirMode);
+  cld.SetSharedRegex(this->SharedRegexString);
   cmComputeLinkDepends::EntryVector const& linkEntries = cld.Compute();
   cmComputeLinkDepends::EntryVector const& linkEntries = cld.Compute();
 
 
   // Add the link line items.
   // Add the link line items.
@@ -864,7 +865,9 @@ void cmComputeLinkInformation::ComputeItemParserInfo()
   if(!this->SharedLinkExtensions.empty())
   if(!this->SharedLinkExtensions.empty())
     {
     {
     std::string reg_shared = reg;
     std::string reg_shared = reg;
-    reg_shared += this->CreateExtensionRegex(this->SharedLinkExtensions);
+    this->SharedRegexString =
+      this->CreateExtensionRegex(this->SharedLinkExtensions);
+    reg_shared += this->SharedRegexString;
 #ifdef CM_COMPUTE_LINK_INFO_DEBUG
 #ifdef CM_COMPUTE_LINK_INFO_DEBUG
   fprintf(stderr, "shared regex [%s]\n", reg_shared.c_str());
   fprintf(stderr, "shared regex [%s]\n", reg_shared.c_str());
 #endif
 #endif

+ 1 - 0
Source/cmComputeLinkInformation.h

@@ -129,6 +129,7 @@ private:
   cmsys::RegularExpression ExtractStaticLibraryName;
   cmsys::RegularExpression ExtractStaticLibraryName;
   cmsys::RegularExpression ExtractSharedLibraryName;
   cmsys::RegularExpression ExtractSharedLibraryName;
   cmsys::RegularExpression ExtractAnyLibraryName;
   cmsys::RegularExpression ExtractAnyLibraryName;
+  std::string SharedRegexString;
   void AddLinkPrefix(const char* p);
   void AddLinkPrefix(const char* p);
   void AddLinkExtension(const char* e, LinkType type);
   void AddLinkExtension(const char* e, LinkType type);
   std::string CreateExtensionRegex(std::vector<std::string> const& exts);
   std::string CreateExtensionRegex(std::vector<std::string> const& exts);