Piping find output to an rpm macro
Panu Matilainen
pmatilai at redhat.com
Fri Sep 22 07:36:38 UTC 2017
On 09/20/2017 05:28 PM, nicolas.mailhot at laposte.net wrote:
> Hi,
>
> I have a set of spec files that perfom the same operations on file lists.
> They are bitrotting fast with each spec differing slightly from the other
>
> I'd like to consolidate the operations in a common macro to have a single place to tweak/fix.
>
> So basically I want something like
>
> %mymacro -f outputfile $(find . -iname '*\.foo')
>
> with mymacro defined as
>
> %mymacro(f:) \
> %define output_file_list %{?-f*}%{!?-f*:foo.file-list} \
> for file in %* ; do stuff
>
> of course that does not work with rpm failing to parse find output as an argument list
>
> Is there a clean way to make it work? I try very hard to forget everything about rpm macros every time I need to write one
>
In rpm >= 4.14.0 parametric macro arguments are expanded so you can sort
of do this:
%define mymacro() %(for f in %{*}; do echo "XX ${f} XX"; done)
%mymacro %(find /usr/lib/rpm/platform/ -name "*-*"|tr "\n" " " )
...gives something like:
XX /usr/lib/rpm/platform/ppc8260-linux XX
XX /usr/lib/rpm/platform/mipsr6-linux XX
XX /usr/lib/rpm/platform/armv5tel-linux XX
[...]
The "tr" at end is needed because rpm doesn't consider newline as an
argument separator for macros. Might be handy if it did, but then you
never know what would break...
But of course the problem with all this is that the macros are expanded
at spec parse time when you'd typically want to do stuff at time of
build instead.
What are you actually trying to do? From the looks of the example you
might be better off with shell functions instead, but hard to say
without more context.
- Panu -
More information about the Rpm-list
mailing list