Выражение генератора IF с опцией в качестве параметра - PullRequest
1 голос
/ 27 сентября 2019

У меня есть скрипт (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 ]

1 голос
/ 27 сентября 2019

Нет причин использовать выражения генератора здесь.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 голосов
/ 27 сентября 2019

Документация для условных выражений генератора (которая включает выражения, использующие IF) гласит:

$<IF:condition,true_string,false_string>

Оценивается как true_string, если condition равно 1.В противном случае оценивается как false_string.Как правило, condition является логическим выражением генератора .

Итак, ваше условие само должно быть логическим выражением генератора,Поэтому, если мы обернем 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...