Ternary operator in CMake's generator expressions
Note that cmake 3.8 added exactly what you want to generator expressions ...
$<IF:?,true-value...,false-value...>
true-value... if ? is 1, false-value... if ? is 0
Example usage:
target_link_libraries(MyLib PUBLIC
$<IF:$<CONFIG:Debug>,cppzmq,cppzmq-static>
)
Where cppzmq
is shared library used in Debug
build and cppzmq-static
is static library used in other case e.g. Release
Here's a working example, with a 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}
)
Create a CMakeLists.txt
file and run cmake . && make print
(generator expressions are only evaluated at build time).
Try changing the value of mybool
to 0
or 1
and see what happens.
The following definition also works, and it is clearer:
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)
means, comparing to C/C++:
int var = boolean ? value1 : value2;