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/falseon/offyes/no在CMake的生成器表达式中使用变得简单或可行?

上下文

就documentation 而言,只有10 在生成器表达式中被识别。

但是,就if 命令而言,1ONYESTRUEY 都被视为布尔值。

这让一些事情变得混乱;例如,可以使用option 命令在配置阶段从用户那里获取输入,然后尝试在生成器表达式中使用它的值;但是,在这种情况下,如果值不是10,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/falseon/offyes/no在CMake的生成器表达式中使用变得简单或可行?

或者,一种简单的方法将具有这些值之一的变量转换为1/0,以便随后可以在生成器表达式中使用?

【问题讨论】:

您可以编写一个函数,使用if 评估您的变量,并相应地将父范围内的变量值设置为 1 或 0。不好,我不得不承认。 是的,这是我首先想到的。我最终可能会这样做,或者只是使用if/else,而不是生成器表达式。我会等着看是否有人提供更优雅的解决方案。 【参考方案1】:

这就是$&lt;BOOL:...&gt; 生成器表达式的用途。请参阅生成器表达式文档的 Logical Expressions 部分的开头。修改你的例子:

cmake_minimum_required(VERSION 2.8.12)

add_custom_target(print2
    $CMAKE_COMMAND -E echo $<$<BOOL:true>:hello> $<$<BOOL:false>:world>
)

【讨论】:

你测试过这个吗? if($&lt;BOOL:true&gt;) message("$&lt;BOOL:true accepted by if") else() message("$&lt;BOOL:true not accepted by if") endif() message(" $ &lt;BOOL:true&gt;: " $&lt;BOOL:true&gt;) 在 CMake 3.17 中不适合我 生成器表达式仅在生成时评估,而不是在配置时评估。 message() 命令无法评估它们,因为它会在配置时尝试这样做。这就是为什么它没有被记录为支持生成器表达式的原因。给出的示例使用了add_custom_command(),它确实支持生成器表达式。当 CMake 将命令写入项目文件(build.ninja、Makefile、Visual Studio 项目文件等)时,它们会在生成时进行评估。

以上是关于CMake:在生成器表达式中使用 true/false 或 on/off 或 yes/no的主要内容,如果未能解决你的问题,请参考以下文章

cmake基础教程(40)生成器表达式

cmake基础教程(40)生成器表达式

运行时输出目录的 cmake 生成器表达式

Python:在生成器中生成字典元素?

准备一个函数以在生成器运行器中重复使用

python 生成器:生成器基础生成器表达式