CMake生成器表达式中的三元运算符

Dan*_*olf 19 cmake ternary-operator

Cmake的生成器表达式允许我在某些函数调用中使用逻辑表达式.例如,如果我想/MTd在调试模式下添加编译器标志,我可以说

add_compile_options($<$<CONFIG:Debug>:/MTd>)
Run Code Online (Sandbox Code Playgroud)

如果CONFIG等于"Debug",则将add_compile_options使用值"/ MTd" 调用,否则使用空字符串调用.

但通常,我不想在值和空字符串之间做出决定,而是在两个值之间做出决定.在上面的例子中,如果CONFIG "调试",我想通过/MT(没有拖尾d).我希望有这样的语法:

add_compile_options($<$<CONFIG:Debug>:/MTd:/MT>)
Run Code Online (Sandbox Code Playgroud)

请注意,根据CMake规范,上述内容不是有效代码.我提出的最好的实际工作是这样的:

add_compile_options($<$<CONFIG:Debug>:/MTd>$<$<NOT:$<CONFIG:Debug>>:/MT>)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是多余的.是否有更短,更易读的方式来决定两个值?

注意:我意识到在这种特殊情况下,我可以这样写:

add_compile_options(/MT$<$<CONFIG:Debug>:d>)
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎相当苛刻,只适用于其中一个选项是另一个选项的子串的情况.

thi*_*wfx 5

这是一个带有宏的工作示例:

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}
    )
Run Code Online (Sandbox Code Playgroud)

创建一个CMakeLists.txt文件并运行cmake . && make print(生成器表达式仅在构建时评估).

尝试改变的值mybool0或者1看看会发生什么.

以下定义也有效,更清楚:

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}
    )
Run Code Online (Sandbox Code Playgroud)

TL; DR

ternary(var boolean value1 value2)

意味着,与C/C++相比:

int var = boolean ? value1 : value2;

  • 只是一个提示:我认为,如果`boolean`包含一个生成器表达式,那么第一个(取消引用变量的内容)和第二个定义(`if`检查变量内容)都不会起作用. (2认同)

Lan*_*pte 5

请注意,cmake 3.8完全添加了您想要生成的表达式...

$<IF:?,true-value...,false-value...>
true-value... if ? is 1, false-value... if ? is 0
Run Code Online (Sandbox Code Playgroud)

  • 好发现!此处记录了以下内容:https://cmake.org/cmake/help/v3.8/manual/cmake-generator-expressions.7.html#id3 (2认同)