I have two static libraries: Foo and Bar. Bar is a high level component which encapsulates Foo. Both libraries have Config.cmake file.
After installing the libraries on the system (so they are at /usr/local/lib) I'm using find_package to find Bar but the problem is that I also have to link target with Foo.
Is there any way that Foo can be found and linked automatically when Bar is linked?
[CMakeLists.txt for Foo library]:
cmake_minimum_required(VERSION 3.12.0)
project(foo)
add_library(foo ${SOURCES})
target_include_directories(foo PUBLIC "include")
set(INCLUDE_INSTALL_DIR "include/foo/")
set(LIBRARY_INSTALL_DIR "lib/foo/")
set(INSTALL_DESTINATION_DIR "${LIBRARY_INSTALL_DIR}/cmake")
include(CMakePackageConfigHelpers)
configure_package_config_file(FooConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake
INSTALL_DESTINATION ${INSTALL_DESTINATION_DIR}
PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion)
install(TARGETS foo DESTINATION ${LIBRARY_INSTALL_DIR})
install(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/foo)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
DESTINATION ${INSTALL_DESTINATION_DIR})
[CMakeLists.txt for Bar library]:
cmake_minimum_required(VERSION 3.12.0)
project(bar)
add_library(bar ${SOURCES})
target_include_directories(bar PUBLIC "include")
target_link_libraries(bar PUBLIC foo)
set(INCLUDE_INSTALL_DIR "include/bar/")
set(LIBRARY_INSTALL_DIR "lib/bar/")
set(INSTALL_DESTINATION_DIR "${LIBRARY_INSTALL_DIR}/cmake")
include(CMakePackageConfigHelpers)
configure_package_config_file(BarConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/BarConfig.cmake
INSTALL_DESTINATION ${INSTALL_DESTINATION_DIR}
PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/BarConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion)
install(TARGETS bar DESTINATION ${LIBRARY_INSTALL_DIR})
install(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/bar)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/BarConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/BarConfigVersion.cmake
DESTINATION ${INSTALL_DESTINATION_DIR})
[User's CMakeLists.txt]:
cmake_minimum_required(VERSION 3.12.0)
project(test)
find_package(bar CONFIG REQUIRED PATHS "/usr/local/lib/bar")
# I want the find_package above to find foo as well...
add_executable(test main.cpp)
target_include_directories(test PRIVATE ${BAR_INCLUDE_DIR})
target_link_directories(test PRIVATE ${BAR_LIBRARY_DIR})
# ...and link it here automatically.
target_link_libraries(test PUBLIC bar)