寻找宏将变量扩展为名称+值
Looking for a macro to expand a variable to the name + value
我会用一个例子来说明我的意思,因为它很难解释。
我有一个 spec
文件,用于本机和交叉编译。我使用 --define
选项将许多变量传递给 rpmbuild
。我想要一个相当于这个的宏:
%{?myvar:myvar=%{myvar}}
所以,iff myvar
存在,我希望它扩展到 myvar=%{myvar}
那么就是 myvar=myval
.
我尝试使用 %{expand:}
一点点 (src),但是当我有多个参数时 运行 遇到了麻烦。由于宏的参数似乎进入了 EOL,而我需要在最终输出中将它们全部放在一行中,这也成为一项要求。
我不知道 lua
,这可能有助于迭代各种参数,例如:
%expvar myvar1 myvar2 myvar3
=> myvar1=myval1 myvar2=myval2 myvar3=myval3
感谢任何想法!
我不确定我是否理解有关 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'
从理论上讲,我认为应该可以将其编写为递归宏,以便它可以处理多个参数,但实际上我从来没有能够使这种事情起作用。
我会用一个例子来说明我的意思,因为它很难解释。
我有一个 spec
文件,用于本机和交叉编译。我使用 --define
选项将许多变量传递给 rpmbuild
。我想要一个相当于这个的宏:
%{?myvar:myvar=%{myvar}}
所以,iff myvar
存在,我希望它扩展到 myvar=%{myvar}
那么就是 myvar=myval
.
我尝试使用 %{expand:}
一点点 (src),但是当我有多个参数时 运行 遇到了麻烦。由于宏的参数似乎进入了 EOL,而我需要在最终输出中将它们全部放在一行中,这也成为一项要求。
我不知道 lua
,这可能有助于迭代各种参数,例如:
%expvar myvar1 myvar2 myvar3
=> myvar1=myval1 myvar2=myval2 myvar3=myval3
感谢任何想法!
我不确定我是否理解有关 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'
从理论上讲,我认为应该可以将其编写为递归宏,以便它可以处理多个参数,但实际上我从来没有能够使这种事情起作用。