Генерация find_dependency из зависимостей, указанных через target_link_libraries - PullRequest
0 голосов
/ 18 февраля 2020

Допустим, у меня есть библиотека libA в зависимости от внешних библиотек libB и libC. У меня есть CMakeLists.txt, который выглядит так:

find_package(libB)
find_package(libC-custom)

add_library(libA main.cpp)

target_include_directories(libA
  PUBLIC
    $<BUILD_INTERFACE:${HEADER_DIR}>
    $<INSTALL_INTERFACE:include/libA>
)
target_link_libraries(libA
  PUBLIC
    libB::componentB
    libC::componentC
)

install(TARGETS libA EXPORT libATargets
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include/libA
)
install(EXPORT libATargets
  FILE libATargets.cmake
  NAMESPACE libA::
  DESTINATION lib/cmake/libA
)

configure_file(scripts/cmake/libA.cmake.in  libAConfig.cmake @ONLY)

install(
  FILES
    "${CMAKE_CURRENT_BINARY_DIR}/libAConfig.cmake"
  DESTINATION
    lib/cmake/libA
)
add_library(libA::libA ALIAS libA)

И scripts/cmake/libA.cmake.in выглядит так

include(CMakeFindDependencyMacro)

find_dependency(libB)
find_dependency(libC-custom)

include("${CMAKE_CURRENT_LIST_DIR}/libATargets.cmake")

Теперь зависимости повторяются дважды, один раз для настройки и один раз для установки !

Можно ли как-то сказать файлу libAConfig.cmake: включить зависимости libA (примечание: имя зависимостей, а не путей)? Или сгенерировать их в libATargets.cmake? Cmakes знает зависимости (компоненты) до target_link_libraries. Как извлечь эти компоненты, а затем вернуться к названию пакета, указанному в find_package()? Почему Cmake не делает этого по умолчанию или, по крайней мере, не предлагает какой-то стандартный механизм для этого?

...