cmake_minimum_required(VERSION 3.20)
set(on "OFF")
if(on)
message("ON")
else()
message("OFF")
endif()
if(${on})
message("ON")
else()
message("OFF")
endif()
$ cmake -P test.cmake
ON
OFF
Verdadeiro se a constante for 1, ON, YES, TRUE, Y ou um número diferente de zero (incluindo números de ponto flutuante). Falso se a constante for 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, a string vazia ou terminar no sufixo -NOTFOUND. Constantes booleanas nomeadas não diferenciam maiúsculas de minúsculas. Se o argumento não for uma dessas constantes específicas, ele será tratado como uma variável ou string (veja Expansão de Variáveis mais adiante) e uma das duas formas a seguir se aplicar.
Minha compreensão desse problema é que
Para constantes predefinidas ON, é equivalente a on.
Para if(on)
, on
será analisado como constante predefinida ON
.
Para if(${on})
, ${on}
será analisado como "OFF", o que equivale a OFF
.
Não sei se meu entendimento está correto.
O que é on
?
É uma sequência de dois caracteres.
Todas as variáveis do CMake são sequências de caracteres (ou listas, que são sequências separadas por ponto e vírgula). A interpretação de uma variável depende do contexto.
Você já citou a seção correta da documentação do CMake sobre
if
. Ela afirma que, se o argumento for (entre outras coisas)ON
(sem distinção entre maiúsculas e minúsculas), é uma constante e é avaliado como "true". Se não for nenhuma das constantes mágicas, é tratado como uma variável ou uma string. Seus exemplos nunca chegam lá, no entanto.A seção sobre expansão de variáveis ressalta que
${}
a avaliação acontece antesif
mesmo de ver os argumentos. Ela também apresenta um exemplo muito parecido com o seu, só que usa nomes de variáveis muito menos confusos.Para finalizar:
on
é interpretado como a constanteON
que torna a condição verdadeira.${on}
sofre expansão de variável para se tornar a stringOFF
. Esta, por sua vez, é inserida na condicional para se tornar,if(OFF)
que é avaliada como falsa porqueOFF
é uma das constantes mágicas.on
imprimirá "OFF" em ambos os exemplos. Ela será avaliada como uma variável porif
ou avaliada antes deif
, respectivamente, conforme explicado acima.Solução: não use nomes de constantes para suas variáveis. Uma declaração como essa
set(on OFF)
parece ofuscação deliberada.