2012-04-05 15 views
7

Sto scrivendo un CMakeLists.txt per generare file e compilare i file generati. Creo una funzione per aggiungere alcune stringhe del percorso file a una variabile di elenco globale.Come impostare la variabile globale in una funzione per cmake?

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

L'uscita cmake:

At last, the source_list is:"nothing" 

Qualcuno ha suggerito che per usare macro invece di funzione, ma ho bisogno di usare variabile locale, quindi ho bisogno di usare la funzione al posto della macro.

Come posso impostare correttamente la variabile globale source_list nella funzione test()? Non riesci a farlo in modo semplice e normale?

risposta

11

È necessario utilizzare set anziché list per influire sulla variabile nell'ambito genitore.

consentendo di sostituire il vostro comando list con:

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

Non è globale però, i fratelli non vedranno. – 0xbaadf00d

12

PARENT_SCOPE è soltanto per il genitore, non funzionerà se si dispone di altro script non-genitore che vuole vedere pure.

È necessaria la cache per la vera variabile "globale". Nel tuo caso, utilizza:

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

Non funziona per la seconda esecuzione di cmake, perché il valore è già nella cache. Devi pulire prima di costruire. –

+1

'INTERNAL' implicito' FORCE', che significa: Utilizzare l'opzione '' FORCE'' su sovrascrivere le voci esistenti. –

1

Un altro approccio consiste nell'utilizzare le proprietà globali. Una volta che lo si imposta:

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

si può leggere da ogni dove:

get_property(source_list GLOBAL PROPERTY source_list_property) 

ho usato negli esempi di cui sopra i nomi diversi per la proprietà (source_list_property) e per la variabile (source_list). Forse è meglio usare lo stesso nome. Ma il punto è usare una proprietà come variabili globali e non nominare.

Tali proprietà globali non sono nella cache.

0

Basandosi sulle risposta di Maxim Suslov, il seguente codice ha lavorato per un problema simile ho affrontato:

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 funzione può essere chiamata dall'interno qualsiasi sub-directory.

Problemi correlati