Separate PUBLIC and PRIVATE library dependencies Do not propagate 3d party libs through IMPORTED_LINK_INTERFACE_LIBRARIES_[DEBUG/RELEASE] mechanism when building shared libraries. SuiteSparse, lapack & co are considered private. Glog still gets propagated since it is part of the public interface. See documentation of TARGET_LINK_LIBRARIES(). Change-Id: If0563b0c705b102876f5190e9a86694d10f79283
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index 9475b21..1dd4090 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt
@@ -144,25 +144,25 @@ ARCHIVE DESTINATION lib${LIB_SUFFIX}) ENDIF (MINIGLOG) -SET(CERES_LIBRARY_DEPENDENCIES ${GLOG_LIBRARIES}) +SET(CERES_LIBRARY_PUBLIC_DEPENDENCIES ${GLOG_LIBRARIES}) IF (SUITESPARSE AND SUITESPARSE_FOUND) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${SUITESPARSE_LIBRARIES}) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${SUITESPARSE_LIBRARIES}) ENDIF (SUITESPARSE AND SUITESPARSE_FOUND) IF (CXSPARSE AND CXSPARSE_FOUND) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CXSPARSE_LIBRARIES}) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${CXSPARSE_LIBRARIES}) ENDIF (CXSPARSE AND CXSPARSE_FOUND) IF (BLAS_FOUND AND LAPACK_FOUND) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${LAPACK_LIBRARIES}) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${BLAS_LIBRARIES}) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${LAPACK_LIBRARIES}) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${BLAS_LIBRARIES}) ENDIF (BLAS_FOUND AND LAPACK_FOUND) IF (OPENMP_FOUND) IF (NOT MSVC) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES gomp) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CMAKE_THREAD_LIBS_INIT}) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES gomp) + LIST(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${CMAKE_THREAD_LIBS_INIT}) ENDIF (NOT MSVC) ENDIF (OPENMP_FOUND) @@ -177,7 +177,21 @@ SOVERSION ${CERES_VERSION_MAJOR} ) -TARGET_LINK_LIBRARIES(ceres ${CERES_LIBRARY_DEPENDENCIES}) +IF (BUILD_SHARED_LIBS) + # When building a shared library, mark all external libraries as + # PRIVATE so they don't show up as a dependency. + TARGET_LINK_LIBRARIES(ceres + LINK_PUBLIC ${CERES_LIBRARY_PUBLIC_DEPENDENCIES} + LINK_PRIVATE ${CERES_LIBRARY_PRIVATE_DEPENDENCIES}) +ELSE (BUILD_SHARED_LIBS) + # When building a static library, all external libraries are + # PUBLIC(default) since the user needs to link to them. + # They will be listed in CeresTargets.cmake. + SET(CERES_LIBRARY_DEPENDENCIES + ${CERES_LIBRARY_PUBLIC_DEPENDENCIES} + ${CERES_LIBRARY_PRIVATE_DEPENDENCIES}) + TARGET_LINK_LIBRARIES(ceres ${CERES_LIBRARY_DEPENDENCIES}) +ENDIF (BUILD_SHARED_LIBS) INSTALL(TARGETS ceres EXPORT CeresExport