How cmake find_package automatically find all the dependencies?

Viewed 62

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)
0 Answers
Related