2011-07-13 16 views
8

No estoy completamente familiarizado con las reglas de scoping de cmake. Necesito crear una lista de varios archivos mientras realizo la generación de código RPC para un IDL.CMAKE: Creación y creación de una lista dentro de una función: con directorio o ámbito global

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

La lista está vacía cada vez. Necesito una lista anexable que se pueda generar desde dentro de una función.

Respuesta

8

Usando una macro en lugar de una función parece hacerlo:

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

EDIT: Según http://www.cmake.org/cmake/help/syntax.html (debe estar en la página del manual, OMI):

funciones CRealice crean un ámbito local para las variables, y las macros usan el alcance global.

+0

sí que hizo el truco, gracias. ¿Tiene algún enlace a una parte de la documentación que cubra las reglas y la semántica de variables/propiedades/funciones y macros? Generalmente uso la documentación de la página man en línea, pero generalmente omite dichos detalles. –

11

Aunque las macros se definen y llaman de la misma manera que las funciones, existen algunas diferencias entre ellas, por ejemplo, en SCOPE y cuando se ejecuta.

ALCANCE:

  • Macro: tiene un alcance global.
  • Función: tiene un alcance local si no especifica.

EJECUCIÓN: funciona como C++ o C

  • macro: los nombres de las variables se sustituyen a las cuerdas antes de configurar.

  • Función: los nombres de las variables se reemplazan durante la ejecución.

En conclusión, agregue el indicador PARENT_SCOPE al mando conjunto

conjunto (PROTO_FILES $ {} $ {PROTO_FILES nombre_archivo} PARENT_SCOPE)

Cuestiones relacionadas