Я просто весь мозг сломал со следующей ситуцией. Есть CMake проект состоящий из нескольких библиотек и исполнимого модуля. Этот проект использует некую внешнюю по отношению к нему библиотеку. В идеале, в процессе сборки, эту библиотеку надо скачать, собрать, установить и заюзать.
Перечирав кучу документации и устав от эксперементов, я наткнулся на чудесную функцию externalproject_add.
externalproject_add(
memtree_external
GIT_REPOSITORY "git@github.com:astavonin/memtree.git"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:STRING=${PROJECT_BINARY_DIR}
UPDATE_COMMAND ""
)
add_library(memtree SHARED IMPORTED)
set_property(TARGET memtree PROPERTY
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libmemtree.a)
include_directories(${PROJECT_BINARY_DIR}/include)
memtree_external
GIT_REPOSITORY "git@github.com:astavonin/memtree.git"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:STRING=${PROJECT_BINARY_DIR}
UPDATE_COMMAND ""
)
add_library(memtree SHARED IMPORTED)
set_property(TARGET memtree PROPERTY
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/libmemtree.a)
include_directories(${PROJECT_BINARY_DIR}/include)
Для того чтобы установка отрабатывала корректно, пришлось добавить несколько строк в CMakeLists.txt
install(FILES ../include/memtree/memtree.h DESTINATION include/memtree)
install(TARGETS memtree DESTINATION lib EXPORT memtree-targets)
install(EXPORT memtree-targets DESTINATION lib/memtree)
install(TARGETS memtree DESTINATION lib EXPORT memtree-targets)
install(EXPORT memtree-targets DESTINATION lib/memtree)
Уфф. Убил на это кучу времени, но оно того стоит – обновлять библиотеку теперь куда проще