Browse Source

Merge branch 'fix_link-line-dedup_regression' into release

Brad King 11 years ago
parent
commit
ec893d9a26

+ 9 - 4
Source/cmComputeLinkDepends.cxx

@@ -263,21 +263,26 @@ cmComputeLinkDepends::Compute()
   this->OrderLinkEntires();
 
   // Compute the final set of link entries.
+  // Iterate in reverse order so we can keep only the last occurrence
+  // of a shared library.
   std::set<int> emmitted;
-  for(std::vector<int>::const_iterator li = this->FinalLinkOrder.begin();
-      li != this->FinalLinkOrder.end(); ++li)
+  for(std::vector<int>::const_reverse_iterator
+        li = this->FinalLinkOrder.rbegin(),
+        le = this->FinalLinkOrder.rend();
+      li != le; ++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.
+    // Entries that we know the linker will re-use 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);
       }
     }
+  // Reverse the resulting order since we iterated in reverse.
+  std::reverse(this->FinalLinkEntries.begin(), this->FinalLinkEntries.end());
 
   // Display the final set.
   if(this->DebugMode)

+ 1 - 0
Tests/Dependency/CMakeLists.txt

@@ -51,3 +51,4 @@ add_subdirectory(Case1)
 add_subdirectory(Case2)
 add_subdirectory(Case3)
 add_subdirectory(Case4)
+add_subdirectory(Case5)

+ 8 - 0
Tests/Dependency/Case5/CMakeLists.txt

@@ -0,0 +1,8 @@
+project(CASE5 C)
+
+add_library(case5Foo SHARED foo.c)
+add_library(case5Bar STATIC bar.c)
+target_link_libraries(case5Bar case5Foo)
+
+add_executable(case5 main.c)
+target_link_libraries(case5 case5Foo case5Bar)

+ 12 - 0
Tests/Dependency/Case5/bar.c

@@ -0,0 +1,12 @@
+#ifdef _WIN32
+__declspec(dllimport)
+#endif
+void foo(void);
+
+#include <stdio.h>
+
+void bar(void)
+{
+  foo();
+  printf("bar()\n");
+}

+ 9 - 0
Tests/Dependency/Case5/foo.c

@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void foo(void)
+{
+  printf("foo()\n");
+}

+ 7 - 0
Tests/Dependency/Case5/main.c

@@ -0,0 +1,7 @@
+void bar(void);
+
+int main(int argc, char *argv[])
+{
+  bar();
+  return 0;
+}