2016-12-16 2 views
2

Я хочу создать функцию CMake, которая принимает в качестве первого аргумента список и второй аргумент с одним именем.Передача массивов функции

function (my_function PROJECT_SRC DEPENDENCY_LIB) 
    message (STATUS "Dependency lib is ${DEPENDENCY_LIB}") 
endfunction() 

Когда я его использую, это не то, что я ожидаю. Если я добавляю список с некоторым исходным файлом, функция печатает второй аргумент списка.

file (GLOB TEST_SRC *.cpp) 
set (MY_DEPENDENCY "Something") 
# It prints "Dependency lib is something/inside/TEST_SRC" 
my_function(${TEST_SRC} ${MY_DEPENDENCY}) 

Как получить второй аргумент, который я передаю функции? Есть ли способ различать списки и отдельные значения при передаче переменных функции CMake?

+0

могли бы вы так добры и принять один из ответов на этот вопрос, чтобы оставаться закрытым? – Kamiccolo

ответ

2

Прежде всего ... вернуться к основам CMake. Что такое list? [1] [2]

Это просто строка, содержащая ; разделенные значения. Таким образом, следующее:

set(FOO "test") 
list(LENGTH FOO FOO_LEN) 
message(STATUS "List length:" ${FOO_LEN}) 

будет производить 1.

set(FOO "aaaaaa;bbbbbbbb") 
list(LENGTH FOO FOO_LEN) 
message(STATUS "List length:" ${FOO_LEN}) 

будет производить 2.

Таким образом, чтобы ответить вам второй вопрос, Вы можете просто проверить длину списка, и если он равен 1 --- это «список», содержащий одно значение, которое можно интерпретировать как базовую строку.

Ответ на первый вопрос --- в вашем примере ${TEST_SRC} ${MY_DEPENDENCY} передается функции как один большой «список». Таким образом, чтобы отделить тех, на два отдельных аргументов, Вы должны

а) котировка оба аргумента и этим --- передать их отдельно

б) не процитировать те и в функции управления списком прошел [ 3]

[1] https://cmake.org/cmake/help/v3.0/manual/cmake-language.7.html#lists

[2] https://cmake.org/cmake/help/v3.0/command/list.html

0

Я нашел решение самостоятельно.

Я прохожу список аргументов в виде строки:

my_function("${TEST_SRC}" ${MY_DEPENDENCY}) 
Смежные вопросы