Dependency generator hooks and extending default requires/provides

Thierry Vignaud thierry.vignaud at
Thu Jul 2 07:00:48 UTC 2015

On 2 July 2015 at 00:27, Sandro Mani <manisandro at> 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.

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
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
"" 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 "" provides but as
you'll provides & requires additional tags.

Alternatively, you could alter elfdeps directly so that it changes the
"" requires/provides for additional tags but I would not do

More information about the Rpm-list mailing list