CMake:在生成器表达式中使用 true/false 或 on/off 或 yes/no
Posted
技术标签:
【中文标题】CMake:在生成器表达式中使用 true/false 或 on/off 或 yes/no【英文标题】:CMake: use of true/false or on/off or yes/no in generator expressions 【发布时间】: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
,而不是生成器表达式。我会等着看是否有人提供更优雅的解决方案。
【参考方案1】:
这就是$<BOOL:...>
生成器表达式的用途。请参阅生成器表达式文档的 Logical Expressions 部分的开头。修改你的例子:
cmake_minimum_required(VERSION 2.8.12)
add_custom_target(print2
$CMAKE_COMMAND -E echo $<$<BOOL:true>:hello> $<$<BOOL:false>:world>
)
【讨论】:
你测试过这个吗?if($<BOOL:true>) message("$<BOOL:true accepted by if") else() message("$<BOOL:true not accepted by if") endif() message(" $ <BOOL:true>: " $<BOOL:true>)
在 CMake 3.17 中不适合我
生成器表达式仅在生成时评估,而不是在配置时评估。 message()
命令无法评估它们,因为它会在配置时尝试这样做。这就是为什么它没有被记录为支持生成器表达式的原因。给出的示例使用了add_custom_command()
,它确实支持生成器表达式。当 CMake 将命令写入项目文件(build.ninja、Makefile、Visual Studio 项目文件等)时,它们会在生成时进行评估。以上是关于CMake:在生成器表达式中使用 true/false 或 on/off 或 yes/no的主要内容,如果未能解决你的问题,请参考以下文章