Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:在生成器表达式中使用真/假、开/关或是/否_Cmake - Fatal编程技术网

CMake:在生成器表达式中使用真/假、开/关或是/否

CMake:在生成器表达式中使用真/假、开/关或是/否,cmake,Cmake,除了在CMake的生成器表达式中使用1/0之外,还有什么方法可以使使用true/false或on/off或yes/no更容易或可能吗? 上下文 就这一点而言,在生成器表达式中只能识别1和0 但是,就命令而言,1、ON、YES、TRUE、Y都被视为布尔值 这使一些事情令人困惑;例如,可以使用选项命令在配置阶段从用户获取输入,然后尝试在生成器表达式中使用其值;但是,在这种情况下,如果值不是1或0,cmake会抱怨。这同样适用于存储在CMake缓存中的布尔变量 例子 以下是其输出(在配置时): ——配

除了在CMake的生成器表达式中使用
1/0
之外,还有什么方法可以使使用
true/false
on/off
yes/no
更容易或可能吗?

上下文 就这一点而言,在生成器表达式中只能识别
1
0

但是,就命令而言,
1
ON
YES
TRUE
Y
都被视为布尔值

这使一些事情令人困惑;例如,可以使用
选项
命令在配置阶段从用户获取输入,然后尝试在生成器表达式中使用其值;但是,在这种情况下,如果值不是
1
0
,cmake会抱怨。这同样适用于存储在CMake缓存中的布尔变量

例子 以下是其输出(在配置时):

——配置完成
CMakeLists.txt处的CMake错误:3(添加自定义目标):
计算生成器表达式时出错:
$
表达式的计算结果不是已知的生成器表达式
CMakeLists.txt处的CMake错误:3(添加自定义目标):
计算生成器表达式时出错:
$
表达式的计算结果不是已知的生成器表达式
--生成完成
--生成文件已写入:/tmp/cmake
再次:

除了在CMake的生成器表达式中使用
1/0
之外,还有什么方法可以使使用
true/false
on/off
yes/no
更容易或可能吗?

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

这就是
$
生成器表达式的用途。请参见生成器表达式文档部分的开头。修改您的示例:

cmake_minimum_required(VERSION 2.8.12)

add_custom_target(print2
    ${CMAKE_COMMAND} -E echo $<$<BOOL:true>:hello> $<$<BOOL:false>:world>
)
cmake_最低要求(版本2.8.12)
添加自定义目标(打印2
${CMAKE_COMMAND}-E echo$$
)

您可以编写一个函数,使用
if
对变量求值,并相应地将父范围内变量的值设置为1或0。不太好,我得承认。是的,这是我想到的第一件事。我可能会这样做,或者干脆使用
if/else
,而不是生成器表达式。我会等着看是否有人提供了更优雅的解决方案。你测试过这个吗
if($)message(“$生成器表达式仅在生成时求值,而不是在配置时求值。
message()
命令无法求值,因为它试图在配置时进行求值。这就是为什么它没有作为支持生成器表达式进行记录的原因。给出的示例使用
add\u custom\u命令()
,它不支持生成器表达式。当CMake将命令写入项目文件(build.ninja、Makefile、Visual Studio项目文件等)时,会在生成时对它们进行计算。
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
cmake_minimum_required(VERSION 2.8.12)

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