我有一个脚本(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
包装在${}
中来解决的。如何使用此选项的值作为表达式中的条件?
答案 0 :(得分: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()
答案 1 :(得分:0)
conditional生成器表达式的文档(包括使用IF
的表达式)说:
$<IF:condition,true_string,false_string>
如果
true_string
为condition
,则求值为1
。否则求值为false_string
。 通常,condition
是布尔值生成器表达式。
因此,您的条件自身必须是一个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})