Есть ли способ иметь список переменных в CMake? В частности, то, что я хочу сделать, - это вызов существующей функции, которая принимает несколько переменных и проверяет, соответствуют ли они true.Список переменных в CMake
В некоторых случаях некоторые из этих переменных будут пустыми списками (которые оцениваются как false), и функция не работает (как предполагалось). Но иногда мне даже не нужны эти переменные, поэтому было бы хорошо, если бы они были пустыми, и из-за этого функция не должна терпеть неудачу. Есть ли способ передать некоторые переменные только в некоторых случаях?
Код я в настоящее время иметь дело с является модулем CMake, чтобы найти пакет:
include(FindPackageHandleStandardArgs)
# create empty list
list(APPEND mylib_LIBRARIES "")
# in some cases, the list contains elements
if(A)
list(APPEND mylib_LIBRARIES "foo")
endif(A)
# if the list mylib_LIBRARIES is empty, this will fail
find_package_handle_standard_args(mylib REQUIRED_VARS bar mylib_LIBRARIES)
Если A
истинно, ${mylib_LIBRARIES}
действительно содержит содержание и все хорошо. В противном случае список пуст, который вычисляет false внутренне и последняя строка дает ошибку.
В идеале, существует возможность создать мета-переменную, содержащую список переменных, которые я хочу передать функции. Тогда я мог бы добавить mylib_LIBRARIES
только в некоторых случаях.
псевдокод:
include(FindPackageHandleStandardArgs)
# create empty list
list(APPEND mylib_LIBRARIES "")
# the bar variable is always used
meta_list(APPEND METALIST bar)
# in some cases add the used variable mylib_LIBRARIES to the METALIST
if(A)
list(APPEND mylib_LIBRARIES "foo")
meta_list(APPEND METALIST mylib_LIBRARIES)
endif(A)
# METALIST will contain exactly the variables that need evaluation
find_package_handle_standard_args(mylib REQUIRED_VARS ${METALIST})
Примечания: наличие нескольких вызовов find_package_handle_standard_args
не практично из-за комбинаторные взрывы.
Ваш подход с переменной «METALIST» правильный и делает именно то, что вы хотите. Означает ли это, что ваша проблема решена? BTW, если допустимо, чтобы переменная 'mylib_LIBRARIES' имела * любое * значение, почему вы используете ее в' find_package_handle_standard_args() 'call? – Tsyvarev
Проблема в том, что 'METALIST' - это всего лишь некоторый псевдокод, который я придумал в своей голове. Или вы говорите, что это на самом деле вещь? Если это так, я не знаю точного синтаксиса (и был бы признателен за ответ). – Slizzered
mylib_LIBRARIES * must * имеет значение в случае 'A == true' (которое должно быть проверено позже), но оно не может иметь значение в случае' A == false'. Так что иногда это REQUIRED_VAR, а иногда и не – Slizzered