我想调用一个 RPM 宏,从另一个宏中获取一个参数。在 m4
中,这将像这样简单地完成(只是一个例子,不是我真正想做的):
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
”,它会像上面的示例一样失败。我也不太喜欢这个解决方案,因为在这里使用选项似乎不直观。
达到预期效果的首选方法是什么?
最佳答案
我找到了一个更优雅的解决方案。我不明白为什么会这样,我不确定它是否普遍适用:
%define path() /mnt/%1/lib
%global mkd() mkdir %{path %%1}/stuff
%mkd usr
=> mkdir /mnt/usr/lib/stuff
它仅在 mkd
定义为 %global
时有效。 path
可以用 %define
或 %global
定义。还要节点引用的百分比字符。
关于linux - RPM:从另一个带参数的宏调用带参数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806891/