Gentoo Logo

Przenoszenie programów na modularne X

Spis treści:

1.  Tło

Wstęp

Dlaczego jeden wygodny pakiet zmienił się w 300 mniejszych? Proces ten realizowany jest przez twórców X.Org. Rozdzielają oni wszystkie pakiety na pomniejsze, a my jedynie podążamy za nimi.

Polecamy lekturę Migracja na modularne X.

2.  Sprawdzanie zależności

Chcemy wyliczyć wszystkie zależności tak dobrze, jak to tylko możliwe, by użytkownicy nie musieli mieć w systemie zbędnych programów, których nawet nie używają (na przykład XPrint). Jeśli pakiet jest od czegoś zależny, to w zależnościach wpisujemy pakiety z bibliotekami i nagłówkami, a nie virtuale.

Nie możemy także zagwarantować, że użytkownicy wciąż będą mieli zainstalowane pewne zależności, ponieważ instalowali metapakiet, więc eliminacja tego typu błędu pozwoli zaoszczędzić nam dużo czasu.

Jeśli znajdę jakikolwiek pakiet, dla którego zależnością będzie metapakiet, będę prześladował osobę zajmującą się tym pakietem, dopóki tego nie naprawi.

Pierwszy krok, to zainstalowanie modularnego X lub odnalezienie kogoś, kto ma go zainstalowanego. Może to zostać wykonane w środowisku chroot - nie ma żadnego powodu, by uruchamiać X. Potrzeba jedynie, by pliki były dostępne podczas sprawdzania zależności.

Listing 2.1: Pobieranie potrzebnych skryptów

$ wget http://dev.gentoo.org/~dberkholz/scripts/linking_libs.sh \
	http://dev.gentoo.org/~dberkholz/scripts/included_headers.sh \
	http://dev.gentoo.org/~betelgeuse/scripts/deputils/checkdeps.rb \
       	http://dev.gentoo.org/~betelgeuse/scripts/deputils/pkgutil.rb

Ważne: Nie należy używać gentoolkit-0.2.1_pre9 ponieważ tworzy nieprawidłowe wyjście. Więcej informacji znajduje się tutaj: https://bugs.gentoo.org/show_bug.cgi?id=111501.

Pierwszy skrypt, linking_libs.sh, sprawdza wyjście kompilacji danego pakietu poszukując wszystkich bibliotek połączonych z nim i wyświetla wszystkie pakiety, do których one należą. By uzyskać wyjście kompilatora, można ustawić zmienną PORT_LOGDIR w /etc/make.conf lub użyć przekierowania wyjścia.

Listing 2.2: Uruchomienie linking_libs.sh dla pakietu gdm

$ ls /var/log/portage/*gdm* -l
-rw-r--r-- 1 root portage 556551 2006-01-09 11:41
/var/log/portage/8430-gdm-2.8.0.7.log 
-rw-r--r-- 1 root portage    855 2006-01-09 11:42
/var/log/portage/8431-gdm-2.8.0.7.log 
$ linking_libs.sh
/var/log/portage/8430-gdm-2.8.0.7.log

Drugi skrypt, included_headers.sh, przeszukuje rozpakowane źródła danego pakietu w poszukiwaniu linii, które zaczynają się od #include i sprawdza, jakie pliki zawierają się w <>. Na dzień 9 września 2005, tak jak <> działa również użycie "" w include.

Trzeci skrypt, checkdeps.rb, skanuje w poszukiwaniu zainstalowanych plików należących do pakietu, używając scanelf z pax-utils. Jest to praktyczne dla pakietów binarnych lub pakietów, które nie pokazują wyjścia kompilatora. Jest to skrypt pisany w języku Ruby więc wymaga on dev-lang/ruby, tak jak app-misc/pax-utils. Czwarty skrypt, pkgutil.rb, jest zależnością checkdeps.rb.

Uruchomienie dwóch powyższych skryptów powinno dać dobrą listę pakietów dla RDEPEND (dla bibliotek) i DEPEND (nagłówków i bibliotek). Jeśli biblioteka pokazuje na liście RDEPEND coś, co nie pojawiło się na liście DEPEND, należy być ostrożnym. Może to być "fałszywa zależność" (biblioteka, z którą pakiet jest związany bez żadnego powodu). Przykładem prawdziwej zależności jest libXt. Wiele pakietów szuka nagłówków libXt, w celu sprawdzenia występowania X w systemie.

Sporadycznie skrypt included_headers.sh znajdzie zły nagłówek, ponieważ niektóre z nich używają tej samej nazwy, a to powoduje, że skrypt zwróci nieprawidłowy pakiet. Zwykle takie pomyłki są oczywiste, tak jak w przypadku nagłówków Windowsa, przez które wydaje się, że app-emulation/wine jest zależnością.

Jeśli dopiszemy opcję -d, może to spowodować, że dostaniemy informację "Not found". Może to oznaczać, że odinstalowaliśmy nagłówek, który jest wymagany przez pakiet, by go zbudować lub jest to opcjonalny nagłówek, z którego nie korzystamy w naszym systemie. W przypadku biblioteki znaczyć to może, że odinstalowaliśmy bibliotekę, która została tylko statycznie zbudowana, ale nigdy nie została zainstalowana.

Warto poświęcić trochę czasu i zorientować się, które biblioteki lub nagłówki nie są dodawane do listy zależności. W przypadku nagłówków, nie trzeba mieć ich zainstalowanych, by przeprowadzić skanowanie.

W niektórych przypadkach, w pewnym sensie, pakiet wymaga serwera X. Jeśli nie jest to wymagane, by w czasie instalacji serwer X był obecny w systemie, odradzamy umieszczanie go na liście RDEPEND. Psuje to instalacje bez X, gdzie program jest uruchamiany na innym komputerze, więc nie wymaga istnienia nagłówków ani bibliotek na danej maszynie.

W drzewie portage znajduje się kilka serwerów X, więc jeśli nie potrzeba nam owego, należy dołączyć wszystkie. Modularne serwery X znajdują się w pakiecie xorg-server. Mamy również serwer DirectFB w pakiecie xdirectfb; kdrive jest małym serwerem X. Oczywiście mamy też do dyspozycji stare <xorg-x11-7. Należy również dołączyć restrykcje odnośnie wersji xorg-x11, by być pewnym, że mamy serwer X, zamiast metapakietu. W bliskiej przyszłości spodziewam się, że kdrive przeniesie się do serwera X. Jeśli potrzeba nam serwera X, należy skontaktować się z członkiem drużyny zajmującej się X. Możemy stworzyć virtual, jeśli wystarczająca liczba pakietów będzie tego wymagać

3.  Struktura zależności

By dodać zależności, będziemy potrzebowali następującej struktury:

Listing 3.1: Struktura RDEPEND/DEPEND

RDEPEND="|| ( ( x11-libs/libXfoo
			x11-libs/libXbar
			blah? ( x11-libs/libXblah )
			cokolwiek innego pokaże skrypt od bibliotek
		)
		virtual/x11
	)

DEPEND="${RDEPEND}
	|| ( ( x11-proto/fooproto
			blah? ( x11-proto/blahproto )
			cokolwiek innego pokażą oba skrypty
		)
		virtual/x11
	)

Ważne: Pewna część wyniku powyższych skryptów będzie zbyteczna. Jeśli RDEPEND jednej biblioteki włącza również inną, nie trzeba dołączać obu do zależności. Jeżeli DEPEND jednej biblioteki włącza również protokół, nie trzeba wówczas dodawać pakietu do listy DEPEND. Potencjalnymi bibliotekami, które będą chciały instalować wiele innych mogą być libXaw, libXmu, libXpm, libXcursor i libXt. Wykonujemy wówczas emerge -ep $biblioteka | grep lib[SIX]. Trzeba mieć również na uwadze, że inne pakiety, takie jak na przykład gtk+, również zostały przeniesione na modularne zależności, więc mogą one zainstalować wymagane biblioteki.

Uwaga: Dwie oddzielne flagi USE włączą wsparcie dla X, ale jedna nie jest zależna od drugiej. W tym przypadku, trzeba będzie powielić sekcję zależności wsparcia dla X lub zdefiniować w innym miejscu jako ${X_DEPEND}. Jeśli definiujemy ją w innym miejscu, należy pamiętać by dołączyć również sekcje specyficzne dla każdej z flag USE.

Naszym celem jest nie tylko wparcie dla nowego, modularnego X, ale również umożliwienie spełnienie zależności użytkowników korzystających ze starego, monolitycznego X. By prawidłowo móc je spełnić, odrzucamy starą formę deklarowania virtual/x11.

Na początek przenoszenie aplikacji na nowy system jest jedynie wymagane dla użytkowników korzystających z niestabilnej gałęzi drzewa Portage (~arch) i nowszej (KEYWORDS=-* lub package.mask). Opiekunowie pojedynczych pakietów mogą wybierać, czy pozbyć się niewspieranych ebuildów z drzewa portage, ale najprawdopodobniej będą chcieli przenieść wszystkie swoje ebuildy naraz.

Ważne: To pozwoli użytkownikom korzystającym z gałęzi eksperymentalnej portage na bezproblemową instalację modularnego X, a osobom korzystających ze stabilnej wciąż mieć virtual/x11.

4.  Radzenie sobie z flagami USE

Wiele osób ma wyłączoną flagę xinerama. Jednakże, jeśli uruchomimy included_headers.sh, x11-proto/xineramaproto zostanie pokazane jako zależność. Dodajemy wówczas ten pakiet do DEPEND zasłonięte USE flagą xinerama i dodajemy x11-libs/libXinerama do RDEPEND, także z flagą xinerama.

Caleb zadał dobre pytanie: jak radzić sobie z flagami USE w pakietach, które mają ogromną ilość opcjonalnych bibliotek X? W wielu przypadkach ma sens wymuszanie włączenia lub też niewłączania flag. Można to sobie ułatwić, grupując flagi. Należy upewnić się, że nazwa flagi bierze się od funkcji jaką wprowadzają, a nie od nazw bibliotek czy też pakietów, z których będą korzystać.

5.  Wprowadzanie zmian do drzewa portage

Jeśli jesteśmy opiekunami lub twórcami pakietu, nadsyłamy nasze poprawki. Jeżeli nie, nadsyłamy poprawkę w formie błędu przydzielonego do opiekunów pakietu (można ich znaleźć w pliku metadata.xml). Dodajemy informację, że jest to błąd blokujący #112675. Załączamy łatę naprawiającą zależności.



Drukuj

Zaktualizowano 3 stycznia 2006

Podsumowanie: Ten przewodnik pokazuje jak naprawiać pakiety, by działały z nowym modularnym X.Org.

Donnie Berkholz
Autor

Damian Szeluga
Tłumacz

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Linux World Expo

Linux World Expo

Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.