Calling a parameterized macro from another one

Bob Bell b_rpmlist at thebellsplace.com
Tue Oct 8 16:48:34 UTC 2013


Is no one able to help with this issue? :(

On Mon, Sep 09, 2013 at 03:25:05PM -0400, Bob Bell wrote:
>I've been bumping up RPM macro/spec sophistication recently, and one 
>thing I'm trying to do is to call one parameterized RPM macro from 
>another parameterized RPM macro.  I'm seeing some behavior that's ...  
>less than helpful.
>
>As a real quick summary, here's what I'm seeing:
>  1. When I call the second macro, %# and %* are set, as are the      
>positional parameters (%1, etc.) for anything that's been set, but 
>positional parameters that haven't been passed in remain set from the 
>previous macro invocation (i.e., the "parent" invocation)
>  2. When I pass parameters via named flags to the second macro, any      
>existing flags remain set.  This is true even if the second macro 
>takes the same parameters, but I don't pass them, which is 
>particularly troubling.
>
>This makes it really hard (almost impossible?) to determine what 
>parameters were actually pass to the second macro.  For example,
>  1. If the second macro can take, say, either one or two parameters,      
>I cannot reliably use %{?2} to check if a second parameters has been 
>passed.  I need to check to see if %# == 2 first, because %2 might be 
>set from another macro that's been invoked.
>  2. If the first and second macro both take a flag (say, "-f"), but 
>the      same flag isn't passed as a parameter to the second macro, 
>it's pretty much impossible to tell, because %{-f} (and its variants) 
>will still be set from when the first macro was invoked.
>
>Can someone clarify what the behavior SHOULD be?  Is this a bug?  
>Should I be doing things differently?
>
>Here's my test ~/.rpmmacros file that I'm using to explore RPM's 
>functionality:
>%bar(x:y:z:) \
>%{lua:io.stderr:write(rpm.expand("%#") .. " arg(s) to " ..  rpm.expand("%0") .. " = " .. rpm.expand("%*") .. "\\n")} \
>%{lua:io.stderr:write("1 == " .. rpm.expand("%1") .. "\\n")} \
>%{lua:io.stderr:write("2 == " .. rpm.expand("%2") .. "\\n")} \
>%{lua:io.stderr:write("-x == " .. rpm.expand("%{-x}") .. "\\n")} \
>%{lua:io.stderr:write("-x* == " .. rpm.expand("%{-x*}") .. "\\n")} \
>%{lua:io.stderr:write("-y == " .. rpm.expand("%{-y}") .. "\\n")} \
>%{lua:io.stderr:write("-y* == " .. rpm.expand("%{-y*}") .. "\\n")} \
>%{lua:io.stderr:write("-z == " .. rpm.expand("%{-z}") .. "\\n")} \
>%{lua:io.stderr:write("-z* == " .. rpm.expand("%{-z*}") .. "\\n")}
>%foo(x:y:) \
>%{lua:io.stderr:write(rpm.expand("%#") .. " arg(s) to " ..  rpm.expand("%0") .. " = " .. rpm.expand("%*") .. "\\n")} \
>%{lua:io.stderr:write("1 == " .. rpm.expand("%1") .. "\\n")} \
>%{lua:io.stderr:write("2 == " .. rpm.expand("%2") .. "\\n")} \
>%{lua:io.stderr:write("-x == " .. rpm.expand("%{-x}") .. "\\n")} \
>%{lua:io.stderr:write("-x* == " .. rpm.expand("%{-x*}") .. "\\n")} \
>%{lua:io.stderr:write("-y == " .. rpm.expand("%{-y}") .. "\\n")} \
>%{lua:io.stderr:write("-y* == " .. rpm.expand("%{-y*}") .. "\\n")} \
>%{expand:%%{bar %{-x} %{-y:-z} %{-y*} bararg}}
>
>And here's the results I've seen that lead to my conclusions:
># rpm --eval '%{foo -x A -y B fooarg1 fooarg2}' >/dev/null
>2 arg(s) to foo = fooarg1 fooarg2
>1 == fooarg1
>2 == fooarg2
>-x == -x A
>-x* == A
>-y == -y B
>-y* == B
>1 arg(s) to bar = bararg
>1 == bararg
>2 == fooarg2
>-x == -x A
>-x* == A
>-y == -y B
>-y* == B
>-z == -z B
>-z* == B
>
>My primary test bed has been SUSE Linux Enterprise Server 11 SP2, 
>running rpm 4.4.2.3 (with SUSE patches, no doubt).  I'm confirmed the 
>same behavior on an Ubuntu machine with rpm 4.9.1.1.
>
>Thanks in advance for your assistance,
>Bob
>
>P.S. I'm not currently subscribed to this mailing list, so please 
>include me on any replies.


More information about the Rpm-list mailing list