У меня есть проект C++ с ядром, которое в основном автономно, но с множеством интерфейсов для сторонних кодов, которые пользователь может захотеть или не захотеть компилировать. Мы создаем код с помощью CMake, и теперь я пытаюсь немного лучше организовать код.
Решение, которое я придумал, состоит в том, чтобы добавить в верхний файл CMakeLists.txt набор опций, которые определяют, должен ли быть обнаружен зависимый пакет или нет.
option(WITH_FOO "Compile the interface to Foo, if found" ON)
option(REQUIRE_FOO "Require that the Foo interface to be compiled" OFF)
option(WITH_BAR "Compile the interface to Bar, if found" ON)
option(REQUIRE_BAR "Require that the Bar interface to be compiled" OFF)
...
if(WITH_FOO)
if(REQUIRE_FOO)
find_package(Foo REQUIRED)
else(REQUIRE_FOO)
find_package(Foo)
endif(REQUIRE_FOO)
else(WITH_FOO)
set(FOO_FOUND FALSE)
endif(WITH_FOO)
if(WITH_BAR)
if(REQUIRE_BAR)
find_package(Bar REQUIRED)
else(REQUIRE_BAR)
find_package(Bar)
endif(REQUIRE_BAR)
else(WITH_BAR)
set(BAR_FOUND FALSE)
endif(WITH_BAR)
Затем в файлах CMakeLists.txt в подкаталогах будут такие утверждения, как:
if(BAR_FOUND)
add_subdirectory(bar_interface)
endif(BAR_FOUND)
Мне не особенно нравится это решение, отчасти потому, что оно очень многословно, а отчасти потому, что я чувствую, что должны быть некоторые более стандартизированный способ сделать это. Кто-нибудь знает о лучшем, более ремонтопригодном решении?