Normalnie, programy instalują się same 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żytkownika)
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 sekcji 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)
. Oznacza to, że źródła
programu zawierają plik Makefile.am i/lub Makefile.in i że 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, a dane będą pochodzić z 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 zwracasz 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.
Zauważ również, że nie ma tu wystarczającego miejsca, aby opisać wszystkie szczegóły na temat poprawiania zewnętrznych źródeł. Przedstawiamy tu jedynie kilka problemów, na które ludzie często się natykają.
Wiekszość programów posiada swój własny sposób instalowania się w istniejącej strukturze katalogów Twojego systemu. Ścieżki do ich plików binarnych trafiają do katalogów w Twojej zmiennej środowiskowej $PATH, zaś dokumentacja do programu i strony podręcznika są umieszczane w powszechnie stosowanych miejscach. Jednakże, jeśli pozwolisz na takie działanie, to program może się zainstalować w każdym miejscu Twojego 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ć Twoją paczkę, 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/tmp
lub 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" takie ścieżki jak /home/ja/deb/gentoo-0.9.12/usr/share/gentoo.
Sprawa jest zupełnie 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 programu autoconfa, to dh_make ustawi odpowiednie komendy tak, żeby wszystko zostało zrobione automatycznie. W takich przypadkach możesz nawet ominąć dalsze czytanie tej sekcji. 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.
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? ICONS = /usr/local/share/gentoo
Widzimy, że pliki te zostaną zainstalowane wewnątrz katalogu
/usr/local
. Zmieńmy zatem ścieżki na następujące:
# Where to put binary on 'make install'? BIN = $(DESTDIR)/usr/bin # Where to put icons on '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 do katalogu /usr/share/doc/debian-policy/fhs/). Polecam 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 ja 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 położeń. Ale gdzie i czego właściwie szukać? Możesz to odnaleźć wydając polecenie:
grep -rn usr/local/lib *.[ch]
Program grep przeszuka rekursywnie całe drzewo ze źródłami i wypisze dla Ciebie nazwy plików i numery linii w nich, gdy odnajdzie szukany wzorzec. Teraz wyedytuj te pliki, w odnalezionych liniach zastąp ciąg /usr/local/* ciągiem usr/* i to już wszystko. Zrób to bardzo ostrożnie, aby nie zepsuć pozostałej części kodu! :-)
Następnie powinieneś/powinnaś odnaleźć w pliku Makefile cel `install' (szukając linii rozpoczynającej się od ciągu "install:') i zmienić nazwę wszystkich odniesień 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
Pewnie zauważyłeś/zauważyłaś, że teraz przed pozostałymi komendami 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 zainstalujemy program do Twojego własnego, pustego (lub nawet nie istniejącego) katalogu, to będziemy musieli stworzyć każdy z tych katalogów.
Możemy również dodać inne rzeczy na końcu tej reguły, na przykład dodatkową dokumentację, 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 zmieniłem `gentoo' na `gentoo-target' w linii rozpoczynającej się od ciągu `install:'. To jest tzw. naprawa błędu :-)
Ilekroć dokonasz zmian, które nie są ściśle związane z pakietem Debiana, upewnij się, że poinformowałeś o nich autora programu, aby mógł on je włączyć do następnej poprawki 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, na których działają. Dla przykładu, plik Makefile może zawierać odwołania do biblioteki, której nie ma Debianie. W takim przypadku musimy zmienić ją na bibliotekę, która jest dostępna pod Debianem 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 prawdopodobnie 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 współdzielonej libcurses.so, ale nie mógł on wymyślić niczego lepszego. Sugestie będą bardzo mile widziane :-))
Podręcznik dla nowych opiekunów pakietów Debiana
wersja oryginału: 1.2, 6 kwietnia 2002. wersja tłumaczenia: 1.2.2, 17 marca 2004joy-mg@debian.org
ptecza@debianusers.pl
porridge@debian.org