linux - RPM:从另一个带参数的宏调用带参数的宏

标签 linux macros rpm packaging

我想调用一个 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/

相关文章:

asp.net apache2/nginx OutputCache问题

c++ - 检查 #ifdef 中的宏或真实条件

rpmbuild %clean 阶段不删除文件

linux - 两个 open/proc 条目的处理方式不同

linux - 通过inode删除多个目录中的文件

sql - 为许多参数执行 SAS 宏

Mac 上使用 Komodo 的 Python 宏

linux - RPM 中更改的文件列表

linux - 安装新内核时如何自动编译linux内核模块?

html - Nawk 脚本在 HTML 表上的错误输出