cmake ternary-operator

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;