2015-07-16 5 views
1

Есть ли способ иметь список переменных в 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 не практично из-за комбинаторные взрывы.

+0

Ваш подход с переменной «METALIST» правильный и делает именно то, что вы хотите. Означает ли это, что ваша проблема решена? BTW, если допустимо, чтобы переменная 'mylib_LIBRARIES' имела * любое * значение, почему вы используете ее в' find_package_handle_standard_args() 'call? – Tsyvarev

+0

Проблема в том, что 'METALIST' - это всего лишь некоторый псевдокод, который я придумал в своей голове. Или вы говорите, что это на самом деле вещь? Если это так, я не знаю точного синтаксиса (и был бы признателен за ответ). – Slizzered

+0

mylib_LIBRARIES * must * имеет значение в случае 'A == true' (которое должно быть проверено позже), но оно не может иметь значение в случае' A == false'. Так что иногда это REQUIRED_VAR, а иногда и не – Slizzered

ответ

2

Ваш псевдо-код с METALIST переменная обрабатывается после простой замены meta_list с командой list. Кроме того, вы можете разграничить A-зависимые переменные («foo») от других («bar»).

BTW, лучше инициализировать список-переменные, используя set(). Это защитит от случайного столкновения с именами во внешнем масштабе.

include(FindPackageHandleStandardArgs) 

# List of variables dependent from 'A' condition. 
set(A_VARS "") 

if(A) 
    set(mylib_LIBRARIES "foo") # Other libraries can be added via list() 
    list(APPEND A_VARS mylib_LIBRARIES) 
endif(A) 

find_package_handle_standard_args(mylib REQUIRED_VARS bar ${A_VARS}) 
+0

Спасибо большое! Должно быть, я получил синтаксис как-то неправильно в моих попытках и думал, что это невозможно. Приятно иногда ошибаться. – Slizzered

Смежные вопросы