CMake:在生成器表达式中使用true / false或on / off或yes / no

thi*_*wfx 6 cmake

有什么办法可以很容易或可能使用true/falseon/offyes/no在CMake的的发电机表情,除了1/0

语境

至于文档而言,仅10正在生成器表达式内的认可。

然而,至于如果命令而言,1ONYESTRUEY都被认为是布尔值。

这使某些事情变得混乱。例如,可以option在配置阶段使用该命令从用户获取输入,然后尝试在生成器表达式中使用其值;但是,在这种情况下,如果值不是1或,则cmake会抱怨0。存储在CMake缓存中的布尔变量也是如此。

SSCCE示例

cmake_minimum_required(VERSION 2.8.12)

add_custom_target(print
    ${CMAKE_COMMAND} -E echo $<1:hello> $<0:world>
    )
Run Code Online (Sandbox Code Playgroud)

创建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>
    )
Run Code Online (Sandbox Code Playgroud)

这是它的输出(在配置时):

-- 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
Run Code Online (Sandbox Code Playgroud)

再次:

有什么办法可以很容易或可能使用true/falseon/offyes/no在CMake的的发电机表情,除了1/0

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

Cra*_*ott 5

这就是$<BOOL:...>生成器表达式的作用。请参阅生成器表达式文档的“ 逻辑表达式”部分的开头。修改示例:

cmake_minimum_required(VERSION 2.8.12)

add_custom_target(print2
    ${CMAKE_COMMAND} -E echo $<$<BOOL:true>:hello> $<$<BOOL:false>:world>
)
Run Code Online (Sandbox Code Playgroud)

  • 生成器表达式仅在生成时计算,而不是在配置时计算。`message()` 命令无法评估它们,因为它尝试在配置时执行此操作。这就是为什么它没有被记录为支持生成器表达式。给出的示例使用“add_custom_command()”,它支持生成器表达式。当 CMake 将命令写入项目文件(build.ninja、Makefile、Visual Studio 项目文件等)时,它们会在生成时进行评估。 (3认同)