Je voudrais appeler une macro RPM en prenant un argument d'une autre macro. En m4
, cela serait fait trivialement comme celui-ci (juste un exemple, pas ce que je veux vraiment faire):RPM: invoquer une macro avec des arguments d'une autre macro avec des arguments
define(`path', `/mnt/$1/lib')
define(`mkd', `mkdir path($1)/stuff')
mkd(`usr')
=> mkdir /mnt/usr/lib/stuff
Ou dans CPP
syntaxe:
#define path(x) /mnt/x/lib
#define mkd(x) mkdir path(x)/stuff
mkd(usr)
=> mkdir /mnt/usr/lib/stuff
L'évidence équivalent en RPM (cassé) serait:
# THIS IS BROKEN
%define path() /mnt/%1/lib
%define mkd() mkdir %{path %1}/stuff
%mkd usr
Mais cette ne le fait pas travail, RPM imprime "erreur: trop de niveaux de récursion dans l'expansion macro. Il est probablement dû à une déclaration de macro récursive. "
Je l'ai fait « travailler » avec le code suivant:.
%define path() /mnt/%1/lib
%define mkd() mkdir %{expand:%%{path %1}}/stuff
%mkd usr
Cependant, je ne peux pas croire que ce code maladroit serait la méthode recommandée pour ce faire une autre approche qui semble fonctionner utilise des arguments d'option:
%define path(d:) /mnt/%{-d*}/lib
%define mkd(p:) mkdir %{path -d%{-p*}}/stuff
%mkd -p usr
Mais cela ne fonctionne que parce que je caractères d'options différentes, si j'utilise « -d
» pour les deux macros, il échoue comme le exampl e ci-dessus. Je n'aime pas non plus beaucoup cette solution, car l'utilisation d'options semble ici non intuitive.
Quelle serait la méthode préférée pour obtenir l'effet désiré?
Il fonctionne parce que% global n'est pas évalué quand il est analysé (comme% define) mais dans le temps où il est appelé. A chaque fois que vous écrivez%, vous devez généralement utiliser% global. – msuchy
@msuchy C'est l'inverse. Les macros '% define' sont évaluées lorsqu'elles sont utilisées,'% global' lorsqu'elles sont définies. C'est pourquoi cela fonctionne: la définition de 'mkd' est figée avec le' path' déjà développé, donc aucune récursion ne se produit quand l'argument est substitué. – matejcik