summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-08-04 14:02:16 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2014-08-04 14:02:16 (GMT)
commit628f02ba352f7b62ef108e356300845ae81fd6a2 (patch)
treeddbe58fe61ccb0460cc113f5b5ffdbc0ae88917b
parent1238b3656ad95a6cc23a08e1846099ca773a5e1f (diff)
parentccec6df85f604429a905d664d8a6e8c9e0d835e1 (diff)
downloadCMake-628f02ba352f7b62ef108e356300845ae81fd6a2.zip
CMake-628f02ba352f7b62ef108e356300845ae81fd6a2.tar.gz
CMake-628f02ba352f7b62ef108e356300845ae81fd6a2.tar.bz2
Merge topic 'link-line-dedup'
ccec6df8 Help: Add notes for topic 'link-line-dedup' 9f7e27fc De-duplicate shared library targets in generated link lines
-rw-r--r--Help/release/dev/link-line-dedup.rst5
-rw-r--r--Source/cmComputeLinkDepends.cxx15
2 files changed, 18 insertions, 2 deletions
diff --git a/Help/release/dev/link-line-dedup.rst b/Help/release/dev/link-line-dedup.rst
new file mode 100644
index 0000000..6ce31e3
--- /dev/null
+++ b/Help/release/dev/link-line-dedup.rst
@@ -0,0 +1,5 @@
+link-line-dedup
+---------------
+
+* When generating linker command-lines, CMake now avoids repeating
+ items corresponding to SHARED library targets.
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.