2015-07-12 57 views
1

我会用一个例子来展示我的意思,因为它很难解释。寻找一个宏来扩展名称+值的变量

我有一个spec文件,用于本地和交叉编译。我使用--define选项将许多变量传递给rpmbuild。我想一个宏,将是这相当于:

%{?myvar:myvar=%{myvar}}

所以,当且仅当myvar存在,我希望它扩大到myvar=%{myvar}然后将myvar=myval

我试着玩%{expand:}有点(src),但是当我有多个参数时会遇到麻烦。因为它看起来像一个宏的参数去EOL,我需要它们在最终输出的一行中,这也成为一个需求。

我不知道lua,这可能有助于迭代的各种参数,例如:

%expvar myvar1 myvar2 myvar3 =>myvar1=myval1 myvar2=myval2 myvar3=myval3

感谢您的想法!

回答

1

我不确定我对EOL有什么了解,但是这个工作使用lua。

%expvar() %{lua: \ 
    for i = 1, rpm.expand("%#") do \ 
     local var = rpm.expand([[%]]..i) \ 
     local evar = rpm.expand([[%]]..var) \ 
     if [[%]]..var ~= evar then \ 
      print(var.."="..evar.." ") \ 
     end \ 
    end \ 
} 

使用方法是:

rpm -E 'blah %{expvar __cp __rm}foo' 

其实,给我的更新你想要什么,我认为这是一个更好的答案(虽然这只是一次对一个宏操作)理解:

%expvar() %{expand:%%{?%1:%1=%%{%1}}} 

使用方法是:

rpm -E 'foo %{expvar __cp} %{expvar xx} %{expvar __rm} blah' 

从理论上讲,我认为应该可以把它写成一个递归宏,以便它可以处理多个参数,但我从来没有真正能够做出这样的事情。

+0

EOL是没有办法*结束*参数宏(我知道的),除了行尾。所以你可以这样做: './configure%expvar(myvar1 myvar2 myvar3)SOMETHING = SomethingElse' –

+0

谢谢...明天将在工作中尝试。 –

+0

啊,你需要'%{macro}'格式。添加了示例用法并更新了空格而不是换行符。我只用'rpm -E'测试了它,所以它可能无法正常工作,但我相信它应该(或者至少非常接近)。 –