L' espansione macro, a cui ha risposto Yantao Xie, mi apre davvero gli occhi!
Ho anche scoperto che il tutorial di seguito include alcuni esempi concreti, utili per comprendere il concetto di ambito variabile.
Citato da Learn cmake in 15 mins :
In CMake, puoi usare una coppia di comandi function
/ endfunction
per definire una funzione. Eccone uno che raddoppia il valore numerico del suo argomento, quindi stampa il risultato:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Le funzioni vengono eseguite nel proprio ambito. Nessuna delle variabili definite in una funzione inquina l'ambito del chiamante. Se vuoi restituire un valore, puoi passare il nome di una variabile alla tua funzione, quindi chiamare il set
comando con l'argomento speciale PARENT_SCOPE
:
function(doubleIt VARNAME VALUE)
math(EXPR RESULT "${VALUE} * 2")
set(${VARNAME} "${RESULT}" PARENT_SCOPE) # Set the named variable in caller's scope
endfunction()
doubleIt(RESULT "4") # Tell the function to set the variable named RESULT
message("${RESULT}") # Prints: 8
Allo stesso modo, una coppia di comandi macro
/ endmacro
definisce una macro. A differenza delle funzioni, le macro vengono eseguite nello stesso ambito del loro chiamante. Pertanto, tutte le variabili definite all'interno di una macro sono impostate nell'ambito del chiamante. Possiamo sostituire la funzione precedente con la seguente:
macro(doubleIt VARNAME VALUE)
math(EXPR ${VARNAME} "${VALUE} * 2") # Set the named variable in caller's scope
endmacro()
doubleIt(RESULT "4") # Tell the macro to set the variable named RESULT
message("${RESULT}") # Prints: 8
Sia le funzioni che le macro accettano un numero arbitrario di argomenti. Gli argomenti senza nome vengono esposti alla funzione come un elenco, tramite una variabile speciale denominata ARGN
.
Ecco una funzione che raddoppia ogni argomento che riceve, stampandoli su una riga separata:
function(doubleEach)
foreach(ARG ${ARGN}) # Iterate over each argument
math(EXPR N "${ARG} * 2") # Double ARG's numeric value; store result in N
message("${N}") # Print N
endforeach()
endfunction()
doubleEach(5 6 7 8) # Prints 10, 12, 14, 16 on separate lines
function
emacro
: la semantica direturn()
: Quando viene utilizzata in amacro
, non si ritorna dalla macro ma dalla funzione chiamante.