Dependency generator hooks and extending default requires/provides
Thierry Vignaud
thierry.vignaud at gmail.com
Thu Jul 2 07:00:48 UTC 2015
On 2 July 2015 at 00:27, Sandro Mani <manisandro at gmail.com> wrote:
> I'm looking at extending the requires and provides strings returned by
> rpmdeps (background: [1]), and it was suggested to me to use dependency
> generator hooks to accomplish this [2].
>
> My initial experiment is
>
> $ cat /usr/lib/rpm/fileattrs/mpi.attrs
> # the path to your provides generating script
> %__mpi_provides %{_rpmconfigdir}/mpi.prov
> # the path to your requires generating script
> %__mpi_requires %{_rpmconfigdir}/mpi.req
> # a regular expression that paths in an RPM
> # must match to trigger the generator
> %__mpi_path ^%{_prefix}/lib(64)/(openmpi|mpich)/.*$
>
> $ cat /usr/lib/rpm/mpi.prov
> #!/bin/sh
> /usr/lib/rpm/rpmdeps --provides
>
> $ cat /usr/lib/rpm/mpi.req
> #!/bin/sh
> /usr/lib/rpm/rpmdeps --requires
>
> This however triggers what appears to be an endless recursion of calls
> mpi.prov -> rpmdeps -> mpi.prov -> rpmdeps -> etc
(...)
> Without any knowledge of the rpm codebase, I figure what is happening is
> that rpmdeps internally honours %__mpi_provides, which causes the endless
> loop.
Yes.
rpmdeps will check if the .attr files' rules match files and if yes,
will run the command in the .prov & .req scripts used in the .attr
files.*
As you call rpmdeps in one of those scripts, you've a loop
> So my question: is there any way to write dependency generator hooks which
> take the output of stock rpmdeps --requires resp. --provides and extend it
> with some additional text?
Just tell in mpo.attr what files are of interest for you and write a
script that compute the additional deps that are missing by rpmdeps
with default attr files
You've to write a script that will actually output the
"libfoo.so()(64bit)(mpich-x86_64)" requires/provides you want.
You must _NOT_ call rpmdeps.
Rpmdeps is just the high level program that collects the deps computed
by the various *.prov/*.req scripts according to *.attr rules.
So according to your links,
mpi.prov should do sg like
"if the path of the library starts with $MPI_LIB, append the
(openmpi) resp (mpich) to the provides string"
mpi.req should do sg like:
"if the path of the scanned object starts with $MPI_LIB and the
required library exists in $MPI_LIB, add (openmpi) resp (mpich) to the
requires string"
You'll still got the generic "libfoo.so()(64bit)" provides but as
you'll provides & requires additional tags.
Alternatively, you could alter elfdeps directly so that it changes the
"libfoo.so()" requires/provides for additional tags but I would not do
that.
More information about the Rpm-list
mailing list