Зависимые параметры кэширования в cmake через ccmake - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над проектом с несколькими командами OPTION в иерархии cmake.
Если включена одна опция (OPTION_A = ON), то другие опции (OPTION_B) добавляются через вновь включенный подкаталог в кэш cmake:

CMakeLists.txt:

OPTION(OPTION_A "Do such and such" OFF)
IF(OPTION_A)
    add_subdirectory(subdir)
ENDIF(OPTION_A)

subdir / CMakeLists.txt:

OPTION(OPTION_B "Do this and that" OFF)
IF(OPTION_B)
    add_subdirectory(subsubdir)
ENDIF(OPTION_B)

subdir / subsubdir /CMakeLists.txt:

OPTION(OPTION_C "Do foo then bar" OFF)
IF(OPTION_C)
    <...>
ENDIF(OPTION_C)

Это хорошо, так как, например, при работе с ccmake меня не беспокоит OPTION_B / C, если OPTION_A / B не был настроен ON, таким образом генерируя OPTION_B / C в CMakeCache.txt

Проблема в обратном направлении:
при отключении OPTION_A, OPTION_B & OPTION_ C кэшируется переменные по-прежнему отображаются в ccmake.

Я предложил три решения:

  1. Отключение всех известных мне опций не будет использоваться из внешнего файла.
    Это решение быстро ломается для "глубоких" проектов, так как ELSE (OPTION_A) теперь нужно сбросить (.. . CACHE) и OPTION_B, OPTION_ C, и все другие кэшированные переменные их соответствующих подкаталогов.
  2. Очистите CMakeCache и начните настройку с нуля.
    Это решение не работает для "широких" проектов, так как очистить одно поле параметров Я вынужден очистить переменные кэша его каталогов.
  3. Изменить cmake, чтобы иметь "непрозрачный" кэш, для переменных, сохраненных, но не доступных на этапе генерации.
    Изменить ccmake на серый Отключить / скрыть «непрозрачный» кэш, представляя только кэшированные переменные, к которым осуществляется доступ.
    Не должно нарушать автоматическое использование c cmake, а поскольку ccmake является GUI, я думаю, что это тоже не является серьезным изменением.

Существует ли универсальное решение как для "широкой", так и для "глубокой" иерархии cmake, которое не потребует модификации cmake? Стоит ли это общая проблема, требующая усилий?

1 Ответ

1 голос
/ 19 февраля 2020

Что Цыварев упомянул в комментарии, вы можете сделать опции, которые зависят от других опций, используя CMakeDependentOption.

Здесь OPTION_B становится доступным и по умолчанию только ON если OPTION_A равно ON, в противном случае будет установлено значение OFF. Вы также можете установить значение по умолчанию OFF, но я сделал это ON здесь, чтобы было понятно, что:

OPTION(OPTION_A "Do such and such" OFF)

CMAKE_DEPENDENT_OPTION(OPTION_B "Do this and that" ON
                       "OPTION_A" OFF)
...