CMAKE: создание и построение списка внутри функции - с каталогом или глобальной областью действия - PullRequest
8 голосов
/ 13 июля 2011

Я не совсем знаком с правилами области видимости cmake.Мне нужно создать список различных файлов при выполнении генерации кода RPC для IDL.

function(generate_rpc file_name)
  set(PROTO_FILES ${PROTO_FILES} ${file_name})
endfunction(generate_rpc)

generate_rpc(BasicProtocol.proto)
generate_rpc(dummy.proto)

message(STATUS "PROTO FILES: ${PROTO_FILES}")

Список каждый раз пуст.Мне нужен список, который можно добавить из функции.

Ответы [ 2 ]

11 голосов
/ 15 ноября 2013

Хотя макросы определяются и вызываются так же, как и функции, между ними есть некоторые различия, например, в SCOPE и при его выполнении.

ОБЪЕМ:

  • Макрос: имеет глобальную область действия.
  • Функция: имеет локальную область видимости, если вы не укажете.

ИСПОЛНЕНИЕ: работает как C ++ или C

  • Макрос: имена переменных перед настройкой заменяются на строки.

  • Функция: имена переменных заменяются во время выполнения.

В заключение добавьте флаг PARENT_SCOPE в команду set

набор (PROTO_FILES $ {PROTO_FILES} $ {имя_файла} PARENT_SCOPE)

8 голосов
/ 13 июля 2011

Использование макроса вместо функции, кажется, делает это:

macro(generate_rpc file_name)
  set(PROTO_FILES ${PROTO_FILES} ${file_name})
endmacro(generate_rpc)

EDIT: Согласно http://www.cmake.org/cmake/help/syntax.html (должно быть в справочной странице, IMO):

Функции CMake создают локальную область видимости для переменных, а макросы используют глобальную область видимости.

...