В чем разница между option и set CACHE BOOL для переменной CMake?

Есть ли разница между двумя следующими?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

Документация: setпараметр

Предыстория: даже если я некоторое время использовал CMake, я только сегодня заметил команду option и поэтому всегда использовал set: мне было интересно, безопасно ли/стоит ли заменить первое вторым.


person Antonio    schedule 01.04.2016    source источник


Ответы (2)


В вашем примере разницы нет. Но могут быть отличия:

  • Option имеет значение по умолчанию OFF.
  • Вы можете сделать параметр зависимым от других параметров с помощью CMakeDependentOption
  • Set принимает типы, отличные от BOOL, особенно ;-списки.

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

person usr1234567    schedule 01.04.2016
comment
Что касается вашего последнего пункта, при использовании set, сделав переменную логической, я не запрещаю пользователю присваивать ей другое значение, например. в командной строке? Во всяком случае, я нахожу ваш второй пункт довольно актуальным. - person Antonio; 01.04.2016
comment
Честно говоря, я никогда не пробовал это. Но я помню, что CMake GUI настраивает свой метод ввода в зависимости от типа переменной. - person usr1234567; 01.04.2016
comment
Это я могу подтвердить (для логической переменной это ставит вам галочку) - person Antonio; 01.04.2016
comment
Однако, если вы используете подход командной строки -D, а не ccmake, CMake с радостью позволит вам установить для переменной/параметра BOOL значения, отличные от BOOL, независимо от того, используете ли вы option или set(...CACHE BOOL). Таким образом, кажется, что этот тип безопасности применим только для ccmake/cmake-gui. - person kdopen; 08.02.2018
comment
Что касается первого пункта: option принимает необязательное начальное значение. Если начальное значение не указано, используется OFF. - person Cnly; 28.05.2021

Наткнулся на этот вопрос и подумал, что добавил обновление.

Как объясняется здесь, команда option не создает переменную CACHE, если нормальная переменная с таким же именем существует. Это поведение было введено в версии 3.13 (где оно используется по умолчанию). С другой стороны, установка переменной CACHE с именем FOO, когда FOO существует как обычная переменная, даст две копии FOO, обычную переменную и копию CACHE.

Следовательно, использование option(FOO "" ON) или set(FOO ON CACHE BOOL "") может также зависеть от того, что вы хотите, чтобы ваша система конфигурации делала, когда переменная с тем же именем уже была определена выше по течению.

Примечание: они ведут себя одинаково, если FOO был определен выше по течению в кэше. Разница только в том, что восходящий поток является нормальной переменной.

person bartgol    schedule 23.06.2020