2011-07-13 6 views
8

Nie jestem do końca zaznajomiony z zasadami zasięgu cmake. Muszę utworzyć listę różnych plików podczas generowania kodu RPC dla IDL.CMAKE: Tworzenie i tworzenie listy w ramach funkcji - z katalogiem lub globalnym zakresem

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}") 

Lista jest pusta za każdym razem. Potrzebuję dołączonej listy, którą można zbudować z poziomu funkcji.

Odpowiedz

8

Korzystanie makra zamiast funkcji wydaje się, aby to zrobić:

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

EDIT: Według http://www.cmake.org/cmake/help/syntax.html (powinny być w manualu, IMO):

funkcje CWprowadä utworzyć obszar lokalny dla zmiennych i makr użyj zakresu globalnego.

+0

Tak że wystarczyły, dzięki. Czy masz jakieś łącze do części dokumentacji, która obejmuje reguły i semantykę zmiennych/właściwości/funkcji i makr? Generalnie używam dokumentacji strony podręcznika online - ale na ogół pomija takie szczegóły. –

11

Chociaż makra są definiowane i wywoływane w taki sam sposób, jak funkcje, między nimi występują pewne różnice, na przykład w ZAKRESIE i kiedy jest wykonywane.

ZAKRES:

  • makro: ma zasięg globalny.
  • Funkcja: ma zasięg lokalny bez względu na to, czy go nie określono.

wykonanie: działa jak C++ lub C

  • makro: nazwy zmiennych są zastępowane do ciągów przed konfiguracją.

  • Funkcja: nazwy zmiennych są zastępowane podczas wykonywania.

Podsumowując, należy dodać flagę PARENT_SCOPE w komendzie set

zestaw (PROTO_FILES $ {PROTO_FILES} $ {nazwa_pliku} PARENT_SCOPE)