Operador ternario en expresiones generadoras de CMake.
ternary-operator (1)
Las expresiones generadoras de Cmake me permiten usar expresiones lógicas dentro de ciertas llamadas a funciones. Por ejemplo, si quiero agregar la /MTd
compilador /MTd
en el modo de depuración, puedo decir
add_compile_options($<$<CONFIG:Debug>:/MTd>)
Si CONFIG
es igual a "Debug", esto llamará a add_compile_options
con el valor "/ MTd", de lo contrario con una cadena vacía.
Pero generalmente, no quiero decidir entre un valor y la cadena vacía, sino entre dos valores. En el ejemplo anterior, si CONFIG
no es "Debug", quiero pasar /MT
(sin la d final). Me encantaría tener una sintaxis como esta:
add_compile_options($<$<CONFIG:Debug>:/MTd:/MT>)
Tenga en cuenta que lo anterior no es un código válido de acuerdo con las especificaciones de CMake. Lo mejor que he encontrado que realmente funciona es esto:
add_compile_options($<$<CONFIG:Debug>:/MTd>$<$<NOT:$<CONFIG:Debug>>:/MT>)
Esto me parece tremendamente redundante. ¿Hay una forma más corta y legible de decidir entre dos valores?
Nota: Me doy cuenta de que en este caso especial, podría escribir esto:
add_compile_options(/MT$<$<CONFIG:Debug>:d>)
Pero esto me parece bastante intrépido y solo funciona en aquellos casos en que una opción es una subcadena de la otra.
Aquí hay un ejemplo de trabajo, con una macro:
cmake_minimum_required(VERSION 2.8.12)
macro(ternary var boolean value1 value2)
set(${var} $<${${boolean}}:${value1}>$<$<NOT:${${boolean}}>:${value2}>)
endmacro()
set(mybool 0)
ternary(myvar mybool hello world)
add_custom_target(print
${CMAKE_COMMAND} -E echo ${myvar}
)
Cree un archivo CMakeLists.txt
y ejecute cmake . && make print
cmake . && make print
(las expresiones del generador solo se evalúan en el momento de la compilación).
Intente cambiar el valor de mybool
a 0
o 1
y vea qué sucede.
La siguiente definición también funciona, y es más clara:
cmake_minimum_required(VERSION 2.8.12)
macro(ternary var boolean value1 value2)
if(${boolean})
set(${var} ${value1})
else()
set(${var} ${value2})
endif()
endmacro()
set(mybool 0)
ternary(myvar mybool hello world)
add_custom_target(print
${CMAKE_COMMAND} -E echo ${myvar}
)
TL; DR
ternary(var boolean value1 value2)
medios, en comparación con C / C ++:
int var = boolean ? value1 : value2;