Как организовать иерархию файлов cmake с несколькими необязательными зависимостями

У меня есть проект 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)

Мне не особенно нравится это решение, отчасти потому, что оно очень многословно, а отчасти потому, что я чувствую, что должны быть некоторые более стандартизированный способ сделать это. Кто-нибудь знает о лучшем, более ремонтопригодном решении?

7
задан Joel 17 April 2013 в 09:43
поделиться