La fonction vs Macro dans CMake
Le document officiel de CMake 2.8.12 dit à propos de macro
Lorsqu'elle est invoquée, les commandes enregistrées dans la macro sont d'abord
modifié en remplaçant les paramètres formels (${arg1}) avec les arguments
passé et puis invoquée comme normal commandes.
et sur function
Lorsqu'elle est invoquée, les commandes enregistrées dans la fonction sont d'abord
modifié en remplaçant les paramètres formels (${arg1}) avec les arguments
passé et puis invoquée comme normal commandes.
Évidemment, les deux citations sont presque la même, mais me confondre. Ne remplacer les paramètres d'abord, lorsque l'appel d'une fonction comme macro?
- Il y a au moins un autre important, quoique de façon assez évidente différence entre
function
etmacro
: la sémantique dereturn()
: Lorsqu'il est utilisé dans unmacro
, vous n'aurez pas de retour à partir de la macro, mais à partir de la fonction appelante. - Une autre remarque importante, c'est qu'une macro ont deux passes phase d'expansion sur des arguments lorsqu'une fonction est un seul. Essayez de créer ces macro et de la fonction, et l'impression de l'
${ARGV}
de l'intérieur:macro(my_macro)
,function(my_func)
. Et de les utiliser:set(a 123)
,my_macro("\\\${a}\\\\;\\\;;")
,my_func(\${a}\\;\;;)
. Vous trouverez que vous avez à double échapper à toutes les$
,\
,;
pour bien passer toute la chaîne inchangé pour les commandes imbriquées. Ce qui est réel dans lecmake 3.14+
.
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un exemple de code ci-dessous:
et la sortie est:
Il semble donc
arg
est affectée de la valeur devar
lors de l'appel deFoo
et${arg}
est juste de la chaîne remplacé par${var}
lors de l'appel deMoo
.Donc je pense que les deux ci-dessus citations sont très faciles à faire confuse, bien que les documents officiels également dit que:
arg=" "
et pour la macroarg=abc
est vrai.cmake --trace-expand
est éclairantmessage("# arg in main scope = '${arg}'")
+ l'appel de la fonction avant de la macro.En d'autres termes, la fonction de la pousse et de la pop de la nouvelle portée des variables (variables de créer et de modifier n'existent que dans la fonction), la macro ne fonctionne pas. Toutefois, vous pouvez remplacer la fonction par défaut, le comportement avec le
PARENT_SCOPE
paramètre de laset
commande.La documentation de cmake que vous avez cité est si trompeur qu'il est fondamentalement erroné. Il convient de préciser/fixe comme ceci:
cmake --trace-expand
montre exactement ce qui se passe.Le cmake 3.13.3 doc n'a pas changé par rapport à 2.8.12 à cet égard.