Что делать, если разные параметры конфигурации CMake, заданные пользователем, конфликтуют?

Предположим, у меня есть две кэшированные строки CMake для установки пользователем, но некоторые комбинации значений конфликтуют.

Пример:

set(FOO OFF CACHE BOOL "Foo")
set(BAR OFF CACHE BOOL "Bar")

но у вас не может быть и Фу, и Бар.

Очевидно, мы можем предотвратить это с помощью:

if (FOO AND BAR)
    message(FATAL_ERROR "Can't have both Foo and Bar.")
endif()

а есть ли какой-то другой механизм? например что-то, что в ccmake заставило бы значение BAR вернуться к false, если для FOO установлено значение true, и наоборот?

Примечание. Это упрощенный пример. В простом случае можно просто выбрать один параметр с тремя состояниями, но это не сработает, когда у вас есть несколько возможных значений и несколько более сложный предикат запрещенной комбинации.


person einpoklum    schedule 09.12.2019    source источник
comment
Поможет ли CMAKE_DEPENDENT_OPTION?   -  person vre    schedule 09.12.2019
comment
@vre: О, да! Пожалуйста, сделайте это ответом...   -  person einpoklum    schedule 09.12.2019
comment
вернет значение BAR к false, если для FOO установлено значение true, и наоборот? - Данный регистр может быть более выражен в более естественной форме с помощью одного параметра tristate. set(FEATURE "None" CACHE STRING "Could be 'Foo', 'Bar' or 'None'"). Используя свойство STRINGS, вы можете установить список возможных значений для Графический интерфейс CMake.   -  person Tsyvarev    schedule 09.12.2019
comment
@Tsyvarev: На самом деле мой случай сложнее, я только упростил его для примера здесь.   -  person einpoklum    schedule 09.12.2019


Ответы (2)


Для этой цели можно использовать cmake_dependent_option, он устанавливает параметр, основанный на истинности другого набора переменных.

Например,

cmake_option(FOO "Use Foo" ON)
cmake_dependent_option(BAR "Use Bar" ON "NOT FOO" OFF)

Дополнительную информацию см. в документации по CMake.

person vre    schedule 09.12.2019

Вы можете использовать параметр FORCE set, чтобы принудительно установить значение переменной кэша CMake.

if (FOO)
  set(BAR OFF CACHE BOOL "Bar" FORCE)
elseif (BAR)
  set(FOO OFF CACHE BOOL "Foo" FORCE)
endif()

Это будет отражено в графическом интерфейсе после следующего прохода Configure.

person Roland Sarrazin    schedule 09.12.2019
comment
У меня есть эти линии в дополнение к моим, или вместо них? - person einpoklum; 09.12.2019
comment
В дополнение к начальному объявлению переменной кэша. Тем не менее, ответ @vre, вероятно, лучше подойдет для вашего варианта использования. - person Roland Sarrazin; 10.12.2019