L' expansion macro, répondue par Yantao Xie, m'ouvre vraiment les yeux!
J'ai également trouvé que le didacticiel ci-dessous contient des exemples concrets, ce qui est utile pour comprendre le concept de portée variable.
Cité de Learn cmake in 15 minutes :
Dans CMake, vous pouvez utiliser une paire de commandes function
/ endfunction
pour définir une fonction. En voici un qui double la valeur numérique de son argument, puis imprime le résultat:
function(doubleIt VALUE)
math(EXPR RESULT "${VALUE} * 2")
message("${RESULT}")
endfunction()
doubleIt("4") # Prints: 8
Les fonctions s'exécutent dans leur propre étendue. Aucune des variables définies dans une fonction ne pollue la portée de l'appelant. Si vous souhaitez renvoyer une valeur, vous pouvez passer le nom d'une variable à votre fonction, puis appeler la set
commande avec l'argument spécial 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
De même, une paire de commandes macro
/ endmacro
définit une macro. Contrairement aux fonctions, les macros s'exécutent dans la même portée que leur appelant. Par conséquent, toutes les variables définies dans une macro sont définies dans la portée de l'appelant. Nous pouvons remplacer la fonction précédente par la suivante:
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
Les fonctions et les macros acceptent un nombre arbitraire d'arguments. Les arguments sans nom sont exposés à la fonction sous forme de liste, via une variable spéciale nommée ARGN
.
Voici une fonction qui double chaque argument qu'elle reçoit, en imprimant chacun sur une ligne distincte:
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
etmacro
: la sémantique dereturn()
: Lorsqu'il est utilisé dans amacro
, vous ne reviendrez pas de la macro mais de la fonction appelante.