Рассмотрим проект C ++, организованный в репозитории git. Предположим, что в репозитории git есть подмодуль, из которого построена библиотека, от которой зависит (супер) проект. Если (супер) проект зависит не только от библиотеки, но и от библиотеки, созданной с определенными (CMake) параметрами, как можно гарантировать, что подмодуль будет создан с этими параметрами при создании (супер) проекта?
Варианты сборки (например, MYLIB_WITH_SQLITE
) необходимо добавить к интерфейсу библиотеки, то есть к MYLIB_DEFINITIONS
переменная в случае старого конфигурационного модуля или INTERFACE_COMPILE_DEFINITIONS
свойство, если библиотека создает свой config-модуль с install(EXPORT ...)
команда:
add_library(mylib ...)
if(MYLIB_WITH_SQLITE)
target_compile_definitions(mylib PUBLIC MYLIB_WITH_SQLITE)
endif()
...
install(TARGETS mylib EXPORT mylib-targets ...)
install(EXPORT mylib-targets ...)
А в потребляющей библиотеке или исполняемом файле вы можете написать простые проверки во время компиляции:
#ifndef MYLIB_WITH_SQLITE
#error mylib must be built with sqlite
#endif
CMake поддерживает внешние проекты с ExternalProject_Add
где вы можете определить флаги компиляции и более по своему вкусу. Используйте его для создания своих подмодулей.
Больше деталей: https://cmake.org/cmake/help/v3.2/module/ExternalProject.html
Я думаю, что самый простой ответ заключается в использовании -C
вариант, как описано в этом Так ответь.
Одно из решений, которое я рассматриваю, состоит в том, чтобы разветвить репо подмодуля, отредактировать CMakeLists.txt так, чтобы он был более конкретным, а затем включить HEAD-версию разветвленного репо в качестве подмодуля. Не элегантный, но приемлемый.