RPM roadmapping

Panu Matilainen pmatilai at redhat.com
Thu Aug 2 08:55:02 UTC 2007

On Fri, 27 Jul 2007, dragoran wrote:

> Panu Matilainen wrote:
>> Not everybody is on rpm-maint list and we'd like to hear the wishes of 
>> (Fedora) developers/packagers too. So: what have you always wanted to do 
>> with rpm, but wasn't able to? Or the other way around: what you always 
>> wished rpm would do for you? What always annoyed you out of your mind? 
> arch requires and provides ... to end the endless multilib discussions ;)
> should be automatic until the packager say Requires: foo.arch

I wish it was that simple...

Sure, being able to say "Requires: foo.arch = version-release" would help 
in many cases, but it does not *solve* the multilib problems.

A big offender here is the x86 architecture with i386, i486 ... etc 
subarchitectures. While most packages are i386 there, the assumed
Requires: <name>.%{_target_cpu} = <version>-<release>
BuildRequires: <name>.%{_target_cpu} >= ...

gets into trouble when the subarch's don't match between packages (eg i386 
vs i686 - just look at glibc vs glibc-common). Instead, you'd want to 
match within 32bit vs 64bit (or independent, basically noarch) bitness of 
the package (rpm uses the term "color" for this) and have the depsolver 
sort out package with the best arch within that "color".

I'm starting to get tempted to have rpmbuild automatically slap in the 
equivalent of
Provides: %{name}.%{color} = %{epoch}:%{version}-%{release}
..where %{color} gets expanded to 32bit, 64bit or none, based on the 
highest color present in the package being built. I don't particularly 
like the term "color" there, and also "none" for "noarch" is not good, 
but I don't want it to be "noarch" to avoid mixing with %{arch} when it's 
a different concept. Better suggestions welcome...

RPM itself could parse requires on %{name}.%{color} without having the 
explicit provides added, but the color information is not present in the 
repository metadata (at least currently) so depsolvers would need to be 
taught about it separately, and second-guess the color based on the 
package %arch.. probably just easier to slap in the explicit provide, 
which can be then required by packages needing it.

BTW, there are cases where the dependency on the exact %{_target_cpu} 
would be proper (look at libbeagle vs libbeagle-devel), but those are so 
rare that I think they are sufficiently covered by manually adding 
provides-requires pair on %{name}.%{_target_cpu}

It would be nice to automate all this, but it gets damn hairy. If you have 
a manual "Requires: foo" or "BuildRequires: foo", how's rpm supposed to 
know whether foo is a package that
a) contains a utility the build needs, never mind the arch
b) contains a dlopen()'ed library, arch very much matters, to the point of
    subarch's even
c) is a -devel package's dependency on another -devel package, color
    matters (must match or be a noarch)

>From there we get to the chicken-and-egg problem of srpms and spec files. 
The arch and color can only be determined on spec evaluation, but 
src.rpm's are used to deliver the specs, duh... (this problem already 
exists of course, "rpmbuild -bs foo.spec" can deliver different results 
depending on which are it was run on due to spec conditionals)

And so on. Multilib is so lovely...

 	- Panu -

More information about the fedora-devel-list mailing list