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)
但这对我来说似乎相当苛刻,只适用于其中一个选项是另一个选项的子串的情况.
这是一个带有宏的工作示例:
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(生成器表达式仅在构建时评估).
尝试改变的值mybool来0或者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)
ternary(var boolean value1 value2)
意味着,与C/C++相比:
int var = boolean ? value1 : value2;
请注意,cmake 3.8完全添加了您想要生成的表达式...
$<IF:?,true-value...,false-value...>
true-value... if ? is 1, false-value... if ? is 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3787 次 |
| 最近记录: |