我想从另一个宏调用一个参数的RPM宏。在m4
,这将是平凡的就像这样(只是一个例子,不是我真正想做的事情):RPM:使用参数从另一个宏的参数调用宏
define(`path', `/mnt/$1/lib')
define(`mkd', `mkdir path($1)/stuff')
mkd(`usr')
=> mkdir /mnt/usr/lib/stuff
或者在CPP
语法:
#define path(x) /mnt/x/lib
#define mkd(x) mkdir path(x)/stuff
mkd(usr)
=> mkdir /mnt/usr/lib/stuff
在RPM明显当量(破)将是:!
# THIS IS BROKEN
%define path() /mnt/%1/lib
%define mkd() mkdir %{path %1}/stuff
%mkd usr
但这不工作,RPM打印“错误:宏扩展中的递归级别太多。这可能是由递归宏声明造成的。“
我已‘工作’用下面的代码:
%define path() /mnt/%1/lib
%define mkd() mkdir %{expand:%%{path %1}}/stuff
%mkd usr
但是我不能相信这拙劣的代码会是这样做的推荐的方式出现的另一种方法工作使用选项参数:
%define path(d:) /mnt/%{-d*}/lib
%define mkd(p:) mkdir %{path -d%{-p*}}/stuff
%mkd -p usr
但这只能是因为我以前不同的期权特征;如果我使用“-d
”两个宏,它无法像为例在上面。我也不太喜欢这个解决方案,因为在这里使用选项似乎不直观。
什么是实现预期效果的首选方式?
这因为%global不是在被解析时被评估(如%define),而是在它被调用的时候。基本上任何时候你写%定义你通常要使用%全局。 – msuchy
@msuchy这是另一种方式。使用时定义'%define'宏,定义时'%global'。这就是为什么这是有效的:'mkd'的定义被冻结,'path'已经被扩展,所以当参数被替换时不会发生递归。 – matejcik