سؤال

Example RPM macro:

%define hello() \
    printf 'hello, %{1}.\\n';

I would like to be able to give it macros with spaces in it, as in:

%{hello "Dak Tyson"}

->

printf 'hello, Dak Tyson.\n'

However, it keeps doing this:

%{hello "Dak Tyson"}

->

printf 'hello, "Dak.\n'

In other words, it doesn't interpret the double quotes, but uses them as-is.

Single quotes don't work either:

%{hello 'Dak Tyson'}

->

printf 'hello, 'Dak\.\n'

Nor backslashes:

%{hello Dak\ Tyson}

->

printf 'hello, Dak\.\n'

Nor braces:

%{hello {Dak Tyson}}

->

printf 'hello, {Dak.\n'

Is there any way to give an RPM macro arguments with spaces?

هل كانت مفيدة؟

المحلول

I trawled through the RPM API C code having to do with macro expansion. I found a loop in there which uses spaces to parse out the arguments and (I think) there is no way around this loop. I don't think you can give arguments with spaces.

I did find that macro arguments are safe, though.

My .rpmmacros file:

%hello() '%{1}'
%name Dak Tyson

With the above macros defined, This command:

rpm --eval '%{hello %{name}}'

yields:

'Dak Tyson'

So that if I really needed spaces in my macros definitions, I can define them as macros first.

I also found, incidentally, that nested parameterized macros don't work.

This command:

rpm --eval '%{hello %{hello name}}'

yields:

error: Unterminated {: {hello
  2<     (empty)
  1<   (empty)
  0< '
'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top