【发布时间】:2016-03-27 09:39:34
【问题描述】:
Cmake 的generator expressions 允许我在某些函数调用中使用逻辑表达式。例如,如果我想在 Debug 模式下添加 /MTd 编译器标志,我可以说
add_compile_options($<$<CONFIG:Debug>:/MTd>)
如果CONFIG 等于“Debug”,这将使用值“/MTd”调用add_compile_options,否则使用空字符串。
但通常,我不想在一个值和空字符串之间做出决定,而是在两个值之间做出决定。在上面的例子中,如果CONFIG 是not“调试”,我想传递/MT(没有尾随的d)。我希望有这样的语法:
add_compile_options($<$<CONFIG:Debug>:/MTd:/MT>)
请注意,根据 CMake 规范,上述代码无效。我想出的最好的实际上是这样的:
add_compile_options($<$<CONFIG:Debug>:/MTd>$<$<NOT:$<CONFIG:Debug>>:/MT>)
这对我来说似乎非常多余。是否有更短、更易读的方法来决定两个值?
注意:我意识到在这种特殊情况下,我可以这样写:
add_compile_options(/MT$<$<CONFIG:Debug>:d>)
但这对我来说似乎相当 hacky,并且仅在一个选项是另一个选项的子字符串的情况下才有效。
【问题讨论】:
-
我认为目前不可能(至于 CMake 版本 3.4.1),但是已经有一个功能请求 0015585: Add support for the if / else construct to generator expressions 你可以支持。
-
暂时你可以定义一个宏,实际上将你的调用限制在
your_macro(Debug,/MTd,/MT) -
我在回答中提供了宏定义。
-
$<IF>运算符刚刚添加了 this commit。