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