Commit 183b9509 authored by Brad King's avatar Brad King
Browse files

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.
parent 4ed17691
...@@ -429,7 +429,8 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) ...@@ -429,7 +429,8 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep)
if(cmTarget::LinkInterface const* iface = if(cmTarget::LinkInterface const* iface =
entry.Target->GetLinkInterface(this->Config)) 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); this->QueueSharedDependencies(index, iface->SharedDeps);
} }
} }
......
...@@ -23,8 +23,13 @@ add_library(testLib1 STATIC testLib1.c) ...@@ -23,8 +23,13 @@ add_library(testLib1 STATIC testLib1.c)
add_library(testLib2 STATIC testLib2.c) add_library(testLib2 STATIC testLib2.c)
target_link_libraries(testLib2 testLib1) 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) add_library(testLib3Imp SHARED testLib3Imp.c)
set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl) set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
target_link_libraries(testLib3Imp testLib3ImpDep)
add_library(testLib3 SHARED testLib3.c) add_library(testLib3 SHARED testLib3.c)
target_link_libraries(testLib3 testLib3Imp) target_link_libraries(testLib3 testLib3Imp)
set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "") set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "")
...@@ -104,6 +109,14 @@ install( ...@@ -104,6 +109,14 @@ install(
LIBRARY DESTINATION lib/impl LIBRARY DESTINATION lib/impl
ARCHIVE 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( install(
TARGETS testLib5 TARGETS testLib5
EXPORT exp EXPORT exp
...@@ -120,7 +133,7 @@ endif(WIN32) ...@@ -120,7 +133,7 @@ endif(WIN32)
# Export from build tree. # Export from build tree.
export(TARGETS testExe1 testLib1 testLib2 testLib3 export(TARGETS testExe1 testLib1 testLib2 testLib3
testExe2libImp testLib3Imp testExe2libImp testLib3Imp testLib3ImpDep
NAMESPACE bld_ NAMESPACE bld_
FILE ExportBuildTree.cmake FILE ExportBuildTree.cmake
) )
......
#if defined(_WIN32) || defined(__CYGWIN__) #if defined(_WIN32) || defined(__CYGWIN__)
# define testLib3Imp_EXPORT __declspec(dllexport) # define testLib3Imp_EXPORT __declspec(dllexport)
# define testLib3ImpDep_IMPORT __declspec(dllimport)
#else #else
# define testLib3Imp_EXPORT # define testLib3Imp_EXPORT
# define testLib3ImpDep_IMPORT
#endif #endif
testLib3Imp_EXPORT int testLib3Imp(void) { return 0; } testLib3ImpDep_IMPORT int testLib3ImpDep(void);
testLib3Imp_EXPORT int testLib3Imp(void) { return testLib3ImpDep(); }
#if defined(_WIN32) || defined(__CYGWIN__)
# define testLib3ImpDep_EXPORT __declspec(dllexport)
#else
# define testLib3ImpDep_EXPORT
#endif
testLib3ImpDep_EXPORT int testLib3ImpDep(void) { return 0; }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment