Я пытаюсь создать нетривиальную конфигурацию проекта с разными переменными, где конкретный c должен быть рассчитан на основе другой переменной. Не всегда, но изначально, и если пользователь не установил вторую переменную из CLI, то при изменении первой переменной будет пересчитана первая. И если вторая переменная была установлена вручную, то (и только тогда) она должна быть кэширована.
Кроме того, обе переменные должны появиться в cmake- gui, и они набираются в STRING.
Теперь подвох: для cmake- gui я должен использовать "CACHE STRING ..." spe c с директивой set. Что делает его липким таким образом, который я не могу контролировать (с помощью условий, упомянутых выше). Я могу сделать это условным предикатом (DEFINED (xxx)), но это также не дает правильных результатов (то есть не отображается в пользовательском интерфейсе, если пользователь не установил его, также после кэширования, и нет способа определить, был ли он переопределен пользователем снова или должен быть пересчитан из главной переменной).
Я мог бы представить какое-то решение, сравнив его с тем, что у нас было раньше в кеше, но я также не вижу способа получить старые значения кеша.
Так что Вопрос в том, что было бы лучшим способом написать такое интеллектуальное обновление?
# WRONG example
if(not defined(CMAKE_INSTALL_PREFIX))
set(CMAKE_INSTALL_PREFIX "/opt/${ACME}")
endif()
if(not defined(ASSETDIR))
set(ASSETDIR "${CMAKE_INSTALL_PREFIX}/assets/${ACME}")
else()
set(ASSETDIR "${CMAKE_INSTALL_PREFIX}/assets/${ACME}" CACHE STRING "Override path for assets")
endif()