[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ dalej ]
Normalnie programy instalują się w podkatalogach katalogu /usr/local. Pakiety
Debiana nie mogą jednak używać tego katalogu, gdyż jest on zarezerwowany do
prywatnego użycia przez administratora (lub użytkowników) systemu. Oznacza to,
że musisz się przyjrzeć, jak budowany jest Twój program, zwykle za pomocą pliku
Makefile. Jest to skrypt programu make(1)
używanego do
automatycznego budowania programu. Więcej szczegółów na temat plików Makefile
znajdziesz w rozdziale Plik `rules', Rozdział
4.4.
Zwróć też uwagę na to, czy Twój program używa programów GNU
automake(1)
i/lub autoconf(1)
, czyli czy źródła
programu zawierają plik Makefile.am i/lub Makefile.in, to je będziesz musiał
wtedy modyfikować. Dzieje się tak, ponieważ każde wywołanie programu automake
powoduje ponowne utworzenie pliku Makefile.in z informacjami wygenerowanymi z
pliku Makefile.am. Także każde wywołanie skryptu ./configure zrobi to samo z
plikiem Makefile, na podstawie pliku Makefile.in. Edycja plików Makefile.am
wymaga pewnej wiedzy na temat programu automake, możesz o nim poczytać za
pomocą komendy `info automake'. Edytowanie plików Makefile.in odbywa się
niemal tak samo, jak w przypadku plików Makefile, po prostu trzeba zwracać
uwagę na zmienne, tzn. wszystkie łańcuchy otoczone przez znaki `@', dla
przykładu zmienna @CFLAGS@ lub @LN_S@ będzie zastępowana odpowiednią wartością
przy każdym wywołaniu skryptu ./configure. Przeczytaj dokumentację
/usr/share/doc/autotools-dev/README.Debian.gz
, zanim zaczniesz
modyfikacje.
Zauważ również, że nie ma tu wystarczającego miejsca, aby opisać wszystkie szczegóły na temat poprawiania zewnętrznych źródeł. Przedstawiam tu jedynie kilka problemów, z którymi często można się spotkać.
Wiekszość programów posiada swój własny sposób instalowania się w istniejącej strukturze katalogów systemu. Binaria trafiają do katalogów określonych zmienną środowiskową $PATH, zaś dokumentacja i strony podręcznika są umieszczane w zwykle stosowanych miejscach. Jednakże, jeśli pozwolisz na takie działanie, program może się zainstalować w każdym miejscu systemu. Może sprawić to problemy narzędziom do obsługi pakietów, gdyż nie będą one wiedziały, które pliki należą do Twojej paczki, a które nie.
Zatem musisz zrobić coś innego: zainstalować swój program w tymczasowym katalogu, z którego narzędzia opiekuna zbudują działający pakiet .deb. Wszystko co zawiera ten katalog, zostanie zainstalowane w systemie użytkowników, gdy zdecydują się oni zainstalować Twój pakiet, z tą tylko różnicą, że program dpkg zainstaluje pliki względem katalogu głównego systemu.
Ten tymczasowy katalog jest zazwyczaj tworzony wewnątrz Twojego katalogu
debian/ w rozpakowanym drzewie ze źródłami. Na ogół ma on nazwę
debian/nazwa_pakietu
.
Pamiętaj, że nie wystarczy, żeby program zachowywał się poprawnie, gdy zostanie on zainstalowany się w katalogu debian/nazwa_pakietu. Musi on zachowywać się właściwie także, gdy zostanie umieszczony w głównym katalogu systemu. Zatem nie wolno pozwolić, żeby w plikach pakietu zostały "zaszyte" pełne ścieżki, np. /home/ja/deb/gentoo-0.9.12/usr/share/gentoo.
Sprawa jest prosta, gdy programy używają narzędzia GNU autoconf. Większość z nich posiada pliki Makefile, które domyślnie są ustawione w taki sposób, aby zezwalać na instalację w dowolnym podkatalogu zakładając, że katalog /usr (dla przykładu) jest kanonicznym prefiksem. Gdy zostanie wykryte, że Twój program używa autoconfa, to dh_make ustawi odpowiednie polecenia tak, żeby wszystko zostało zrobione automatycznie. W takich przypadkach możesz nawet ominąć dalsze czytanie tej sekcji. Jednak z innymi programami będziesz miał więcej pracy i prawdopodobnie będziesz musiał przejrzeć i wyedytować pliki Makefile.
Poniżej znajduje się odpowiednia część pliku Makefile programu gentoo:
# Katalog binariów dla 'make install' BIN = /usr/local/bin # Katalog ikon dla 'make install' ICONS = /usr/local/share/gentoo
Widzimy, że pliki te zostaną zainstalowane w katalogu /usr/local
.
Zmieńmy zatem ścieżki na następujące:
# Katalog binariów dla 'make install' BIN = $(DESTDIR)/usr/bin # Katalog ikon dla 'make install' ICONS = $(DESTDIR)/usr/share/gentoo
Ale dlaczego właśnie w tym katalogu, a nie w jakimś innym? Ponieważ pakiety
Debiana nigdy nie instalują plików w katalogu /usr/local
. Ten
katalog jest zarezerwowany na potrzeby administratora systemu. W systemie
Debian zaś takie pliki trafiają do katalogu /usr
.
Dokładniejsze informacje na temat położenia binariów, ikon, dokumentacji itd. są opisane w dokumencie Filesystem Hierarchy Standard (zobacz w katalogu /usr/share/doc/debian-policy/fhs/). Polecamy Ci przejrzenie tego dokumentu i przeczytanie tych sekcji, które mogą dotyczyć Twojego pakietu.
Zatem powinniśmy instalować pliki binarne w katalogu /usr/bin, a nie w /usr/local/bin, strony podręcznika w katalogu /usr/share/man/man1, a nie w /usr/local/man/man1 itd. Zauważ, że w pliku Makefile programu gentoo nie wspomniano o jego stronie podręcznika, ale ponieważ Polityka Debiana wymaga, żeby każdy program posiadał taką stronę, to stworzymy ją później i zainstalujemy w katalogu /usr/share/man/man1.
Niektóre programy nie używają zmiennych w plikach Makefile do definiowania ścieżek, takich jak te powyżej. Oznacza to, że będziesz musiał wyedytować niektóre źródła napisane w języku C i tak je poprawić, aby używały właściwych katalogów. Ale gdzie i czego właściwie szukać? Możesz to odnaleźć wydając polecenie:
grep -nr -e 'usr/local/lib' --include='*.[c|h]' .
Program grep przeszuka rekursywnie całe drzewo ze źródłami i wypisze nazwy plików i numery linii, gdy odnajdzie szukany wzorzec.
Wyedytuj te pliki i w odnalezionych liniach zastąp ciąg /usr/local/* ciągiem usr/* — i to już wszystko. Zrób to uważnie, aby nie zepsuć pozostałej części kodu! :-)
Następnie powinieneś odnaleźć w pliku Makefile cel `install' (szukaj linii rozpoczynającej się od ciągu "install:') i zmienić wszystkie odniesienia do katalogów innych, niż te zdefiniowane na początku pliku Makefile. Przed zmianą, cel `install' programu gentoo był następujący:
install: gentoo install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Po wykonaniu zmian wygląda on następująco:
install: gentoo-target install -d $(BIN) $(ICONS) $(DESTDIR)/etc install ./gentoo $(BIN) install -m644 icons/* $(ICONS) install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
Na pewno zauważyłeś, że teraz przed pozostałymi poleceniami w tej regule będzie wykonywana komenda install -d. Oryginalny plik Makefile nie miał jej, gdyż zwykle katalog /usr/local/bin i inne katalogi istnieją już w systemie, zanim wyda się polecenie `make install`. Jednakże, gdy instalujemy program do własnego, pustego (lub nawet nie istniejącego) katalogu, to będziemy musieli utworzyć każdy z tych katalogów.
Możemy również dodać inne rzeczy na końcu tej reguły, na przykład instalację dodatkowej dokumentacji, którą autor programu czasem pomija:
install -d $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
Uważny czytelnik zauważy, że zmieniliśmy `gentoo' na `gentoo-target' w linii rozpoczynającej się od ciągu `install:'. To jest tzw. poprawka niedotycząca (unrelated bug fix) :-)
Ilekroć dokonasz zmian, które nie są ściśle związane z pakietem Debiana, poinformuj o nich opiekuna zewnętrznego, aby mógł on je włączyć do następnej wersji programu i by również ktoś inny mógł z nich skorzystać. Pamiętaj także, żeby tworzyć poprawki nie specyficzne dla Debiana, Linuksa (lub nawet Uniksa!) przed ich wysłaniem — niech będą one przenośne. Dzięki temu Twoje łaty będzie łatwiej nałożyć.
Zauważ, że nie musisz wysyłać autorowi programu plików debian/*.
Tutaj mamy pewien dość powszechny problem: biblioteki często różnią się pomiędzy platformami. Dla przykładu, plik Makefile może zawierać odwołania do biblioteki, której nie ma Debianie. W takim przypadku musimy zamienić ją na bibliotekę, która jest dostępna w Debianie i służy tym samym celom.
Jeśli zatem w pliku Makefile (lub Makefile.in) Twojego programu istnieje linia podobna do tej poniżej (i Twój program nie chce się skompilować):
LIBS = -lcurses -lcoś -lcoś_innego
to zmień ją w pokazany sposób i to powinno pomóc:
LIBS = -lncurses -lcoś -lcoś_innego
(Autor zdaje sobie sprawę, że to nie jest najlepszy przykład, zważywszy na to, że pakiet libncurses jest teraz dostarczany wraz z dowiązaniem symbolicznym do biblioteki libcurses.so, ale nie mógł wymyślić niczego lepszego. Sugestie będą bardzo mile widziane :-)
[ powrót ] [ Spis treści ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ A ] [ dalej ]
Podręcznik dla nowych opiekunów pakietów Debiana
wersja oryginału: 1.2.11, 12-01-2007, wersja tłumaczenia: 1.2.5, 27-09-2007joy-mg@debian.org
ptecza@debianusers.pl
porridge@debian.org
wojtekz@comp.waw.pl