[Cmake-commits] CMake branch, next, updated. v2.8.7-2093-g3eb4815

Brad King brad.king at kitware.com
Fri Jan 13 14:24:43 EST 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  3eb481524b5c7e4fdbd668431576ff912756e226 (commit)
       via  8e756d2b9bb84b182a8402e71fb62d7a28d0a9c6 (commit)
       via  9a20abf04a7fc11b53beb545f1555fe9815ae09c (commit)
      from  19c85b6c73f4274fd890b9c6f072010fb7c8c678 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3eb481524b5c7e4fdbd668431576ff912756e226
commit 3eb481524b5c7e4fdbd668431576ff912756e226
Merge: 19c85b6 8e756d2
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Jan 13 14:24:42 2012 -0500
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Jan 13 14:24:42 2012 -0500

    Merge topic 'link-shared-depend-cycle-issue-12647' into next
    
    8e756d2 Tolerate cycles in shared library link interfaces (#12647)
    9a20abf Add infrastructure for CMake-only tests


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8e756d2b9bb84b182a8402e71fb62d7a28d0a9c6
commit 8e756d2b9bb84b182a8402e71fb62d7a28d0a9c6
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Thu Jan 12 10:22:00 2012 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 13 14:22:24 2012 -0500

    Tolerate cycles in shared library link interfaces (#12647)
    
    Since commit 183b9509 (Follow all dependencies of shared library private
    dependencies, 2011-12-14) we honor LINK_INTERFACE_LIBRARIES when
    following dependent shared libraries.  The link interface properties may
    form a cycle if set incorrectly by a project.  Furthermore, the property
    LINK_DEPENDENT_LIBRARIES may form a cycle if set incorrectly by hand
    (though CMake should never generate one).  In either case, do not follow
    the cycle forever when following the dependent shared library closure.
    We only need to add dependency edges to the constraint graph once.
    
    Add "LinkInterfaceLoop" test to cover this case.

diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx
index 802cfcf..9a075bd 100644
--- a/Source/cmComputeLinkDepends.cxx
+++ b/Source/cmComputeLinkDepends.cxx
@@ -358,7 +358,7 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe)
       this->AddLinkEntries(depender_index, iface->Libraries);
 
       // Handle dependent shared libraries.
-      this->QueueSharedDependencies(depender_index, iface->SharedDeps);
+      this->FollowSharedDeps(depender_index, iface);
 
       // Support for CMP0003.
       for(std::vector<std::string>::const_iterator
@@ -379,6 +379,23 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe)
 //----------------------------------------------------------------------------
 void
 cmComputeLinkDepends
+::FollowSharedDeps(int depender_index, cmTarget::LinkInterface const* iface,
+                   bool follow_interface)
+{
+  // Follow dependencies if we have not followed them already.
+  if(this->SharedDepFollowed.insert(depender_index).second)
+    {
+    if(follow_interface)
+      {
+      this->QueueSharedDependencies(depender_index, iface->Libraries);
+      }
+    this->QueueSharedDependencies(depender_index, iface->SharedDeps);
+    }
+}
+
+//----------------------------------------------------------------------------
+void
+cmComputeLinkDepends
 ::QueueSharedDependencies(int depender_index,
                           std::vector<std::string> const& deps)
 {
@@ -430,8 +447,7 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep)
        entry.Target->GetLinkInterface(this->Config))
       {
       // Follow public and private dependencies transitively.
-      this->QueueSharedDependencies(index, iface->Libraries);
-      this->QueueSharedDependencies(index, iface->SharedDeps);
+      this->FollowSharedDeps(index, iface, true);
       }
     }
 }
diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h
index e196e00..80a0454 100644
--- a/Source/cmComputeLinkDepends.h
+++ b/Source/cmComputeLinkDepends.h
@@ -105,6 +105,10 @@ private:
     int DependerIndex;
   };
   std::queue<SharedDepEntry> SharedDepQueue;
+  std::set<int> SharedDepFollowed;
+  void FollowSharedDeps(int depender_index,
+                        cmTarget::LinkInterface const* iface,
+                        bool follow_interface = false);
   void QueueSharedDependencies(int depender_index,
                                std::vector<std::string> const& deps);
   void HandleSharedDependency(SharedDepEntry const& dep);
diff --git a/Tests/CMakeOnly/CMakeLists.txt b/Tests/CMakeOnly/CMakeLists.txt
index d32e7be..e4ba53a 100644
--- a/Tests/CMakeOnly/CMakeLists.txt
+++ b/Tests/CMakeOnly/CMakeLists.txt
@@ -7,3 +7,6 @@ macro(add_CMakeOnly_test test)
     -P ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake
     )
 endmacro()
+
+add_CMakeOnly_test(LinkInterfaceLoop)
+set_property(TEST CMakeOnly.LinkInterfaceLoop PROPERTY TIMEOUT 90)
diff --git a/Tests/CMakeOnly/LinkInterfaceLoop/CMakeLists.txt b/Tests/CMakeOnly/LinkInterfaceLoop/CMakeLists.txt
new file mode 100644
index 0000000..56e449a
--- /dev/null
+++ b/Tests/CMakeOnly/LinkInterfaceLoop/CMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required (VERSION 2.8)
+project(LinkInterfaceLoop C)
+
+# Add a shared library that incorrectly names itself as a
+# dependency, thus forming a cycle.
+add_library(A SHARED IMPORTED)
+set_target_properties(A PROPERTIES
+  IMPORTED_LINK_DEPENDENT_LIBRARIES A
+  IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/dirA/A"
+  )
+
+# Add a shared library that incorrectly names itself in
+# its link interface, thus forming a cycle.
+add_library(B SHARED IMPORTED)
+set_target_properties(B PROPERTIES
+  IMPORTED_LINK_INTERFACE_LIBRARIES B
+  IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/dirB/B"
+  )
+
+# Add a shared library with an empty link interface
+# that depends on two shared libraries.
+add_library(C SHARED lib.c)
+set_property(TARGET C PROPERTY LINK_INTERFACE_LIBRARIES "")
+target_link_libraries(C B A)
+
+add_executable(main main.c)
+target_link_libraries(main C)
diff --git a/Tests/CMakeOnly/LinkInterfaceLoop/lib.c b/Tests/CMakeOnly/LinkInterfaceLoop/lib.c
new file mode 100644
index 0000000..fede1d6
--- /dev/null
+++ b/Tests/CMakeOnly/LinkInterfaceLoop/lib.c
@@ -0,0 +1 @@
+int lib(void) { return 0; }
diff --git a/Tests/CMakeOnly/LinkInterfaceLoop/main.c b/Tests/CMakeOnly/LinkInterfaceLoop/main.c
new file mode 100644
index 0000000..78f2de1
--- /dev/null
+++ b/Tests/CMakeOnly/LinkInterfaceLoop/main.c
@@ -0,0 +1 @@
+int main(void) { return 0; }

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9a20abf04a7fc11b53beb545f1555fe9815ae09c
commit 9a20abf04a7fc11b53beb545f1555fe9815ae09c
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Wed Jan 11 17:04:04 2012 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Jan 13 14:21:22 2012 -0500

    Add infrastructure for CMake-only tests
    
    Some tests only need to run CMake to configure and generate a build
    tree, but not actually perform the build.  Add a new "Tests/CMakeOnly"
    directory dedicated for this purpose.  Add a helper script to drive each
    test by creating a fresh build tree and running CMake on it.  Add macro
    "add_CMakeOnly_test" to help create tests using the script.

diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 00c9ac7..badc76b 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -47,6 +47,7 @@ IF(BUILD_TESTING)
   ENDIF()
 
   ADD_SUBDIRECTORY(CMakeLib)
+  ADD_SUBDIRECTORY(CMakeOnly)
 
   ADD_SUBDIRECTORY(FindPackageModeMakefileTest)
 
diff --git a/Tests/CMakeOnly/CMakeLists.txt b/Tests/CMakeOnly/CMakeLists.txt
new file mode 100644
index 0000000..d32e7be
--- /dev/null
+++ b/Tests/CMakeOnly/CMakeLists.txt
@@ -0,0 +1,9 @@
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Test.cmake.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake @ONLY)
+
+macro(add_CMakeOnly_test test)
+  add_test(CMakeOnly.${test} ${CMAKE_CMAKE_COMMAND}
+    -DTEST=${test}
+    -P ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake
+    )
+endmacro()
diff --git a/Tests/CMakeOnly/Test.cmake.in b/Tests/CMakeOnly/Test.cmake.in
new file mode 100644
index 0000000..aa2d093
--- /dev/null
+++ b/Tests/CMakeOnly/Test.cmake.in
@@ -0,0 +1,12 @@
+set(source_dir "@CMAKE_CURRENT_SOURCE_DIR@/${TEST}")
+set(binary_dir "@CMAKE_CURRENT_BINARY_DIR@/${TEST}-build")
+file(REMOVE_RECURSE "${binary_dir}")
+file(MAKE_DIRECTORY "${binary_dir}")
+execute_process(
+  COMMAND ${CMAKE_COMMAND} "${source_dir}" -G "@CMAKE_TEST_GENERATOR@"
+  WORKING_DIRECTORY "${binary_dir}"
+  RESULT_VARIABLE result
+  )
+if(result)
+  message(FATAL_ERROR "CMake failed to configure ${TEST}")
+endif()

-----------------------------------------------------------------------

Summary of changes:


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list