Depois de considerar isso por um tempo, acho que a abordagem mais correta é usar "namespaces" de recursos virtuais de RPM. Por exemplo:
Provides: resource # 'resource' is available to the whole system
Provides: namespace(resource) # 'resource' is specifically available only to "namespace"
Os RPMs ficam assim:
grunk-libs.rpm
Provides: libgrunk.so.1()(%{_arch}) # System library. unchanged
foo.rpm
Requires: /bin/sh
Requires: libc.so.6()(%{_arch})
Requires: foo(libgrunk.so.1()(%{_arch})) # Note special foo(...) namespace
foo-grunklibs.rpm
Provides: foo(libgrunk.so.1()(%{_arch})) # Note special foo(...) namespace
Dessa forma, a dependência foo
na compilação especial de libgrunk
não pode ser satisfeita pelo grunk-libs
RPM comum, mas deve ser satisfeita pela compilação específica dessa biblioteca.
Minha prova de conceito é assim:
Name: foo
...
Source99: find-namespaced-requires # Here's the magic
%define _use_internal_dependency_generator 0
%define __find_requires %{SOURCE99} foo /bin/sh glibc
Onde o script find-namespaced-requires envolve o RPM padrão % {_ rpmconfigdir} / find-requires e filtra sua saída. Seu primeiro argumento é o namespace ( "foo(...)"
) a ser usado, e os argumentos subseqüentes são dependências ou RPMs que fornecem dependências que devem não ser namespaced. Neste exemplo, eu quero que foo
exija o / bin / sh do sistema principal e também o libc, libdl, libm, etc. comuns de glibc
, mas todas as outras dependências devem ser consideradas específicas de foo
.
Isso poderia ser um pouco mais limpo e mais genérico, finalizando a maioria dos itens acima em um RPM de tempo de compilação e dizendo algo como:
Name: foo
BuildRequires: special-deps-macros
%define _namespace foo # defaults to %{name} ?
%define _generic_dependencies ... # defaults to /bin/sh glibc libselinux ?