Gentoo Logo

[ << ] [ < ] [ Powrót ] [ > ] [ >> ]


1. Ebuild HOWTO

Spis treści:

1.a. Drzewo Portage

Wprowadzenie

Drzewo Portage zwykle znajduje się w katalogu /usr/portage i jest ułożone w hierarchicznej strukturze, składającej się z katalogów kategorii, w których znajdują się katalogi pakietów. Oto przykład: plik util-linux-2.11y.ebuild można znaleźć w katalogu /usr/portage/sys-apps/util-linux. W tym samym katalogu może znajdować się kilka innych wersji util-linux razem z wersją util-linux-2.11y.ebuild. Jest tak, ponieważ wszystkie pliki ebuild danego pakietu (niezależnie od wersji) mają wspólny katalog kategoria/pakiet w głównym katalogu /usr/portage, jednak tylko w przypadku, gdy nie zainstalowano dodatkowych repozytoriów.

Pobieranie drzewa Portage z CVS

W razie jakichkolwiek wątpliwości co do systemu CVS należy przeczytać dokument Praca z CVS w Gentoo, gdzie znajduje się znacznie więcej informacji na ten temat.

Drzewo Portage można znaleźć w module gentoo-x86 drzewa systemu Gentoo Linux. Aby pobrać moduł (około 350 megabajtów), najpierw należy skonfigurować CVS za pomocą powyższego przewodnika, a następnie pobrać moduł gentoo-x86 poleceniem checkout.

Co umieszczać (a czego nie) w drzewie Portage

Przed napisaniem jakiegokolwiek ebuilda powinniśmy przejrzeć bugs.gentoo.org w poszukiwaniu niezamieszczonego jeszcze w drzewie Portage pliku ebuild do pakietu, do którego sami chcieliśmy go pisać. W tym celu należy wejść na stronę bugs.gentoo.org, wybrać "query", jako produkt (product) wybrać Gentoo Linux, jako składnik (component) ebuilds. W polu tekstowym powinniśmy wpisać nazwę ebuilda, a jako status wybrać "NEW", "ASSIGNED", "REOPENED" i "RESOLVED" (to ostatnie jest ważne), a następnie zatwierdzić zapytanie. Leniwi niech po prostu klikną tutaj.

Drzewo Portage powinno przede wszystkim być używane do przechowywania plików .ebuild, a także wszelkich względnie małych plików pomocniczych, takich jak łatki lub przykładowe pliki konfiguracyjne. Pliki pomocnicze powinny być umieszczane w katalogu /usr/portage/kategoria/pakiet/files, aby nie zaśmiecać głównego katalogu kategoria/pakiet. Wyjątkiem od tej reguły są większe pliki łatek (zalecamy przyjąć górną granicę rozmiaru pliku na 20KB), które powinny zostać umieszczone na serwerach lustrzanych Gentoo, aby użytkownicy nie marnowali przepustowości ani przestrzeni dyskowej. Odradzamy też deweloperom umieszczanie w CVS plików binarnych (nie-ASCII). Jeśli jednak jest to konieczne (gdybyśmy na przykład chcieli zamieścić niewielki plik graficzny PNG), należy dodać go do CVS przy użyciu opcji -kb, tak jak poniżej:

Listing 1.1: Dodawanie pliku binarnego do CVS

# cvs add -kb mojobrazek.png

Opcja -kb instruuje CVS, że plik mojobrazek.png to plik binarny i powinien być specjalnie traktowany. Nie powinno się na przykład z oczywistych względów pozwolić na łączenie różnic między dwiema wersjami tego pliku. Skoro już mowa o łączeniu zmian, pliki poprawek zamieszczane w Portage nie powinny być kompresowane. Dzięki temu system CVS będzie mógł łączyć zmiany i poprawnie informować deweloperów o konfliktach.

Należy pamiętać, że pakiety, które wysyłamy jako stabilne muszą być gotowe do natychmiastowego użycia przez końcowych użytkowników. Musimy upewnić się, że posiadamy dobry zestaw domyślnych ustawień, który zadowoli większość z nich. Jeśli zaś nasz pakiet nie działa i nie mamy pomysłu jak sprawić, by działał, warto spojrzeć jak poradzili sobie z nią deweloperzy innych dystrybucji. Przykładów możemy szukać choćby w repozytoriach Mandrivy, Debiana lub Fedory.

Wysyłając pliki ebuild do CVS wszyscy deweloperzy powinni używać polecenia repoman commit zamiast cvs commit. Przed samym zamieszczeniem należy wykonać polecenie repoman full, aby upewnić się, że o niczym nie zapominamy.

Polityka wysyłania do CVS

  • Zawsze należy wykonać polecenie repoman scan przed wysłaniem
  • Zawsze należy wykonać polecenie repoman full przed wysłaniem
  • Zawsze powinniśmy sprawdzić poprawność pliku package.mask przed jego wysłaniem przez wykonanie emerge --pretend mypkg i sprawdzenie czy nie zawiera konfliktów.
  • Zawsze należy uaktualnić plik ChangeLog przed wysłaniem
  • Zawsze powinniśmy wysłać uaktualniony plik package.mask przed uaktualnionym pakietem, w razie gdyby wystąpiły konflikty podczas wysyłania pliku package.mask.
  • Zawsze powinniśmy wysyłać wszystkie pliki danego pakietu za jednym razem, nie pojedynczo. Jeśli wysyłamy pakiet z nową licencją albo taki, który jest zamaskowana, najpierw należy wysłać uaktualniony plik package.mask i/lub licencję, następnie plik ebuild, ChangeLog, łatki i plik metadata.xml wszystkie za jednym razem, aby uniknąć uszkodzenia systemów użytkowników.

Katalog files

Jak wspominaliśmy wcześniej, w każdym katalogu pakietu znajduje się podkatalog files/. W nim należy umieszczać wszelkie łatki, pliki konfiguracyjne lub inne pliki pomocnicze. Pliki większe niż około 20KB powinny być zamieszczane na serwerach lustrzanych, aby zmniejszyć ilość (niepotrzebnych) plików, które nasi użytkownicy będą musieli ściągnąć. Warto rozważyć taki schemat nazywania tworzonych poprawek, dzięki którym pakiet w ogóle się zbuduje, aby uwzględniały wersję w nazwie, na przykład pakiet-1.0-gentoo.diff lub prościej, 1.0-gentoo.diff. Przy okazji człon gentoo informuje, że poprawka ta została stworzona przez nas, deweloperów Gentoo, a nie pobrana z listy dyskusyjnej albo innego miejsca. Raz jeszcze: nie należy kompresować tych plików, ponieważ CVS nie radzi sobie dobrze z plikami binarnymi.

Warto rozważyć dodawanie przedrostka lub przyrostka (na przykład mypkg-1.0) do wszystkich plików, które umieszczamy w katalogu files/, aby pliki wykorzystywane z konkretną wersją ebuilda można było łatwo odróżnić od siebie. Ułatwia to porównywanie zmian pomiędzy poprawkami. Ogólnie jest to dobry pomysł. :) Możemy użyć innego przyrostka, jeśli chcemy, aby nazwa pliku łatki przekazywała więcej informacji.

Jeśli w katalogu files/ chcemy umieścić więcej plików, warto stworzyć podkatalogi, na przykład files/1.0/ i umieszczać odpowiednie pliki w ich własnych podkatalogach. Gdy używamy tej metody, nie jest już konieczne dodawanie informacji o wersji do nazw plików. Często jest to więc bardziej wygodne.

1.b. Skrypty ebuild

Wprowadzenie

Skrypty ebuild są podstawą całego systemu Portage. Zawierają wszelkie informacje potrzebne do pobrania, rozpakowania, skompilowania i instalacji zestawu źródeł, a także wykonania ewentualnych czynności poprzedzających i/lub następujących po instalacji i/lub deinstalacji. Pomimo iż większość Portage napisana jest w języku Python, same skrypty ebuild napisane są w bashu, ponieważ wykorzystanie języka skryptowego powłoki pozwala nam na wykonywanie komend tak samo jak z wiersza poleceń. Jednym z najważniejszych założeń projektowych skryptów ebuild jest nazwanie zawartych w nim poleceń analogicznie do tych, które wypisywalibyśmy, instalując pakiet ręcznie poprzez wiersz poleceń. Również z tego względu użycie składni basha jest bardzo wskazane.

Skrypty ebuild są interpretowane przez komendy ebuild i emerge. Wyobraźmy sobie polecenie ebuild jako niskopoziomowe narzędzie, służące do budowania. Potrafi zbudować i zainstalować pojedynczy ebuild, ale nic poza tym. Sprawdzi czy zależności są spełnione, ale nie będzie próbowało ich automatycznie spełnić. Z drugiej strony polecenie emerge jest wysokopoziomowym "silnikiem" dla polecenia ebuild i potrafi w razie potrzeby automatycznie zainstalować zależności, wykonać instalacje symulowane pretend, aby użytkownik mógł dowiedzieć się jakie pakiety zostaną zainstalowane - i dużo więcej. Ogólnie polecenie emerge jest lepsze od ebuild pod każdym względem, oprócz jednego. Za pomocą ebuild możemy stopniowo i pojedynczo wykonywać poszczególne fazy instalacji pakietu (pobieranie źródeł, rozpakowanie, kompilacja, instalacja i integracja pakietu z systemem). Jest to nieocenione narzędzie do debugowania dla deweloperów, ponieważ umożliwia zawężenie problemu z ebuildem do konkretnego fragmentu skryptu ebuild.

Nazewnictwo plików ebuild

Nazwa pliku ebuild składa się z czterech logicznych podsekcji:

pkg-ver{_suf{#}}{-r#}.ebuild

Uwaga: Nawiasy klamrowe ({}) otaczają opcjonalne pola i same nie występują w nazwie pakietu. Znak "#" oznacza dowolną dodatnią liczbę różną od zera.

Pierwsza podsekcja, pkg, to nazwa pakietu. Powinna ona zawierać jedynie małe litery, cyfry od 0 do 9 oraz dowolną liczbę pojedynczych znaków minus (-), podkreślenia (_) lub plus (+). Przykłady: util-linux, sysklogd i gtk+. W Portage można znaleźć kilka pakietów, które nie spełniają tych wymogów, ale nasze pakiety muszą je spełniać.

Druga podsekcja, ver to wersja pakietu, która zwykle powinna odpowiadać wersji głównego archiwum ze źródłami. Najczęściej wersja składa się z dwóch lub trzech (czasem więcej) liczb oddzielonych kropkami, na przykład w ten sposób: 1.2 lub 4.5.2. Czasem bezpośrednio za ostatnią liczbą może pojawić się pojedyncza litera, na przykład 1.4b lub 2.6h. Wersja pakietu połączona jest myślnikiem z jego nazwą. Przykładowo: coś-1.0, bla-2.4.6.

Ważne: Chcąc użyć litery poprzedzającej numer wersji należy mieć na uwadze, że nie powinna ona oznaczać statusu alpha lub beta pakietu, ponieważ alpha i beta to wersje zapoznawcze (ang. prerelease), natomiast wersje z literą na początku to nowsze wersje. To istotne rozróżnienie, ponieważ Portage używa numeru wersji ebuilda do określenia czy jest on nowszy czy starszy od pozostałych pakietów o tej samej nazwie i w tej samej kategorii. Jest więc bardzo ważne, aby numery wersji wiernie odzwierciedlały wersję pakietu i Portage właściwie wykonywał sprawdzanie zależności.

Trzecia podsekcja, {_suf{#}} jest opcjonalna i może zawierać jeden z następujących przyrostków, wymienionych w kolejności od oznaczających najstarsze wydanie po najnowsze:

Przyrostek Znaczenie
_alpha Wydanie alpha
_beta Wydanie beta
_pre Wersja zapoznawcza (prerelease)
_rc Kadynat do wydania oficjalnego (Release candidate)
(none) Oficjalne wydanie
_p Etap poprawek (patch level) (zwykle za przyrostkiem występuje liczba całkowita)

Po każdym z tych przyrostków może zostać dodana dodatnia liczba całkowita różna od zera, na przykład linux-2.4.0_pre10. Zakładając identyczne wersje, przyrostki są ułożone następująco (mniejszy oznacza starszy): _alpha < _beta < _pre < _rc < (brak przyrostka) < _p.

Podczas porównywania liczb poprzedzonych identycznymi przyrostkami za nowszą zostanie uznana większa liczba całkowita. Przykład: bla-1.0_alpha4 jest nowsza niż bla-1.0_alpha3.

Czwarta podsekcja nazwy pakietu oznacza wewnętrzny numer rewizji specyficznej dla systemu Gentoo Linux. Jest on opcjonalny, podobnie jak przyrostek. Znak # jest dodatnią liczbą całkowitą różną od zera, na przykład pakiet-4.5.3-r3.

Numer rewizji jest niezależny od wersji archiwum źródłowego i informuje, iż dostępna jest nowa i poprawiona wersja danego pakietu, specyficzna dla systemu Gentoo Linux. Pierwsze wydania pakietów nie mają numeru rewizji, co oznacza, że pakiet package-4.5.3 Portage potraktuje jak mającą zerowy numer rewizji. Oznacza to, że pakiety zliczane będą w następującej kolejności: 1.0 (wersja początkowa), 1.0-r1, 1.0-r2, itd.

Dokonując znacznych zmian w istniejącym pliku ebuild powinniśmy skopiować go do nowego pliku z numerem rewizji zwiększonym o 1. Należy pamiętać, aby zawsze odnotowywać zmiany zarówno w pliku ChangeLog, jak i w komunikacie wysyłania. Pominięcie choć jednego jest wbrew regułom.

...w zasadzie to mamy też piątą sekcję nazwy pliku ebuild -- samo rozszerzenie .ebuild.

Zawartość pliku ebuild

W tej części zajmiemy się wprowadzeniem do plików ebuild. Aby zobaczyć listę wszystkiego, co można w nich zrobić, warto przeczytać stronę podręcznika systemowego man, gdzie są informacje na temat formatu skryptów ebuild, ich zmiennych i funkcji: man 5 ebuild.

Nagłówki

Nagłówek wysyłanego pliku ebuild powinien być dokładnie taki sam jak ten w pliku /usr/portage/header.txt. Nie należy modyfikować go w żaden sposób, a przede wszystkim należy upewnić się, że linia zawierająca napis $Header: $ jest nienaruszona.

Pierwsze trzy linie powinny wyglądać mniej-więcej tak:

Listing 2.1: Poprawny nagłówek

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

Zmienne

Pierwsza część każdego pliku ebuild składa się z kilku zmiennych. Dzielą się one na trzy kategorie wymienione poniżej:

  • READ: zmiennych tych możemy użyć, ale nie wolno ich ustawiać
  • MUST: zmienne, które koniecznie należy ustawić
  • OPT: zmienne, które powinniśmy ustawić
Zmienna Kategoria Opis
P READ Nazwa i wersja pakietu.
PN READ Nazwa pakietu.
PV READ Wersja pakietu.
PR READ Zawiera numer rewizji lub r0, jeśli pakiet nie posiada tego numeru.
PVR READ Zawiera numer wersji razem z numerem rewizji.
PF READ Zawiera pełną nazwę pakietu ${PN}-${PVR}.
A READ Rozdzielona spacjami lista nazw plików z SRC_URI. Nie uwzględnia ścieżek URL, tylko same nazwy plików.
DISTDIR READ Zawiera ścieżkę do katalogu distfiles, w którym zwykle są przechowywane wszystkie pobrane pliki ze źródłami programów. Zwykle jest to katalog /usr/portage/distfiles.
FILESDIR READ Zawiera ścieżkę do podkatalogu files z katalogu danego pakietu w drzewie Portage. Nie wolno modyfikować tej zmiennej.
WORKDIR READ Katalog główny katalogu roboczego danego ebuilda. Nic nie powinno być budowane na zewnątrz tego katalogu.
S OPT Katalog źródłowy naszego pakietu. Zwykle jest to ${WORKDIR}/${P}. Portage przyjmie tę wartość jako domyślną, nie trzeba jej więc ustawiać samemu.
T READ Katalog tymczasowy naszego pakietu. Jest on używany jako wirtualny katalog /tmp podczas przetwarzania skryptu ebuild.
D READ Katalog główny, do którego pakiet zostanie zainstalowany. Należy traktować go jako wirtualny katalog /.
SLOT MUST Portage obsługuje instalowanie jednocześnie różnych wersji tego samego programu. Na przykład jeśli chcielibyśmy zainstalować jednocześnie GCC 2.95 i GCC 3.2, należałoby ustawić zmienną SLOT w każdym pliku ebuild. W tym przypadku dla GCC 2.95 ustawilibyśmy zmienną SLOT na 2, a dla GCC 3.2 na 3.
Uwaga: Podanie 0 jako wartości zmiennej SLOT oznacza, że dany pakiet ma tylko jedno możliwe ustawienie SLOT (innymi słowy, nie da się jej "SLOT-ować").
LICENSE MUST Zmienna ta określa jaką licencją objęty jest program, na przykład GPL-2, BSD, itp... Zawartością tej zmiennej musi być poprawna licencja (jest nią dowolna licencja z pliku /usr/portage/license/). Jesli danej licencji nie ma w tym pliku, musi zostać tam dodana zanim plik ebuild znajdzie się w drzewie Portage. Jeśli licencja nie zezwala na redystrybucję programu, należy dodać RESTRICT="nomirror" do pliku ebuild.
KEYWORDS MUST Zmienna ta pełni teraz kilka funkcji. Przede wszystkim określa na jakie architektury sprzętowe przeznaczony jest dany ebuild. Przykładowe wartości to: x86, ppc, sparc, mips, alpha, arm, hppa, amd64 i ia64. Więcej szczegółów można znaleźć w pliku profiles/arch.list. Jak nietrudno się domyślić, zmienną tę ustawiamy zgodnie z architekturą docelowej maszyny. Portage nie zezwoli maszynie x86 budować pakietów innych niż x86, zgodnie z tym, co jest podane w zmiennej KEYWORDS. Pakiety, które nie wspierają architektury danego komputera są automatycznie maskowane przez Portage. Jeśli flaga KEYWORDS posiada przedrostek ~, oznacza to, że dany ebuild działa, ale powinien zostać przetestowany w kilku środowiskach, zanim może zostać uznany za stabilny. Jeśli zaś przed flagą KEYWORDS występuje znak -, dany pakiet nie będzie działać na danej architekturze. Pakiety jest uznawany za stabilny, jeśli nic nie poprzedza zmiennych zawartych w KEYWORDS. Ustawiając odpowiednio zmienną ACCEPT_KEYWORDS w pliku make.conf definiujemy którym z powyższych typów pakietów zezwalamy na instalację.
DESCRIPTION MUST Krótki, mieszczący się w jednej linii opis pakietu.
SRC_URI MUST URL-e każdego pliku ze źródłami pakietu, rozdzielone białym znakiem (np. spacją lub znakiem końca linii). W zmiennych SRC_URI i S nie powinno się umieszczać numerów wersji. Powinniśmy zawsze stosować zmienne ${PV} lub ${P}, a jeśli numer wersji nie pokrywa się z nazwą pliku zawierającego źródła, należy stworzyć zmienną ${MY_P} i użyć jej zamiast dwóch poprzednich.
HOMEPAGE MUST Strona domowa pakietu. Jeśli nie możemy znaleźć oficjalnej strony, można podać odnośnik z freshmeat.net lub podobnej strony z bazą danych programów. Nigdy nie należy odnosić się do innej zmiennej wewnątrz tej. Musi ona zawierać tylko czysty tekst.
IUSE MUST W zmiennej tej zamieszczamy flagi USE z jakich korzysta nasz pakiet. Należy pamiętać, że nie wolno tutaj umieścić KEYWORDS!
DEPEND OPT Tutaj wymieniamy zależności potrzebne do zbudowania pakietu. Więcej informacji na temat składni znajdziemy w sekcji Zależności pakietu.
RDEPEND OPT Tutaj wymieniamy zależności potrzebne do uruchomienia programu z pakietu. Jak wspomniano wyżej, więcej szczegółów można znaleźć w sekcji Zależności pakietu.

Funkcje

W plikach ebuild można zdefiniować wiele różnych funkcji, które kontrolują proces budowania i instalacji pakietu.

Funkcja Zastosowanie
pkg_setup Funkcja ta służy do wykonywania wszelkich wstępnych czynności. Może to obejmować sprawdzenie czy istnieje już plik konfiguracyjny.
pkg_nofetch W tym miejscu informujemy użytkownika o tym, co musi zrobić, jeśli z jakiegoś powodu (na przykład licencji) źródła nie mogą zostać automatycznie pobrane przez Portage. Jednocześnie należy ustawić zmienną RESTRICT="fetch". W niniejszej funkcji wolno nam jedynie wyświetlać komunikaty, nie należy wywoływać polecenia die.
src_unpack Tej funkcji należy użyć, aby rozpakować źródła pakietu, nałożyć poprawki i uruchomić zewnętrzne programy, na przykład autotools. Domyślnie funkcja ta rozpakuje pliki wymienione w zmiennej A. Początkowy katalog roboczy definiuje zmienna WORKDIR.
src_compile Za pomocą tej funkcji konfigurujemy i budujemy pakiet. Początkowy katalog roboczy definiuje zmienna S.
src_install Tej funkcji użyjemy, aby zainstalować pakiet w katalogu określonym przez zmienną D. Jesli pakiet korzysta z automake, możemy tego łatwo dokonać poprzez emake DESTDIR=${D} install. Należy upewnić się, że pakiet wszystkie swoje pliki zainstaluje używając D jako katalogu głównego! Początkowy katalog roboczy definiuje zmienna S.
src_test Funkcja ta jest wykonywana tylko wtedy, gdy zmienna FEATURES="test" jest ustawiona, a zmienna RESTRICT="test" nie jest ustawiona. Domyślnie wywołuje dostępną funkcję testującą z plików Makefile, znajdujących się w katalogu zdefiniowanym przez zmienną ${S}, uruchamiając albo "make test" albo "make check", w zależności od tego, co jest dostępne. Funkcję tę można nadpisać i zaimplementować własną metodę testowania pakietu.
pkg_preinst Polecenia zawarte w tej funkcji zostaną wykonane tuż przed zintegrowaniem obrazu pakietu z systemem plików.
pkg_postinst Polecenia zawarte w tej funkcji zostaną wykonane tuż po zintegrowaniu obrazu pakietu z systemem plików.
pkg_prerm Polecenia zawarte w tej funkcji zostaną wykonane tuż przed odinstalowaniem obrazu pakietu z systemu plików.
pkg_postrm Polecenia zawarte w tej funkcji zostaną wykonane tuż po odinstalowaniu obrazu pakietu z systemu plików.
pkg_config Za pomocą tej funkcji możemy przygotować początkową konfigurację pakietu tuż po jego instalacji. Wszystkie ścieżki w obrębie tej funkcji powinny być poprzedzone zmienną ROOT, wskazującą podany przez użytkownika katalog instalacji, który niekoniecznie musi być katalogiem /. Funkcja ta wykonywana jest tylko i wyłącznie wtedy, gdy użytkownik wyda polecenie: emerge --config =${PF}.

Funkcje pomocnicze

W naszych skryptach ebuild możemy użyć także następujących funkcji pomocniczych.

Funkcja Zastosowanie
use Sprawdza czy zdefiniowane zostały podane flagi USE. Jeśli tak, funkcja zwróci wartość odpowiadającą logicznej prawdzie. Niezależnie od wyniku działania, funkcja nie wypisuje żadnych komunikatów na standardowe wyjście. Aby uzyskać informacje na standardowym wyjściu należy skorzystać z funkcji usev, które wypisze flagę USE, jeśli została ona zdefiniowana.
has_version Zwraca 1 jeśli w systemie jest żądana wersja danego pakietu. Na przykład has_version >=sys-libs/glibc-2.3.0.
best_version Zwraca informację kategoria/pakiet-wersja danego pakietu, podaną w formacie kategoria/pakiet. Na przykład best_version x11-libs/gtk+extra.
use_with Funkcja ta sprawdza czy flaga USE została zdefiniowana i zwraca odpowiednio "--with-foobar" lub "--without-foobar". Jeśli podamy funkcji tylko jeden argument, oznacza to, że jest on zarówno flagą USE, jak i tekstem with/without. Podając zaś dwa, pierwszy z nich jest flagą USE, a drugi tekstem with/without. Na przykład use_with truetype freetype wypisze "--with-freetype", jeśli zmienna USE zawiera truetype.
use_enable Tak samo jak w przypadku use_with, ale zwraca odpowiednio "--enable-blabla" lub "--disable-blabla".
check_KV Sprawdza czy Portage zna wersję jądra. Jeśli nie, wypisze komunikat błędu i zakończy działanie niepowodzeniem. Jeśli w naszym skrypcie potrzebujemy wersji jądra, należy użyć zmiennej KV, która jest automatycznie definiowana przez Portage. W systemie działającym na jądrze gentoo-sources-2.4.20-r6, zmienna KV będzie miała wartość "2.4.20".
keepdir Tworzy (jeśli jest to konieczne) plik .keep w danym katalogu, aby katalog ten nie został automatycznie usunięty. Nigdy nie należy tworzyć pliku .keep ręcznie. Jeśli zasada działania funkcji keepdir zmieni się w Portage, samodzielne tworzenie tego pliku popsuje pakiet.
econf Wykonuje polecenie ./configure z wszelkimi niezbędnymi zmianami w ścieżkach (prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir). Możemy opcjonalnie przekazać dodatkowe argumenty do ./configure, przekazując je funkcji econf przy wywołaniu, zaś użytkownicy w razie potrzeby mogą ustawić zmienną środowiskową EXTRA_ECONF. Opcje przekazane skryptowi configure przejmują pierwszeństwo w odwrotnej kolejności niż zostały podane. Innymi słowy, pierwszy przekazany argument zostanie zawsze zastąpiony ostatnim.
einstall Wykonuje polecenie make install z wszystkimi niezbędnymi zmianami w ścieżkach (prefix, datadir, mandir, infodir, datadir, sysconfdir, localstatedir). Jak wyżej, można przekazać dodatkowe argumenty do komendy make, przekazując je funkcji einstall przy jej wywołaniu. Zauważmy jednak, że preferowanym sposobem zainstalowania pakietu jest wywołanie komendy emake install DESTDIR=${D}, a nie za pomocą einstall. Komenda ta używana jest tylko zastępczo w przypadku popsutych plików make.
die Powoduje przerwanie aktualnego procesu. Poinformuje użytkownika o przyczynie problemu, wypisując podane argumenty. Przekazanie argumentów funkcji die jest wysoce wskazane, jeśli mamy więcej niż jedno jej wywołanie w danej funkcji. O wiele trudniej jest wyśledzić problemy, jeśli nie wiemy gdzie problem wystąpił.
elog Przekazuje użytkownikowi istotne informacje. Argument przekazany funkcji elog będzie komunikatem, który zobaczy użytkownik. Nie należy używać tej funkcji do wypisywania nagłówków w rodzaju "*************************************". Sam fakt, że została użyta funkcja einfo wystarczy, aby przyciągnąć uwagę użytkownika. Dodatkowo komunikat jest zapisywany przy użyciu systemu ELOG maszyny Portage.
einfo Wyświetla mało istotne komunikaty informacyjne, które nie muszą być rejestrowane.

Funkcje pomocnicze dostarczone przez eutils.eclass

Możemy użyć następujących funkcji pomocniczych, które są dostępne w naszych ebuildach poprzez eclass "eutils". Należy upewnić się, że użyliśmy instrukcji inherit eutils, inaczej funkcje te nie będą działać.

Funkcja Zastosowanie
epatch Funkcja ta jest bardziej przyjazną wersją polecenia patch. Działa ona nie tylko z łatkami w plikach tekstowych, ale też w plikach typu .bz2, .gz i .zip. Nie trzeba podawać opcji "-p", zaś opcje, które należy podać powinny być ustawione w zmiennej EPATCH_OPTS. Funkcja oczekuje pliku lub katalogu jako argumentu. Jeśli podamy katalog, wszystkie łatki w postaci "??${ARCH}_..." zostaną nałożone. Aby poprawka mogła być nałożona, musi pasować do naszej architektury, mieć napis "_all_" w nazwie pliku, lub zmienna EPATCH_FORCE musi być ustawiona na "yes".
gen_usr_ldscript Funkcja ta tworzy w katalogu /usr/lib skrypty linkera dla dynamicznych bibliotek z katalogu /lib. Naprawia to problemy z linkowaniem gdy plik .so znajduje się w katalogu /lib, podczas gdy plik .a znajduje się w katalogu /usr/lib.
edos2unix Funkcja ta robi dokładnie to samo co program dos2unix.
egetent Funkcja egetent pełni rolę interfejsu dla getnet pod Linuksem lub dla nidump pod Mac OS X (R).
enewuser Tworzy nowego użytkownika. Funkcja oczekuje wymaganego parametru z nazwą użytkownika i szeregu opcjonalnych argumentów: $2 zawiera UID, zaś gdy przekażemy -1 użyty zostanie następny dostępny; $3 zawiera powłokę systemową (-1 to wartość domyślna), domyślnie będzie to /bin/false; $4 to katalog domowy, domyślnie /dev/null, $5 zawiera grupy, do których użytkownik powinien zostać dodany (domyślnie żadne), zaś $6 może zawierać różne dodatkowe opcje jakie chce się przekazać do useradd.
enewgroup Dodaje nową grupę. Funkcja oczekuje wymaganego parametru z nazwą grupy - opcjonalny drugi argument to konkretny GID.
make_desktop_entry Tworzy wpis desktop wg standardu freedesktop.org. Pierwszy argument zawiera ścieżkę do pliku binarnego z programem. Dodatkowo drugi zawiera nazwę pliku ikony - domyślna wartość to ${PN}. Trzeci może zawierać ścieżkę do pliku ikony - względną do ścieżki /usr/share/pixmaps lub pełną ścieżkę. Wartość domyślna to ${PN}.png; czwarty może zawierać kategorię aplikacji, zaś piąty argument zawiera opcjonalną ścieżkę początkową dla aplikacji.
check_license Wyświetla licencję aby użytkownik mógł ją przeczytać i zaakceptować. Jeśli nie podano argumentów, użyta zostanie licencja określona przez zmienną ${LICENSE}.
unpack_pdv Rozpakowuje archiwum wygenerowane przez pdv, przy czym pierwszy argument musi zawierać nazwę pliku archiwum, drugi zaś wartość "off_t", którą należy wygenerować ręcznie: strace -elseek ${plik}, zaś dla przykładowego wywołania takiego jak to: "lseek(3, -4, SEEK_END)" przekazalibyśmy wartość "4".
unpack_makeself Rozpakowuje archiwum wygenerowane przez makeself, wymaga nazwy pliku do rozpakowania jako argumentu.
cdrom_get_cds Prosi użytkownika o włożenie płyty CD do czytnika. Rozpoznaje czy płyta jest właściwa sprawdzając, czy znajduje się na niej plik o nazwie podanej jako argument funkcji. Użytkownik będzie kolejno proszony o włożenie tylu płyt, ile podamy argumentów. Miejsce zamontowania płyty zostanie ustawione w zmiennej ${CDROM_ROOT}.
cdrom_load_next_cd Ładuje następną płytę CD gdy już skończyliśmy z poprzednią. Jeśli funkcja zwróci wartość, zmienna ${CDROM_ROOT} wskaże następną płytę CD.
strip-linguas Zadaniem tej funkcji jest upewnienie się, że zmienna LINGUAS zawiera tylko obsługiwane przez pakiet języki, podawane jako argumenty dla funkcji. Jeśli pierwszym argumentem jest -i, tworzona jest lista plików .po w określonych katalogach i użyta jest część wspólna list. Jeśli zaś pierwszym argumentem jest -u, tworzona jest lista plików .po w określonych katalogach i użyta jest suma list.

Funkcje pomocnicze dostarczone przez flag-o-matic.eclass

Możemy użyć następujących funkcji pomocniczych, które są dostępne w naszych ebuildach poprzez eclass "flag-o-matic". Należy upewnić się, że użyliśmy instrukcji inherit flag-o-matic, inaczej funkcje te nie będą działać. Nigdy nie należy ręcznie modyfikować ustawień kompilatora, zamiast tego powinniśmy użyć funkcji z eclass flag-o-matic do czynności typu odfiltrowanie sprawiających kłopoty flag.

Funkcja Zastosowanie
filter-flags Funkcja ta usuwa konkretne flagi ze zmiennych C[XX]FLAGS - usuwane są tylko flagi, których nazwy w całości pasują do nazw tych, które chcemy usunąć.
append-flags Funkcja ta dodaje dodatkowe flagi do istniejących zmiennych C[XX]FLAGS.
replace-flags Zamienia w zmiennych C[XX]FLAGS flagę podaną jako pierwszy argument na flagę podaną jako drugi.
replace-cpu-flags Tu powinny znajdować się dwa parametry. Pozwala na zamianę wartości mtune/mcpu/mtune na inną. Na przykład replace-cpu-flags 'i686' 'i586' zamieni -mtune/-march/-mcpu=i686 na -mtune/-march/-mcpu=i586).
strip-flags Usuwa wszystkie flagi z wyjątkiem tych podanych w zmiennej ALLOWED_FLAGS.
strip-unsupported-flags Usuwa ze zmiennych C[XX]FLAGS wszystkie flagi, których nie obsługuje aktualnie działająca wersja kompilatora GCC.
get-flag Znajduje flagę i wypisuje jej wartość.
is-flag Funkcja ta zwraca wartość true jeśli dana flaga jest aktualnie ustawiona w zmiennych C[XX]FLAGS; nazwy flag muszą się zgadzać w całości, aby zostały dopasowane.
append-ldflags Funkcja ta dodaje dodatkowe flagi do istniejącej zmiennej LDFLAGS.
filter-ldflags Usuwa podane flagi ze zmiennej LDFLAGS, przy czym nazwy flag muszą się zgadzać w całości, aby zostały dopasowane.
fstack-flags Dodaje flagę -fno-stack-protector, która znosi flagi -fstack-protector i -fstack-protector-all.

Funkcje pomocnicze dostępne w toolchain-funcs.eclass

Możemy użyć następujących funkcji pomocniczych, które są dostępne w naszych ebuildach poprzez eclass "toolchain-funcs". Należy upewnić się, że użyliśmy instrukcji inherit toolchain-funcs, inaczej funkcje te nie będą działać. Nigdy nie należy ręcznie modyfikować ustawień kompilatora lub binutils, zamiast tego powinniśmy użyć funkcji z eclass flag-o-matic do określenia kompilatorów i binutils.

Poniższe funkcje stosuje się, aby wspierać kompilację skrośną i kompilator icc. Powinny być one używane gdy pakiet wprost używa gcc, g++, ld, ranlib lub jakichkolwiek poniższych narzędzi. Na ogół pakiety, które używają narzędzi do autokonfiguracji wykrywają kompilację skrośną automatycznie i nie potrzebują poniższych funkcji.

Funkcja Zastosowanie
tc-getAR Zwraca nazwę archiwizatora.
tc-getAS Zwraca nazwę asemblera.
tc-getCC Zwraca nazwę kompilatora C.
tc-getCXX Zwraca nazwę kompilatora C++.
tc-getLD Zwraca nazwę linkera.
tc-getNM Zwraca nazwę narzędzia do inspekcji symboli/obiektów.
tc-getRANLIB Zwraca nazwę programu indeksującego archiwa
tc-getF77 Zwraca nazwę kompilatora fortrana.
tc-getLD Zwraca nazwę linkera
tc-getLD Zwraca nazwę linkera.
tc-getGCJ Zwraca nazwę kompilatora javy.
tc-getBUILD_CC Zwraca nazwę kompilatora C do budowania.
tc-is-cross-compiler Prosty sposób na sprawdzenie czy używamy kompilatora skrośnego.
gcc-fullversion Zwraca wersję tak samo jak polecenie $($CC -dumpversion)
gcc-version Zwraca tylko postać <major>.<minor> wersji.
gcc-major-version Zwraca część Major wersji.
gcc-minor-version Zwraca część Minor wersji.
gcc-micro-version Zwraca część Micro wersji.

Zasady pisania plików ebuild

Pliki ebuild są tak naprawdę skryptami powłoki, powinniśmy więc przy ich edycji używać trybu edycji skryptów powłoki naszego edytora. Należy stosować odpowiednie wcięcia, wyłącznie przy pomocy znaków tabulacji -- żadnych spacji. Należy się upewnić, że rozmiar tabulacji w naszym edytorze wynosi 4 spacje. Zawsze powinniśmy stosować nawiasy klamrowe wokół zmiennych środowiskowych, czyli ${P} zamiast $P.

Długie linie zawijamy za pomocą znaku ' \':

Listing 2.2: Zawijanie wierszy w plikach ebuild

./configure \
--prefix=/usr || die "configure failed"

Więcej szczegółów znajdziemy w pliku skel.ebuild (zwykle znajduje się on w katalogu /usr/portage).

Warto zwrócić uwagę na domyślny plik vimrc w Gentoo jeśli używamy programu Vim do edycji plików ebuild/eclass. Znajduje się on w katalogu /etc/vim/vimrc i zawiera poprawne ustawienia wcięć i typów plików dla plików ebuild i eclass. Jeszcze więcej możliwości, w tym specjalne podświetlanie składni w plikach ebuild uzyskamy instalując app-vim/gentoo-syntax.

Na systemach innych niż Gentoo podobne ustawienia zyskamy, dopisując poniższe linijki do naszego pliku vimrc, albo jeszcze lepiej, instalując skrypty gentoo-syntax, które są dostępne na serwerach lustrzanych Gentoo..

Listing 2.3: Konfiguracja vimrc do edycji plików ebuild

au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh
au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab

Użytkownicy edytora Emacs powinni zainstalować pakiet app-emacs/gentoo-syntax (dla GNU Emacs) lub app-xemacs/gentoo-syntax (dla XEmacs). Pakiety te zawierają pliki konfiguracyjne pomagające Emacsowi prawidłowo zawijać wiersze i podświetlać składnię w plikach ebuild.

Jeśli zaś używamy edytora nano, szczęśliwie oszczędzono nam pracy. Wystarczy tylko odkomentować sekcję dotyczącą ebuildów w pliku /etc/nanorc.

Zmienne USE

Dzięki zmiennym USE możliwe jest skonfigurowanie Portage, aby globalnie i automatycznie włączało lub wyłączało pewne opcjonalne, ustawiane przy budowaniu funkcje programów. Oto przykład. Załóżmy, że jesteśmy fanami środowiska GNOME i chcielibyśmy, aby każdy ebuild, który daje możliwość wkompilowania opcjonalnej obsługi tego środowiska zrobił to. W tym przypadku należy dodać gnome do zmiennej USE w pliku /etc/make.conf, a Portage automatycznie będzie dodawał opcjonalną funkcjonalność GNOME do pakietów, jeśli jest ona dostępna. Podobnie, jeśli nie chcemy funkcji GNOME w naszych ebuildach, wystarczy upewnić się, że gnome nie jest dodane do zmiennej USE w pliku /etc/make.conf. System Gentoo Linux ma niemal przytłaczającą ilość opcji USE, dzięki czemu możemy skonfigurować go dokładnie tak jak chcemy.

Uwaga: Jeśli wyłączymy flagę USE (na przykład usuwając gnome ze zmiennej USE), poinstruuje to jedynie Portage, aby wyłączyć opcjonalne wsparcie dla GNOME w czasie budowania. Jednakże jeśli instalujemy za pomocą narzędzia emerge ebuild, który wymaga GNOME, pakiet ten oczywiście będzie zawierać obsługę tego środowiska. Oznacza to także, że GNOME zostanie automatycznie zainstalowane (jako zależność), jeśli wcześniej nie było go w systemie. Właśnie dlatego dobrze jest użyć polecenia emerge --pretend zanim uruchomimy "prawdziwy" emerge; w ten sposób zawsze będziemy wiedzieć co się zainstaluje.

W naszych skryptach ebuild możemy sprawdzać czy dana zmienna USE jest ustawiona za pomocą polecenia use <zmienna>. Najczęściej użyjemy tego polecenia analogicznie jak poniżej:

Listing 2.4: Sprawdzanie czy flaga USE jest ustawiona

if use X; then
  # Komendy specyficzne dla X...
fi

Zmiennych USE można również używać w celu ustawiania zależności. Na przykład chcielibyśmy, aby pewien pakiet był wymagany tylko jeśli ustawiona jest pewna zmienna USE. Możemy tego dokonać za pomocą składni flaga? ( kategoria/pakiet ) w zmiennej DEPEND naszego pliku ebuild. W tym przypadku kategoria/pakiet będzie wymagana jedynie wtedy, gdy flaga będzie obecna w zmiennej USE. Możliwe jest także określenie jaka zależność ma zostać użyta jeśli pewna flaga USE jest ustawiona, a jaka ma zostać użyta, jeśli nie jest ustawiona: flaga? ( kategoria/pakiet ) i !flaga? ( innakategoria/innypakiet ). W tym przypadku jeśli flaga nie jest ustawiona, użyta zostanie innakategoria/innypakiet zamiast kategoria/pakiet. Należy upewnić się, że nasze ebuildy używają powyższej składni, a nie instrukcji warunkowych IF powłoki bash. Instrukcje warunkowe basha nie współpracują z cache'owaniem zależności przez Portage, więc używanie ich popsuje nasz ebuild.

Oto ważna wskazówka jak używać zmiennej USE. Najczęściej pakiety posiadają skrypt ./configure, za pomocą którego dokonuje się ich konfiguracji. Zwykle jeśli nasz ebuild używa ./configure, wszelka opcjonalna funkcjonalność zostanie włączona lub wyłączona przy budowaniu przez przekazanie odpowiednich parametrów do polecenia ./configure. Oto najlepszy sposób na obsłużenie tego:

Listing 2.5: Wyrażenia warunkowe oparte na ustawieniach USE

DEPEND="X? ( >=x11-base/xfree-4.3 )
mysql? ( >=dev-db/mysql-3.23.49 )
apache2? ( >=net-www/apache-2 )
!apache2? ( =net-www/apache-1* )"

src_compile() {
  econf \
    $(use_enable X x11) \
    $(use_enable mysql) \
    || die "Error: econf failed!"
  emake || die "Error: emake failed!"
}

Takie podejście daje dobre wyniki. Nie musimy martwić się jakie są domyślne ustawienia mysql albo X (włączone/wyłączone), przekazujemy wprost funkcji econf co ma zrobić w oparciu o zmienną USE. Nie wspominając już o przejrzystości takiego kodu. :)

Czasami ebuildy będą posiadały konfliktujące opcjonalne funkcjonalności. Sprawdzanie tych konfliktów oraz drukowanie błędu jeśli odpowiedź jest twierdząca nie jest dobrym rozwiązaniem. Zamiast tego należy faworyzować jedną funkcjonalność przed drugą. W takich wypadkach należy zastanowić się, która opcja dostarcza bardziej powrzechną funkcjonalność, lub po prostu rzucić monetą. Przykładem mogą być ebuildy msmtp. Pakiet ten może współpracować z SSL dostarczanym przez GnuTLS, z SSL dostarczanym przez OpenSSL lub w ogóle nie posiadać wsparcia dla SSL. W związku z tym, że GnuTLS posiada szersze możliwości niż OpenSSL jest faworyzowane, a dokonuje się tego w następujący sposób:

Listing 2.6: Uporanie się z konfliktującymi funkcjonalnościami

src_compile() {
     local myconf

     if use gnutls ; then
         myconf="${myconf} --enable-ssl --with-ssl=gnutls"
     elif use ssl ; then
         myconf="${myconf} --enable-ssl --with-ssl=openssl"
     else
         myconf="${myconf} --disable-ssl"
     fi

     econf \
         # Other stuff
         ${myconf} \
         || die "configure failed"

     emake || die "make failed"
 }

Pod tym adresem możemy obejrzeć stale uaktualnianą tabelę zmiennych USE.

1.c. Położenia w systemie plików

Wprowadzenie do FHS

Standard rozmieszczenia katalogów w systemie plików ściśle odpowiada FHS, czyli File system Hierarchy Standard (standard hierarchii systemu plików). Uproszczony opis standardu podajemy poniżej; kompletną specyfikację można znaleźć pod adresem http://www.pathname.com/fhs/.

Uwaga: Katalog /opt omówiony jest w części 3.12 standardu FHS. Część 4.4 traktuje o katalogu /usr/X11R6. środowiska KDE i GNOME nie są omówione, a dokładniej nie ma o nich nawet wzmianki w aktualnej wersji FHS.

Jak umieszczać pakiety w systemie plików

Jeśli pakiet używa autoconf i automake, domyślne katalogi docelowe przy instalacji zwykle będą poprawne, z kilkoma wyjątkami:

  • Jeśli instalujemy program w katalogu /bin, /sbin, /usr/bin lub /usr/sbin, dokumentacja man programu powinna zostać zainstalowana w katalogu /usr/share/man. Zwykle można to osiągnąć pisząc w skrypcie ebuild ./configure --mandir=/usr/share/man.
  • Pliki dokumentacji GNU info zawsze powinny być instalowane w katalogu /usr/share/info, nawet jeśli dokumentacja należy do programów specyficznych dla X11, GNOME lub KDE. Zwróćmy uwagę: katalog /usr/share/info jest jedynym oficjalnym miejscem na pliki GNU info. Często skrypty ./configure domyślnie instalują pliki GNU info w katalogu /usr/info. W tej sytuacji należy przekazać ./configure parametr --infodir=/usr/share/info.
  • Pliki dokumentacji są instalowane w katalogu /usr/share/doc, do podkatalogu, na którego nazwę składa się nazwa, wersja i rewizja danego programu. Dotyczy to wszystkich programów: GNOME, KDE, X11 i konsolowych. Niektóre programy jednak mogą dla swoich potrzeb instalować dodatkową dokumentację i pliki pomocnicze w hierarchii /usr/share.
  • Programy i biblioteki specyficzne dla X11 zawsze powinny być instalowane w katalogu /usr, a nie bezpośrednio w /usr/X11R6. Tę hierarchię katalogów rezerwujemy dla samego Systemu X Window w Wersji 11, Wydaniu 6. Jest to być może bardziej dosłowna interpretacja standardu FHS niż w przypadku wielu innych dystrybucji.
  • Podobnie programy GNOME i KDE powinny być zawsze instalowane w katalogu /usr.

Ważne: Niektóre dystrybucje instalują GNOME i KDE w katalogu /opt. Nie istnieje standard, który definiowałby gdzie należy umieszczać pliki tych środowisk graficznych. W imię prostoty i spójności zdecydowaliśmy umieszczać wszystkie pakiety KDE i GNOME w hierarchii katalogów /usr.

Ogólnie nasze ebuildy powinny instalować pliki w katalogu /usr. Niektóre programy mogą być kompilowane i linkowane z bibliotekami GNOME, KDE oraz X11 lub bez nich, co może powodować zamieszanie. Rozwiązanie, jakie proponujemy to instalowanie wszystkiego w katalogu /usr, dzięki czemu autorzy skryptów ebuild unikną niejednoznacznych sytuacji i niepotrzebnych komplikacji. Miejsce, w którym będziemy instalować pliki programu nie mogą zależeć od obecności lub nieobecności jakichś zmiennych USE. Dlatego ebuildy w drzewie Portage praktycznie zawsze instalują swoje pliki wyłącznie w hierarchii katalogów /usr.

Uwaga: Katalog /opt jest w systemie Gentoo Linux zarezerwowany dla pakietów binarnych, na przykład mozilla-bin, acroread, netscape i realplayer. Najczęściej pakiety instalowane w tym katalogu wymagają dodatkowego pliku /etc/env.d/coś. Służy on do włączenia ścieżek i dodatkowych zmiennych do środowiska. Więcej informacji na temat katalogu /etc/env.d można znaleźć w tym dokumencie.

1.d. Skrypty i narzędzia Portage

Skrypty publiczne

Są to skrypty używane przez administratora systemu do instalacji i deinstalacji pakietów, a także przy opiekowaniu się bazą danych pakietów.

Skrypt ebuild jest głównym "silnikiem" systemu Portage; za jego pomocą wykonujemy wszystkie główne zadania, na przykład rozpakowanie, kompilacja, instalacja, integracja z systemem i deinstalacja pakietów. Używa się go w następujący sposób: ebuild ścieżka/do/pakiet.ebuild komenda. Oto dostępne polecenia:

Polecenie Opis Spokrewniona funkcja ze skryptów ebuild
setup* Wykonuje różnorakie komendy, których uruchomienie wymagane jest zanim rozpocznie się właściwe budowanie. pkg_setup
depend Wyświetla zależności niezbędne do zbudowania pakietu. Nie dotyczy
merge* Rozpakowuje, kompiluje, instaluje i integruje pakiet z systemem plików. Nie dotyczy
qmerge* Integruje pakiet z systemem plików, zakładając, że etapy rozpakowania, kompilacji i instalacji już zostały wykonane. Nie dotyczy
unpack* Rozpakowuje archiwa z kodem źródłowym w katalogu roboczym. src_unpack
compile* Kompiluje pakiet. src_compile
rpm Tworzy RPM z pakietu. Nie dotyczy
package Tworzy pakiet Gentoo w formacie tbz2. Nie dotyczy
prerm* Wykonuje etap przed usunięciem pakietu. pkg_prerm
postrm* Wykonuje etap po usunięciu pakietu. pkg_postrm
preinst* Wykonuje etap przed zainstalowaniem pakietu. pkg_preinst
postinst* Wykonuje etap po zainstalowaniu pakietu. pkg_postinst
config Przygotowuje domyślną konfigurację gdy pakiet został zainstalowana w systemie plików. pkg_config
touch* Uaktualnia czasy modyfikacji każdego archiwum źródłowego pakietu. Nie dotyczy
clean* Czyści katalog roboczy pakietu. Nie dotyczy
fetch* Pobiera pliki ze źródłami pakietu. Nie dotyczy
digest* Tworzy plik digest pakietu. Nie dotyczy
test* Uruchamia funkcję autotestu pakietu. src_test
install* Instaluje pakiet w katalogu obrazu. src_install
unmerge Usuwa pakiet z systemu plików. Nie dotyczy

Uwaga: Komendy oznaczone gwiazdką (*) zwykle używane są tylko przez deweloperów.

Narzędzie emerge rekursywnie instaluje pakiet i wszystkie jej zależności w systemie plików. Komenda ta ma wiele opcji, których listę możemy zobaczyć, wydając polecenie emerge --help.

Narzędzie env-update uaktualnia pliki konfiguracyjne (w tym /etc/ld.so.conf i /etc/profile.env), aby uwzględniały zmiany wprowadzone przez zainstalowane pakiety.

Prywatne skrypty i komendy

Skryptów tych możemy użyć w naszych skryptach ebuild do wykonywania typowych zadań.

Jeśli ktoś lubi grzebać w kodzie, może przyjrzeć się poniższym skryptom, zaglądając do katalogu /usr/lib/portage/bin.

Komenda Wartość domyślna Opis Przykład
diropts -m0755 Ustawia opcje gdy uruchamiamy skrypt dodir. diropts -m0750
dobin Nie dotyczy Instaluje podane pliki binarne w katalogu DESTTREE/bin. dobin wmacpi
docinto "" Ustawia względny katalog (DOCDESTTREE) wykorzystywany przez funkcję dodoc. docinto examples
dodir Nie dotyczy Tworzy katalog, automatycznie uwzględniając katalog ${D}. dodir /usr/lib/newpackage
dodoc Nie dotyczy Instaluje podane pliki w katalogu z dokumentacją pakietu (/usr/share/doc/${PF}/DOCDESTTREE) (zob. docinto) dodoc README *.txt
doexe Nie dotyczy Instaluje podane pliki z uprawnieniami EXEOPTIONS (zob. exeopts) w katalogu PATH (zob. exeinto). doexe ${FILESDIR}/quake3
dohard Nie dotyczy Tworzy dowiązanie twarde, automatycznie uwzględniając katalog ${D}. dohard ls /bin/dir
dohtml Nie dotyczy Instaluje podane pliki i katalogi w katalogu /usr/share/doc/${PF}/html. dohtml -r doc/html/*
doinfo Nie dotyczy Instaluje podane pliki w katalogu /usr/share/info, a następnie kompresuje je programem gzip. doinfo doc/*.info
doins Nie dotyczy Instaluje podane pliki z uprawnieniami INSOPTIONS (zob. insopts) w katalogu INSDESTTREE (zob. insinto). doins *.png icon.xpm
dolib Nie dotyczy Instaluje podane biblioteki w katalogu DESTTREE/lib z uprawnieniami 0644. dolib *.a *.so
dolib.a Nie dotyczy Instaluje podane biblioteki w katalogu DESTTREE/lib z uprawnieniami 0644. dolib.a *.a
dolib.so Nie dotyczy Instaluje podane biblioteki w katalogu DESTTREE/lib z uprawnieniami 0644. dolib.so *.so
doman Nie dotyczy Instaluje podane pliki w katalogu /usr/share/man/manX na podstawie przyrostka nazwy pliku (plik.1 zostanie zainstalowany w katalogu man1). doman *.1 *.5
dosbin Nie dotyczy Instaluje pliki w katalogu DESTTREE/sbin, upewniając się, że uprawnienia zezwalają na ich wykonywanie. dosbin ksymoops
dosym Nie dotyczy Tworzy dowiązanie symboliczne, automatycznie uwzględniając katalog ${D}. dosym gzip /bin/zcat
emake Nie dotyczy Uruchamia make z argumentami MAKEOPTS. Niektórych pakietów nie można kompilować równolegle; wówczas powinniśmy użyć emake -j1. Jeśli musimy przekazać jeszcze dodatkowe parametry do make, wystarczy przekazać je do polecenia emake jako parametry. Użytkownicy mogą ustawić zmienną środowiskową EXTRA_EMAKE, aby przekazywać dodatkowe flagi poleceniu emake. emake
exeinto / Ustawia katalog główny (EXEDESTTREE) dla polecenia doexe. exeinto /usr/lib/${PN}
exeopts -m0755 Ustawia opcje do uruchomienia polecenia doexe. exeopts -m1770
fowners Nie dotyczy Nadaje podanemu plikowi podanego właściciela poprzez komendę chown, automatycznie uwzględniając katalog ${D}. fowners root:root /sbin/functions.sh
fperms Nie dotyczy Nadaje podanemu plikowi podane uprawnienia poprzez komendę chmod, automatycznie uwzględniając katalog ${D}. fperms 700 /var/consoles
insinto /usr Ustawia katalog główny (INSDESTTREE) dla polecenia doins. insinto /usr/include
insopts -m0644 Ustawia opcje do uruchomienia polecenia doins. insopts -m0444
into /usr Ustawia katalog docelowy (DESTTREE) dla wszystkich poleceń zaczynających się od 'do' (czyli dobin, dolib, dolib.a, dolib.so, domo, dosbin). into /
libopts -m0644 Ustawia opcje do uruchomienia polecenia dolib. libopts -m0555
newbin Nie dotyczy Interfejs do polecenia dobin, instalujący podany plik binarny, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newbin ${FILESDIR}/vmware.sh vmware
newdoc Nie dotyczy Interfejs do polecenia dodoc, instalujący podany plik, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newdoc README README.opengl
newexe Nie dotyczy Interfejs do polecenia doexe, instalujący podany plik, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newexe ${FILESDIR}/xinetd.rc xinetd
newins Nie dotyczy Interfejs do polecenia doins, instalujący podany plik, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newins ntp.conf.example ntp.conf
newman Nie dotyczy Interfejs do polecenia doman, instalujący podany plik, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newman xboing.man xboing.6
newsbin Nie dotyczy Interfejs do polecenia dosbin, instalujący podany plik, automatycznie zmieniając jego nazwę na tę podaną w drugim argumencie. newsbin strings strings-static
prepall Nie dotyczy Uruchamia komendy prepallman, prepallinfo i prepallstrip. Upewnia się także, że uprawnienia wszystkich bibliotek w katalogach /opt/*/lib, /lib, /usr/lib i /usr/X11R6/lib pozwalają na ich wykonywanie. Dodatkowo przemieszcza wszelkie zbłąkane makra aclocal do katalogu /usr/share/aclocal. prepall
prepalldocs Nie dotyczy Zachowanie zostało zmienione pomiędzy wersjami Portage, w związku z czym nowe ebuildy nie powinny korzystać z tej funkcji. prepalldocs
prepallinfo Nie dotyczy Rekursywnie kompresuje wszystkie pliki dokumentacji info w katalogu /usr/share/info. prepallinfo
prepallman Nie dotyczy Rekursywnie kompresuje wszystkie pliki dokumentacji man w katalogach /opt/*/man/*, /usr/share/man/*, /usr/local/man/*, /usr/X11R6/share/man/*, automatycznie poprawiając wszelkie dowiązania symboliczne. prepallman

1.e. Zależności pakietu

Dlaczego zależności są ważne

Portage to coś więcej niż wygodny skrypt pozwalający w ujednolicony sposób budować oprogramowanie (program, bibliotekę) ze źródeł. Potrafi on także pobrać i zainstalować wszelkie potrzebne zależności, jeśli tylko podamy je w naszym skrypcie ebuild.

W oficjalnych ebuildach wszystkie zależności zostały już określone, więc gdy wydamy komendę emerge net-www/mozilla, Portage dopilnuje by wszystkie zależności niezbędne do zbudowania i uruchomienia Mozilli zostały zainstalowane zanim zacznie kompilować samą Mozillę.

Portage rozróżnia nawet między zależnościami potrzebnymi do zbudowania i do uruchomienia (Niestety, w tej chwili Portage jedynie instaluje wszystkie zależności potrzebne do budowania i uruchomienia. W przyszłości jednak będzie możliwe automatyczne odchudzenie systemu, aby pozostały w nim tylko zależności potrzebne do uruchamiania programów.

Jak definiować zależności w naszych skryptach ebuild (czyli atomy DEPEND)

Zmienna DEPEND w naszym pliku bla-x.y.z.ebuild mówi Portage jakie pakiety są potrzebne, aby zbudować program bla. Zmienna RDEPEND określa zaś jakie pakiety są potrzebne, aby uruchomić bla. Zmienna RDEPEND powinna być ustawiona jawnie, nawet jeśli jej wartość jest taka sama jak w przypadku DEPEND, ponieważ w przyszłości zmiennej RDEPEND nie będzie domyślnie przypisywana wartość DEPEND, w przypadku braku zdefiniowania tej pierwszej.

Listing 5.1: Przykład zależności

DEPEND="virtual/opengl
     dev-libs/libxml2"
RDEPEND="${DEPEND}"

Ten przykład informuje Portage o fakcie, że aby zbudować pakiet bla-x.y.z potrzebne będą pakiety virtual/opengl (więcej o kategoriach wirtualnych wkrótce) i dev-libs/libxml2. Nie jest podane jakie wersje opengl i libxml2 są potrzebne, co oznacza, że dobre będą wszystkie.

Rzecz jasna, "dobre będą wszystkie" w większości wypadków nie wystarczy. Jedynie w przypadku głównych bibliotek jest to wystarczające, ponieważ jego autorzy bardzo się starają, aby był on zawsze w stu procentach binarnie kompatybilny. W przypadku innych bibliotek możemy oczywiście podać wersje zależności.

Listing 5.2: Przykład wersji

>=sys-apps/bar-1.2
=sys-apps/baz-1.0

Znaki >= i = oznaczają to, czego możemy się po nich spodziewać; wersja 1.2 lub nowsza programu sys-apps/bar będzie się nadawać (oznacza to, że również wersja 2.0 sys-apps/bar też będzie odpowiednia), zaś wersja 1.0 programu sys-apps/baz będzie jedyną odpowiednią. Więcej informacji na temat wzorca wersji pakietów można znaleźć wyżej w rozdziale Nazewnictwo plików ebuild.

Oto inne sposoby na podawanie wersji zależności:

Listing 5.3: Podawanie wersji zależności

~sys-apps/qux-1.0
=sys-apps/bla-1.2*
!sys-libs/gdbm

~sys-apps/qux-1.0 wybierze najnowszą rewizję programu qux-1.0 w Portage.

=sys-apps/bla-1.2* wybierze najnowsze wersje spośród gałęzi 1.2, ale zignoruje 1.3 i wcześniejsze/późniejsze gałęzie. Tak więc bla-1.2.3 i bla-1.2.0 będą odpowiednie, zaś bla-1.3.3, bla-1.3.0 i bla-1.1.0 już nie. Warto zauważyć, że bla-1.22.3 też pasuje do wzorca, co czasami może spowodować problemy.

!sys-libs/gdbm uniemożliwi instalację tego pakietu jeśli gdbm jest zainstalowane.

Ważne uwagi

Przy konfiguracji zmiennych DEPEND i RDEPEND można popełnić wiele błędów. Oto kilka porad, dzięki którym możemy ich uniknąć.

  • Zawsze należy podać kategorię.
    Na przykład powinniśmy napisać >=x11-libs/gtk+-2 zamiast tylko >=gtk+-2.
  • Nie powinniśmy stawiać znaku gwiazdki (*) przy zależnościach typu >=.
    Prawidłowo powinniśmy napisać >=x11-libs/gtk+-2 zamiast >=x11-libs/gtk+-2*.
  • Nie wolno definiować meta-pakietu jako zależności.
    Nie powinniśmy więc określić zależności od gnome-base/gnome, zamiast tego używamy konkretnej biblioteki, na przykład libgnome.
  • Podajemy jedną zależność na linię.
    Definiowanie więcej niż jednej zależności w jednej linii sprawia, że kod jest brzydki i trudny do zrozumienia.
  • GTK: Zawsze należy użyć zależności =x11-libs/gtk+-1.2* przy aplikacjach GTK+1.

Ponadto powinniśmy się upewnić, że podaliśmy wszystkie zależności naszego pakietu:

  • Zajrzyjmy do plików configure.in lub configure.ac
    Poszukajmy w nich sprawdzania obecności pakietów. Warto zwrócić uwagę na sprawdzenia pkg-config lub funkcje AM_*, które szukają konkretnej wersji.
  • Możemy przyjrzeć się dołączonym plikom .spec
    Zwykle dołączone pliki .spec mogą być źródłem informacji o zależnościach. Nie należy jednak traktować ich jako jedynego źródła.
  • Poszukajmy strony internetowej aplikacji/biblioteki
    Autor często sugeruje na oficjalnej stronie jakich zależności wymaga jego program.
  • Warto przeczytać pliki README i INSTALL dołączone do pakietu
    Zwykle zawierają one informacje przydatne przy budowaniu i instalowaniu pakietów.
  • Należy pamiętać o zależnościach innych niż binarne, takie jak pkg-config, programy do generowania dokumentacji, itd.
    Proces budowania zwykle wymaga zależności takich jak intltool, libtool, pkg-config, doxygen, scrollkeeper, gtk-doc itp. Upewnijmy się, że zostały one podane.

Aby zapoznać się z najnowszymi informacjami o atomach DEPEND, należy przeczytać 5 sekcję dokumentacji systemowej man: man 5 ebuild.

1.f. Testowanie i wdrożenie

Plik ChangeLog

Za każdym razem gdy uaktualniamy (lub piszemy nowy) skrypt ebuild, musimy także uaktualnić (lub utworzyć) jego Changelog. Plik skel.ChangeLog zawiera przykładową treść i może zostać potraktowany jako wzór.

Funkcją pliku Changelog jest udokumentowanie co zostało zrobione, czemu zostało to zrobione i kto tego dokonał. Dzięki temu zarówno deweloperzy jak i użytkownicy mogą w łatwy sposób prześledzić zmiany.

Changelog jest głównie przeznaczony dla użytkowników, należy więc pisać krótko, na temat i unikać zbędnych technicznych szczegółów.

Przechowywanie plików ebuild lokalnie

Aby możliwe było testowanie skryptów ebuild oraz poinformowanie Portage o ich istnieniu, musimy umieścić je w określonym katalogu. Portage używa w tym celu zmiennej PORTDIR_OVERLAY, definiowanej przez użytkownika w pliku /etc/make.conf. Powinniśmy użyć tej zmiennej aby podać katalog, w którym będziemy trzymać nasze ebuildy (może to być na przykład /usr/local/portage).

W katalogu tym należy używać tej samej struktury (i tych samych kategorii) co w katalogu /usr/portage.

Gdy używamy PORTDIR_OVERLAY nasze ebuildy pozostaną w systemie i będą wciąż rozpoznawane przez Portage nawet gdy wykonamy polecenie emerge sync.

Testowanie pakietów

Zastanówmy się w jaki sposób przetestować czy nasz pakiet działa. Czasem deweloperzy od razu dołączyli polecenia make test lub make check, które sprawdzą podstawowe funkcje pakietu. Jeśli tak, to uruchomienie env FEATURES=test ebuild bla-x.y.z.ebuild test wykona je. Jeśli polecenia te nie działają poprawnie, spróbujmy je naprawić (i wysłać łatki autorom programu).

Jeśli takich poleceń nie ma, należy rozważyć dodanie funkcji src_test do naszego skryptu ebuild. Jest ona wykonywana przed funkcją src_install i może być bardzo pomocna przy testowaniu działania programu na różnych architekturach. Deweloperzy innych architektur będą nam wdzięczni jeśli dodamy tę funkcję, dzięki czemu nie będą musieli zagłębiać się w funkcjonowanie pakietu.

Należy jednak pamiętać o ogólnej zasadzie działania plików ebuild. Funkcja src_test nie może być interaktywna. Jeśli wymaga ona innych pakietów, należy użyć flagi USE test w celu podania dodatkowych zależności kompilacji w zmiennej DEPEND. Weźmy też pod uwagę, że funkcje src_test nie są zalecane przy graficznych aplikacjach korzystających z X, ponieważ użytkownik korzystający z Portage niekoniecznie będzie miał możliwość uruchomienia ich.

Przydatne narzędzia testujące

Istnieje kilka przydatnych narzędzi, które pomogą nam w pisaniu i opiekowaniu się naszymi ebuildami.

Narzędzie Pakiet Opis
repoman sys-apps/portage Narzędzie tylko dla deweloperów, wspomagające funkcję checkin z CVS. Wykonuje ona wiele typowych zadań QA (zapewniania jakości) i upewnia się, że dodawane do CVS pliki nie uszkodzą drzewa Portage.
ccache dev-util/ccache Narzędzie to zachowuje przetworzone pliki robocze, aby znacznie przyspieszyć kompilację. Pamiętajmy, aby dodać ccache do zmiennej FEATURES w pliku /etc/make.conf!
sandboxshell app-shells/sandboxshell Uruchamia powłokę, która tworzy środowisko sandbox. Przydatne jeśli chcemy dostać się do tego samego środowiska, w którym Portage buduje pakiety, a także jeśli chcemy coś ręcznie debugować.
echangelog app-portage/gentoolkit-dev Może utworzyć nowy plik Changelog lub dodać wpis do już istniejącego pliku.

[ << ] [ < ] [ Powrót ] [ > ] [ >> ]


Drukuj

Pokaż całość

Zaktualizowano 1 października 2008

Podsumowanie: Ten rozdział opisuje system Portage w Gentoo, tworzenie nowych pakietów dla Gentoo, będąc jednocześnie standardem dla deweloperów. Dział ten jest wciąż rozwijany i zmieniany. W żadnym wypadku nie można go uznać za gotowy. Zawsze konsultujemy ten poradnik z dostępnymi w Portage (szczególnie ebuild(5)) stronami man oraz zasadami rozwoju Gentoo Linux.

Sven Vermeulen
Autor

Seemant Kulleen
Autor

Shyam Mani
Autor

Karl Trygve Kalleberg
Autor

Mike Frysinger
Autor

Alastair Tse
Autor

Paul De Vrieze
Autor

Nicholas D. Wolfwood
Autor

Marius Mauch
Autor

Daniel Black
Autor

Wernfried Haas
Autor

Chrissy Fullam
Autor

Daniel Robbins (Retired)
Autor

John P. Davis (Retired)
Autor

Tim Yamin (Retired)
Autor

Jorge Paulo (Retired)
Autor

Zack Gilburd (Retired)
Autor

Benny Chuang (Retired)
Autor

Erwin (Retired)
Autor

Jon Portnoy (Retired)
Autor

Carl Anderson (Retired)
Autor

Donny Davies (Retired)
Autor

Peter Gavin (Retired)
Autor

Dan Armak (Retired)
Autor

Owen Stampflee
Autor

Ciaran McCreesh (Retired)
Autor

Łukasz Damentko
Autor

Kuba Bożanowski
Tłumaczenie

Rafał Stolarski
Tłumaczenie

Tomasz Bukowski
Tłumaczenie

Jarosław Ogrodnik
Tłumaczenie

Waldemar Korłub
Tłumaczenie

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.