[ << ]
[ < ]
[ 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 ]
[ > ]
[ >> ]
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|
|