IF生成器表达式,带选项作为参数

问题描述 投票:0回答:2

我有一个脚本(CMake 3.12),看起来像这样(删除了多余的东西):

option(XXH_D_FNF "" OFF)
...
target_compile_definitions(xxh PRIVATE $<IF:XXH_D_FNF, XXH_FORCE_NATIVE_FORMAT, > XXH_FORCE_MEMORY_ACCESS=${XXH_D_FMA})

意图是将预处理程序定义XXH_FORCE_NATIVE_FORMAT添加到target_compile_defintions,前提是相关选项设置为ON,否则保持未定义状态。但是,这给了我错误:

First parameter to $<IF> must resolve to exactly one '0' or '1' value.

[通过将XXH_D_FNF包装在${}中不是固定的。如何使用此选项的值作为表达式中的条件?

cmake
2个回答
1
投票
这里没有理由使用生成器表达式。 target_compile_definitions和所有类似接口都是累积的。刚:

target_compile_definitions(xxh PRIVATE XXH_FORCE_MEMORY_ACCESS=${XXH_D_FMA}) if (XXH_D_FNF) target_compile_definitions(xxh PRIVATE XXH_FORCE_NATIVE_FORMAT) endif()


0
投票
conditional生成器表达式的文档(包括使用IF的表达式):

$<IF:condition,true_string,false_string>

如果true_stringcondition,则评估为1。否则求值为false_string。通常,condition

布尔值生成器表达式。

因此,您的条件

itself必须是boolean生成器表达式。因此,如果将XXH_D_FNF包装在布尔生成器表达式中,则将使用$<BOOL:${XXH_D_FNF}>。当选项为false时,该值为OFF,否则为true

因此,您对target_compile_definitions的完整呼叫看起来像这样:

target_compile_definitions(xxh PRIVATE $<IF:$<BOOL:${XXH_D_FNF}>, XXH_FORCE_NATIVE_FORMAT, > XXH_FORCE_MEMORY_ACCESS=${XXH_D_FMA})

© www.soinside.com 2019 - 2024. All rights reserved.