2012-04-05 12 views
7

Estoy escribiendo un CMakeLists.txt para generar archivos y compilar los archivos generados. Creé una función para agregar algunas cadenas de ruta de archivo a una variable de lista global.¿Cómo establecer la variable global en una función para cmake?

Mi CMakeLists.txt:

set(source_list "nothing") 
function(test file_path) 
    list(APPEND source_list ${file_path}) 
endfunction(test) 
test(abc.txt) 
test(def.txt) 
message("At last, the source_list is:\"${source_list}\"") 

La salida cmake:

At last, the source_list is:"nothing" 

Alguien sugirió que usar macros en lugar de la función, pero sí es necesario utilizar variables locales, por lo que es necesario utilizar la función en lugar de macro.

¿Cómo puedo establecer correctamente la variable global lista_fuente en la función prueba()? No se puede hacer de una manera simple y normal?

Respuesta

11

Necesita usar set en lugar de list para afectar la variable en el ámbito primario.

tanto en lugar de su comando con list:

set(source_list ${source_list} ${file_path} PARENT_SCOPE) 
+0

Aunque no es global, los hermanos no lo verán. – 0xbaadf00d

12

PARENT_SCOPE es sólo para los padres, que no funcionará si tiene otro script no es el padre que quiere verlo así.

Necesita caché para la verdadera variable "global". En su caso, use:

SET(source_list "${source_list}" CACHE INTERNAL "source_list") 
+1

No funciona para la segunda ejecución de cmake, porque el valor ya está en caché. Debes limpiar antes de construir. –

+1

'INTERNAL' implícita' FORCE', que significa: Utilice la opción '' FORCE'' en para sobrescribir las entradas existentes. –

1

Otro enfoque es usar propiedades globales. Una vez que se establece que:

set_property(GLOBAL PROPERTY source_list_property "${source_list}") 

se puede leer de todas partes:

get_property(source_list GLOBAL PROPERTY source_list_property) 

que he usado en los ejemplos anteriores nombres diferentes para la propiedad (source_list_property) y para la variable (source_list). Tal vez es mejor usar el mismo nombre. Pero el punto es usar una propiedad como variables globales, y no para nombrar.

Tales propiedades globales no están en el caché.

0

Sobre la base de la respuesta de Maxim Suslov, el siguiente código trabajaban para un problema similar me enfrentaba:

set_property(GLOBAL PROPERTY source_list) 
function(add_source) 
    get_property(tmp GLOBAL PROPERTY source_list) 
    foreach(arg ${ARGV}) 
     set(tmp "${tmp} ${arg}") 
    endforeach() 
    set_property(GLOBAL PROPERTY source_list "${tmp}") 
endfunction(add_source) 

add_source(a_file) 
add_source(b_file c_file) 

get_property(local_prop GLOBAL PROPERTY source_list) 
message("list: ${local_prop}") 

add_source función puede ser llamada desde el interior de cualquier subdirectorio.

Cuestiones relacionadas