From d63feacddced2407e67419b1bf49622cc9354360 Mon Sep 17 00:00:00 2001
From: Sam Spilsbury <smspillaz@gmail.com>
Date: Fri, 6 Jun 2014 21:51:38 +0800
Subject: [PATCH 1/2] cmComputeLinkInformation: Don't add build dependencies on
 IMPORTED libraries.

For IMPORTED libraries we treat those like INTERFACE libraries. The actual
target for an IMPORTED library is not generated. This would have normally
resulted in the passing of the path to the IMPORTED library as a dependency
which works in some, but not all cases, because the path is not guaranteed
to be absolute. In particular, it fails on the Ninja generator.

The solution is just not to add dependencies on such libraries, as any
dependencies of the IMPORTED target itself will be added as dependencies
of targets depending on the IMPORTED target.

Added ImportedExternalProjectLibrary, which builds a library in a sister
subdirectory to an executable as an external project, the alternate
sister subdirectory adding the library as an IMPORTED library
depending on the external project and linking to it.

Fixes #13574.
---
 Source/cmComputeLinkInformation.cxx                     |  4 ++--
 Tests/CMakeLists.txt                                    |  1 +
 Tests/ImportedExternalProjectLibrary/CMakeLists.txt     |  5 +++++
 .../ImportedExternalProjectLibraryDir/CMakeLists.txt    |  3 +++
 .../ImportedExternalProjectLibrary.c                    |  6 ++++++
 .../LibrarySubdir/CMakeLists.txt                        | 17 +++++++++++++++++
 .../ProjectWithImportedLibrary/CMakeLists.txt           |  4 ++++
 .../LibrarySubdir/ProjectWithImportedLibrary/library.c  |  4 ++++
 8 files changed, 42 insertions(+), 2 deletions(-)
 create mode 100644 Tests/ImportedExternalProjectLibrary/CMakeLists.txt
 create mode 100644 Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/CMakeLists.txt
 create mode 100644 Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/ImportedExternalProjectLibrary.c
 create mode 100644 Tests/ImportedExternalProjectLibrary/LibrarySubdir/CMakeLists.txt
 create mode 100644 Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/CMakeLists.txt
 create mode 100644 Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/library.c

diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx
index ea8536f..1166cad 100644
--- a/Source/cmComputeLinkInformation.cxx
+++ b/Source/cmComputeLinkInformation.cxx
@@ -664,8 +664,8 @@ void cmComputeLinkInformation::AddItem(std::string const& item,
         }
       // Pass the full path to the target file.
       std::string lib = tgt->GetFullPath(config, implib, true);
-      if(!this->LinkDependsNoShared ||
-         tgt->GetType() != cmTarget::SHARED_LIBRARY)
+      if((!this->LinkDependsNoShared ||
+          tgt->GetType() != cmTarget::SHARED_LIBRARY) && !tgt->IsImported())
         {
         this->Depends.push_back(lib);
         }
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 8d2b7fc..8c3c49d 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -281,6 +281,7 @@ if(BUILD_TESTING)
   ADD_TEST_MACRO(AliasTarget AliasTarget)
   ADD_TEST_MACRO(StagingPrefix StagingPrefix)
   ADD_TEST_MACRO(InterfaceLibrary InterfaceLibrary)
+  ADD_TEST_MACRO(ImportedExternalProjectLibrary ImportedExternalProjectLibrary)
   if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]")
     set(ConfigSources_BUILD_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
     ADD_TEST_MACRO(ConfigSources ConfigSources)
diff --git a/Tests/ImportedExternalProjectLibrary/CMakeLists.txt b/Tests/ImportedExternalProjectLibrary/CMakeLists.txt
new file mode 100644
index 0000000..e1976b3
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/CMakeLists.txt
@@ -0,0 +1,5 @@
+cmake_minimum_required(VERSION 2.8)
+project(ImportExternalProjectLibraryTest)
+
+add_subdirectory(LibrarySubdir)
+add_subdirectory(ImportedExternalProjectLibraryDir)
\ No newline at end of file
diff --git a/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/CMakeLists.txt b/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/CMakeLists.txt
new file mode 100644
index 0000000..68ff241
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(ImportedExternalProjectLibrary
+               ${CMAKE_CURRENT_SOURCE_DIR}/ImportedExternalProjectLibrary.c)
+target_link_libraries(ImportedExternalProjectLibrary imported_library)
diff --git a/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/ImportedExternalProjectLibrary.c b/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/ImportedExternalProjectLibrary.c
new file mode 100644
index 0000000..6ee5800
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/ImportedExternalProjectLibraryDir/ImportedExternalProjectLibrary.c
@@ -0,0 +1,6 @@
+extern int library_func(void);
+
+int main(void)
+{
+    return library_func();
+}
diff --git a/Tests/ImportedExternalProjectLibrary/LibrarySubdir/CMakeLists.txt b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/CMakeLists.txt
new file mode 100644
index 0000000..47bedfe
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/CMakeLists.txt
@@ -0,0 +1,17 @@
+include(ExternalProject)
+
+set (PROJECT_WITH_IMPORTED_LIBRARY_SOURCE_DIR
+     ${CMAKE_CURRENT_SOURCE_DIR}/ProjectWithImportedLibrary)
+set (PROJECT_WITH_IMPORTED_LIBRARY_BINARY_DIR
+     ${CMAKE_CURRENT_BINARY_DIR}/ProjectWithImportedLibrary)
+
+ExternalProject_Add(ProjectWithImportedLibrary
+                    URL ${PROJECT_WITH_IMPORTED_LIBRARY_SOURCE_DIR}
+                    BINARY_DIR ${PROJECT_WITH_IMPORTED_LIBRARY_BINARY_DIR}
+                    INSTALL_COMMAND "")
+
+add_library(imported_library STATIC IMPORTED GLOBAL)
+set_target_properties(imported_library
+                      PROPERTIES IMPORTED_LOCATION
+                      ${PROJECT_WITH_IMPORTED_LIBRARY_BINARY_DIR}/liblibrary.a)
+add_dependencies(imported_library ProjectWithImportedLibrary)
diff --git a/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/CMakeLists.txt b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/CMakeLists.txt
new file mode 100644
index 0000000..8c9802a
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/CMakeLists.txt
@@ -0,0 +1,4 @@
+cmake_minimum_required(VERSION 2.8)
+project(ImportedLibrary)
+
+add_library(library STATIC ${CMAKE_CURRENT_SOURCE_DIR}/library.c)
diff --git a/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/library.c b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/library.c
new file mode 100644
index 0000000..db375b4
--- /dev/null
+++ b/Tests/ImportedExternalProjectLibrary/LibrarySubdir/ProjectWithImportedLibrary/library.c
@@ -0,0 +1,4 @@
+int library_func(void)
+{
+    return 0;
+}
-- 
1.8.5.2 (Apple Git-48)

