[Cmake-commits] CMake branch, next, updated. v2.8.7-2078-g317fc87

Brad King brad.king at kitware.com
Thu Jan 12 10:33:07 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  317fc87718745b28c78df1852b2b04c7b0800544 (commit)
       via  9cc19b2de2e8077424b89d8f7e8520fe074deffb (commit)
       via  7a933f8c5c7a7f92be3d7a6881b107a4246bfed6 (commit)
       via  bbed901178852e1fb1a77e4e6fbfe397fb67a20c (commit)
      from  c805ff8fc46679487055949ebef98d525b6725bc (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=317fc87718745b28c78df1852b2b04c7b0800544
commit 317fc87718745b28c78df1852b2b04c7b0800544
Merge: c805ff8 9cc19b2
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Thu Jan 12 10:32:45 2012 -0500
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Thu Jan 12 10:32:45 2012 -0500

    Merge topic 'link-shared-depend-cycle-issue-12647' into next
    
    9cc19b2 Tolerate cycles in shared library link interfaces (#12647)
    7a933f8 Add infrastructure for CMake-only tests
    bbed901 KWSys Nightly Date Stamp


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9cc19b2de2e8077424b89d8f7e8520fe074deffb
commit 9cc19b2de2e8077424b89d8f7e8520fe074deffb
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: Thu Jan 12 10:22:00 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 f8babbf..b3bdab8 100644
--- a/Tests/CMakeOnly/CMakeLists.txt
+++ b/Tests/CMakeOnly/CMakeLists.txt
@@ -1,2 +1,8 @@
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Test.cmake.in
                ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake @ONLY)
+
+add_test(CMakeOnly.LinkInterfaceLoop ${CMAKE_CMAKE_COMMAND}
+  -DTEST=LinkInterfaceLoop
+  -P ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake
+  )
+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=7a933f8c5c7a7f92be3d7a6881b107a4246bfed6
commit 7a933f8c5c7a7f92be3d7a6881b107a4246bfed6
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: Wed Jan 11 17:10:01 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.

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..f8babbf
--- /dev/null
+++ b/Tests/CMakeOnly/CMakeLists.txt
@@ -0,0 +1,2 @@
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Test.cmake.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake @ONLY)
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:
 Source/cmComputeLinkDepends.cxx                    |   22 ++++++++++++++--
 Source/cmComputeLinkDepends.h                      |    4 +++
 Source/kwsys/kwsysDateStamp.cmake                  |    2 +-
 Tests/CMakeLists.txt                               |    1 +
 Tests/CMakeOnly/CMakeLists.txt                     |    8 ++++++
 Tests/CMakeOnly/LinkInterfaceLoop/CMakeLists.txt   |   27 ++++++++++++++++++++
 Tests/CMakeOnly/LinkInterfaceLoop/lib.c            |    1 +
 .../LinkInterfaceLoop/main.c}                      |    0
 Tests/CMakeOnly/Test.cmake.in                      |   12 +++++++++
 9 files changed, 73 insertions(+), 4 deletions(-)
 create mode 100644 Tests/CMakeOnly/CMakeLists.txt
 create mode 100644 Tests/CMakeOnly/LinkInterfaceLoop/CMakeLists.txt
 create mode 100644 Tests/CMakeOnly/LinkInterfaceLoop/lib.c
 copy Tests/{LinkFlags/LinkFlags.c => CMakeOnly/LinkInterfaceLoop/main.c} (100%)
 create mode 100644 Tests/CMakeOnly/Test.cmake.in


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list