以Option为参数的IF Generator表达式

时间:2019-09-27 13:12:19

标签: cmake

我有一个脚本(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包装在${}中来解决的。如何使用此选项的值作为表达式中的条件?

2 个答案:

答案 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_stringcondition,则求值为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})