【发布时间】:2016-12-10 19:14:59
【问题描述】:
除了1/0之外,还有什么方法可以让true/false或on/off或yes/no在CMake的生成器表达式中使用变得简单或可行?
上下文
就documentation 而言,只有1 和0 在生成器表达式中被识别。
但是,就if 命令而言,1、ON、YES、TRUE、Y 都被视为布尔值。
这让一些事情变得混乱;例如,可以使用option 命令在配置阶段从用户那里获取输入,然后尝试在生成器表达式中使用它的值;但是,在这种情况下,如果值不是1 或0,cmake 会报错。这同样适用于存储在 CMake 缓存中的布尔变量。
SSCCE 示例
cmake_minimum_required(VERSION 2.8.12)
add_custom_target(print
${CMAKE_COMMAND} -E echo $<1:hello> $<0:world>
)
使用上述内容创建一个CMakeLists.txt 文件,运行cmake .,然后运行make(生成器表达式仅在构建时评估)。它将按预期打印hello。
但是,以下示例甚至不适用于 cmake 命令本身:
cmake_minimum_required(VERSION 2.8.12)
add_custom_target(print2
${CMAKE_COMMAND} -E echo $<true:hello> $<false:world>
)
这是它的输出(在配置时):
-- Configuring done
CMake Error at CMakeLists.txt:3 (add_custom_target):
Error evaluating generator expression:
$<true:hello>
Expression did not evaluate to a known generator expression
CMake Error at CMakeLists.txt:3 (add_custom_target):
Error evaluating generator expression:
$<false:world>
Expression did not evaluate to a known generator expression
-- Generating done
-- Build files have been written to: /tmp/cmake
再次:
除了1/0之外,还有什么方法可以让true/false或on/off或yes/no在CMake的生成器表达式中使用变得简单或可行?
或者,一种简单的方法将具有这些值之一的变量转换为1/0,以便随后可以在生成器表达式中使用?
【问题讨论】:
-
您可以编写一个函数,使用
if评估您的变量,并相应地将父范围内的变量值设置为 1 或 0。不好,我不得不承认。 -
是的,这是我首先想到的。我最终可能会这样做,或者只是使用
if/else,而不是生成器表达式。我会等着看是否有人提供更优雅的解决方案。
标签: cmake