From 183b95098ea4102da5ca510e8c7a36106a5c257a Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 14 Dec 2011 11:28:42 -0500 Subject: [PATCH] Follow all dependencies of shared library private dependencies In cmComputeLinkDepends we compute the transitive closure of private shared library dependencies. When a shared library is added to this closure we must follow all of its dependencies whether they are private or public. Previously we only followed the private dependencies. Fix the implementation to follow the public dependencies too. Also extend the ExportImport test to cover this case. --- Source/cmComputeLinkDepends.cxx | 3 ++- Tests/ExportImport/Export/CMakeLists.txt | 15 ++++++++++++++- Tests/ExportImport/Export/testLib3Imp.c | 5 ++++- Tests/ExportImport/Export/testLib3ImpDep.c | 7 +++++++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 Tests/ExportImport/Export/testLib3ImpDep.c diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1021bf2ef..802cfcf70 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -429,7 +429,8 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) if(cmTarget::LinkInterface const* iface = entry.Target->GetLinkInterface(this->Config)) { - // We use just the shared dependencies, not the interface. + // Follow public and private dependencies transitively. + this->QueueSharedDependencies(index, iface->Libraries); this->QueueSharedDependencies(index, iface->SharedDeps); } } diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 235a1d215..f06a4659f 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -23,8 +23,13 @@ add_library(testLib1 STATIC testLib1.c) add_library(testLib2 STATIC testLib2.c) target_link_libraries(testLib2 testLib1) +# Test library with empty link interface. Link it to an implementation +# dependency that itself links to dependencies publicly. +add_library(testLib3ImpDep SHARED testLib3ImpDep.c) +set_property(TARGET testLib3ImpDep PROPERTY LIBRARY_OUTPUT_DIRECTORY impl/dep) add_library(testLib3Imp SHARED testLib3Imp.c) set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl) +target_link_libraries(testLib3Imp testLib3ImpDep) add_library(testLib3 SHARED testLib3.c) target_link_libraries(testLib3 testLib3Imp) set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "") @@ -104,6 +109,14 @@ install( LIBRARY DESTINATION lib/impl ARCHIVE DESTINATION lib/impl ) +install( + TARGETS + testLib3ImpDep + EXPORT exp + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib/impl/dep + ARCHIVE DESTINATION lib/impl/dep + ) install( TARGETS testLib5 EXPORT exp @@ -120,7 +133,7 @@ endif(WIN32) # Export from build tree. export(TARGETS testExe1 testLib1 testLib2 testLib3 - testExe2libImp testLib3Imp + testExe2libImp testLib3Imp testLib3ImpDep NAMESPACE bld_ FILE ExportBuildTree.cmake ) diff --git a/Tests/ExportImport/Export/testLib3Imp.c b/Tests/ExportImport/Export/testLib3Imp.c index fb4c13faa..c27bccd40 100644 --- a/Tests/ExportImport/Export/testLib3Imp.c +++ b/Tests/ExportImport/Export/testLib3Imp.c @@ -1,7 +1,10 @@ #if defined(_WIN32) || defined(__CYGWIN__) # define testLib3Imp_EXPORT __declspec(dllexport) +# define testLib3ImpDep_IMPORT __declspec(dllimport) #else # define testLib3Imp_EXPORT +# define testLib3ImpDep_IMPORT #endif -testLib3Imp_EXPORT int testLib3Imp(void) { return 0; } +testLib3ImpDep_IMPORT int testLib3ImpDep(void); +testLib3Imp_EXPORT int testLib3Imp(void) { return testLib3ImpDep(); } diff --git a/Tests/ExportImport/Export/testLib3ImpDep.c b/Tests/ExportImport/Export/testLib3ImpDep.c new file mode 100644 index 000000000..578ac30ef --- /dev/null +++ b/Tests/ExportImport/Export/testLib3ImpDep.c @@ -0,0 +1,7 @@ +#if defined(_WIN32) || defined(__CYGWIN__) +# define testLib3ImpDep_EXPORT __declspec(dllexport) +#else +# define testLib3ImpDep_EXPORT +#endif + +testLib3ImpDep_EXPORT int testLib3ImpDep(void) { return 0; }