Допустим, у меня есть библиотека 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 не делает этого по умолчанию или, по крайней мере, не предлагает какой-то стандартный механизм для этого?