summaryrefslogtreecommitdiffstats
path: root/Tests
diff options
context:
space:
mode:
authorDaniele E. Domenichelli <daniele.domenichelli@iit.it>2014-11-09 16:35:20 (GMT)
committerBrad King <brad.king@kitware.com>2014-11-10 19:46:22 (GMT)
commit4db31095e5f4ce410c013e0b92bc5d1baee03934 (patch)
tree8ec4f16583bc150b3f933e3b48cff004ab5d536e /Tests
parent06c3b7a8224b9864f1771de62926c1d1fb3476cc (diff)
downloadCMake-4db31095e5f4ce410c013e0b92bc5d1baee03934.zip
CMake-4db31095e5f4ce410c013e0b92bc5d1baee03934.tar.gz
CMake-4db31095e5f4ce410c013e0b92bc5d1baee03934.tar.bz2
Fix link line order when shared libraries are de-duplicated
Since commit v3.1.0-rc1~227^2~1 (De-duplicate shared library targets in generated link lines, 2014-07-30) we de-duplicate shared library targets on the link line. However, some toolchains will fail linking if an executable is linking to a shared library that is not used directly and a static library that depends on the shared one. The linker may not keep the reference to the shared library the first time and then the symbols needed by the static library may not be found. Fix this by reversing the direction of the for loop that removes the duplicate shared libraries, in order to ensure that the last occurrence of the library is left instead of the first one. Extend Tests/Dependency with a case covering this behavior. Create an executable that links to a shared library and a static library but only needs the shared library as a dependency of the static library. Co-Author: Brad King <brad.king@kitware.com>
Diffstat (limited to 'Tests')
-rw-r--r--Tests/Dependency/CMakeLists.txt1
-rw-r--r--Tests/Dependency/Case5/CMakeLists.txt8
-rw-r--r--Tests/Dependency/Case5/bar.c12
-rw-r--r--Tests/Dependency/Case5/foo.c9
-rw-r--r--Tests/Dependency/Case5/main.c7
5 files changed, 37 insertions, 0 deletions
diff --git a/Tests/Dependency/CMakeLists.txt b/Tests/Dependency/CMakeLists.txt
index ef42048..ebc2d10 100644
--- a/Tests/Dependency/CMakeLists.txt
+++ b/Tests/Dependency/CMakeLists.txt
@@ -51,3 +51,4 @@ add_subdirectory(Case1)
add_subdirectory(Case2)
add_subdirectory(Case3)
add_subdirectory(Case4)
+add_subdirectory(Case5)
diff --git a/Tests/Dependency/Case5/CMakeLists.txt b/Tests/Dependency/Case5/CMakeLists.txt
new file mode 100644
index 0000000..e954b02
--- /dev/null
+++ b/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)
diff --git a/Tests/Dependency/Case5/bar.c b/Tests/Dependency/Case5/bar.c
new file mode 100644
index 0000000..4cb1b1b
--- /dev/null
+++ b/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");
+}
diff --git a/Tests/Dependency/Case5/foo.c b/Tests/Dependency/Case5/foo.c
new file mode 100644
index 0000000..794833d
--- /dev/null
+++ b/Tests/Dependency/Case5/foo.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+void foo(void)
+{
+ printf("foo()\n");
+}
diff --git a/Tests/Dependency/Case5/main.c b/Tests/Dependency/Case5/main.c
new file mode 100644
index 0000000..ae3dc95
--- /dev/null
+++ b/Tests/Dependency/Case5/main.c
@@ -0,0 +1,7 @@
+void bar(void);
+
+int main(int argc, char *argv[])
+{
+ bar();
+ return 0;
+}