diff options
author | Brad King <brad.king@kitware.com> | 2014-07-30 15:14:17 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-07-30 15:14:17 (GMT) |
commit | 9f7e27fc3a2d2b1863147f235a2980de019ee7c9 (patch) | |
tree | 06d7a0eb89820c5e9822b26fd23402d8149c405f /Source/cmComputeLinkDepends.cxx | |
parent | 8d1306cd1b2ab7af0360387bfbdd9beff29b480c (diff) | |
download | CMake-9f7e27fc3a2d2b1863147f235a2980de019ee7c9.zip CMake-9f7e27fc3a2d2b1863147f235a2980de019ee7c9.tar.gz CMake-9f7e27fc3a2d2b1863147f235a2980de019ee7c9.tar.bz2 |
De-duplicate shared library targets in generated link lines
The linker will bring in shared libraries as a whole and use them even
for symbols that are needed by entries later in the link line.
Therefore we do not need to repeat them. De-duplicate link entries that
we know are shared libraries because we have a cmTarget associated with
them.
Tested-by: Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>
Diffstat (limited to 'Source/cmComputeLinkDepends.cxx')
-rw-r--r-- | Source/cmComputeLinkDepends.cxx | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index c13da50..b13a125 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -166,7 +166,8 @@ guaranteed to be acyclic. The final list of items produced by this procedure consists of the original user link line followed by minimal additional items needed to -satisfy dependencies. +satisfy dependencies. The final list is then filtered to de-duplicate +items that we know the linker will re-use automatically (shared libs). */ @@ -262,10 +263,20 @@ cmComputeLinkDepends::Compute() this->OrderLinkEntires(); // Compute the final set of link entries. + std::set<int> emmitted; for(std::vector<int>::const_iterator li = this->FinalLinkOrder.begin(); li != this->FinalLinkOrder.end(); ++li) { - this->FinalLinkEntries.push_back(this->EntryList[*li]); + int i = *li; + LinkEntry const& e = this->EntryList[i]; + cmTarget const* t = e.Target; + // Entries that we know the linker will re-use for symbols + // needed by later entries do not need to be repeated. + bool uniquify = t && t->GetType() == cmTarget::SHARED_LIBRARY; + if(!uniquify || emmitted.insert(i).second) + { + this->FinalLinkEntries.push_back(e); + } } // Display the final set. |