2015-07-12 82 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'測試了它,所以它可能無法正常工作,但我相信它應該(或者至少非常接近)。 –

相關問題