[rpm] Rozwiązywanie wirtualnych właściwości na nazwy pakietów

Jakub Bogusz qboosh w pld-linux.org
Sob, 23 Sie 2003, 22:47:57 CEST


On Fri, Aug 22, 2003 at 11:07:23AM +0200, Paweł Gołaszewski wrote:
> On Wed, 20 Aug 2003, Radoslaw Zielinski wrote:
> > W trakcie budowania, zależności od znajdowanych przez autoskrypty
> > wirtualnych właściwości typu foo(bar) są rozwiązywane na nazwy
> > zainstalowanych pakietów, w których występują.
> > 
> > Problem w tym, że do pakietu wynikowego wpada zależność od wszystkich
> > pakietów, które daną właściwość udostępniają -- coraz częściej jest >1.
> > 
> > Przykłady: perl(base) -> perl-base i perl-Class-Fields,
> > perl(Filter::Util::Call) -> perl-modules i perl-Filter.
> > 
> > Proponowane rozwiązania:
> > 
> > 1. Wywalić to precz.  Wada: uzależnienie od narzędzia poldkopodobnego
> >    lub dobrej{ pamięci, intuicji, znajomości dystrybucji}.
> > 
> > 2. Nie rozwiązywać, jeśli rozwiązuje się na >1 pakiet.  Wada:  
> >    niedeterministyczność; nie wiemy, czy nie istnieją inne pakiety,
> >    udostępniające tę właściwość, wiemy tylko, że nie są zainstalowane w
> >    trakcie budowania.

Może da się znaleźć jakieś lepsze kryterium?
Problem dotyczy części modułów Perla - jeśli lista jest znana i niezbyt
długa, można dopisać je do pliku noautoreqdep.
(biblioteki to inna sprawa, zamienników z tym samym ABI jest b.mało
- OpenGL, Java... i chyba wszystko?)

Teraz to jest taka ładna konstrukcja ;), ale chyba nie da się tego
kryterium (>1 pakietu dostarczającego daną własność) bez przepisania na
wolniejszą pętlę po własnościach:

| # package names only for SONAMES, perl(module) and pear(module)
| grep -e '.\+\.so\|perl(.\+)\|pear(.\+)' ${REQS} | \
|         grep -v -e "^\(${noreqdep}\)\$" | tr '\n' '\0' | \
|         LC_ALL=C xargs -r -0 -- rpm -q --whatprovides --qf '%{NAME}\n' 2>/dev/null | \
|         grep -v "no package provides" | LC_ALL=C sort -u

Tak naprawdę to by się przydała "kompresja" zależności, i to na dwóch
etapach (generowania zależności i instalacji). Nawet poldek sobie nie
radzi w niektórych przypadkach (IIRC: jeśli w ramach transakcji dołączy
jakiś pakiet wymagany przez coś "losując" jedną z dostępnych wersji,
a potem napotka jakąś ściślejszą zależność wymagającą innej wersji
pakietu, niż początkowo "wylosowana").

Tzn.:
- z Requires: "foo", "foo >= 1.2", "foo >= 2.0" zostawiać tylko to
  ostatnie [teraz to musiałoby być w samej binarce rpm-a, bo tylko tam
  jest znany komplet zależności... albo przynajmniej w poldku, żeby się
  instalacje nie wywalały]

- jeśli jakaś własność jest dostarczana przez pakiety A i B, a B wymaga
  A, to dawać zależność tylko od A [to się nawet da zrobić
  w find-requires-wrapperze, ale sporym kosztem...]

> > Ja optuję za 1.  IMO i tak się kiedyś na tym skończy.
> 
> Ja raczej za 2 opcją.
> Co by nie powiedzieć to rozwiązywanie zależności jest wygodne na małych 
> systemach, gdzie rzeczy typu poldek są zbyt wielkie. Mam taką maszynę, 
> gdzie ładowanie poldka kończy się OOM. Byłbym bardzo niepocieszony, gdybym 
> musiał się przedzierać przez wpisy w postaci surowej...

Nie tylko to - dyskusja była wiele razy.
Ściąganie ponad 4MB bazy tylko po to, żeby uzyskać czytelne zależności
to przesada.
Po 100Mbitowej sieci z lokalnego mirrora ciągnie się szybko, ale po
przytkanym nawet 0.5Mbitowym łączu już nie, a co dopiero przez modem.
Czas uruchamiania poldka (wczytującego na dzień dobry lokalną bazę
rpm-a) nie jest zaniedbywalny w porównaniu z rpm -qpR.
Brak potrzeby korzystania z zewnętrznego serwisu typu rpmfind.net, żeby
nie mając lokalnej bazy ani mirrora pakietów dowiedzieć się, czego tak
naprawdę wymaga ściągnięty pakiet, od dawna jest zaletą PLD.
W Debianie mają czytelne zależności w pakietach (nie tylko w apcie)
- mamy być gorsi? :P


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl