Я работаю над проектом с несколькими командами 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.
Я предложил три решения:
- Отключение всех известных мне опций не будет использоваться из внешнего файла.
Это решение быстро ломается для "глубоких" проектов, так как ELSE (OPTION_A) теперь нужно сбросить (.. . CACHE) и OPTION_B, OPTION_ C, и все другие кэшированные переменные их соответствующих подкаталогов. - Очистите CMakeCache и начните настройку с нуля.
Это решение не работает для "широких" проектов, так как очистить одно поле параметров Я вынужден очистить переменные кэша его каталогов. - Изменить cmake, чтобы иметь "непрозрачный" кэш, для переменных, сохраненных, но не доступных на этапе генерации.
Изменить ccmake на серый Отключить / скрыть «непрозрачный» кэш, представляя только кэшированные переменные, к которым осуществляется доступ.
Не должно нарушать автоматическое использование c cmake, а поскольку ccmake является GUI, я думаю, что это тоже не является серьезным изменением.
Существует ли универсальное решение как для "широкой", так и для "глубокой" иерархии cmake, которое не потребует модификации cmake? Стоит ли это общая проблема, требующая усилий?