Nieocenioną zaletą licencji GPL oraz idei całego ruchu GNU jest rozpowszechnianie oprogramowania wraz z kodem źródłowym, a w praktyce jego dostępność. Mimo to wszelkie oprogramowanie wchodzące w skład każdej dystrybucji Linuksa dostarczane jest raczej w postaci pakietów binarnych. Większość początkujących użytkowników, a nawet i zaawansowanych rzadko korzysta z możliwości pogrzebania w źródłach programów, bo nie lubią, nie mają czasu, itp. W tym artykule nie skupimy się na samej kompilacji programów, tylko na ich poźniejszej instalacji.
Jedną z głównych części każdej dystrybucji jest system pakietów, jedni wolą RPMy, inni DEBy, a ci najmądrzejsi 😉 wybierają Slackowe TGZy. Ale każdy system zarządzania pakietami ma się nijak do oprogramowania instalowanego ze źródeł. Skoro ktoś wymyślił już tak pożyteczne rozwiązanie jakim są pakiety, to po co zaśmiecać sobie dysk i instalować pliki nie uwzględniając ich w naszej bazie pakietów. Jeżeli Makefile programu zawiera opcję uninstall, to później możemy jeszcze jako-tako program odinstalować. W innym przypadku … mamy problem. Prawdziwe kłopoty mogą się pojawic przy instalowaniu takich środowisk jak GNOME lub KDE. Oczywiście ludzie nie są głupi i wymyślili sposób na obejście tych niedogodności.
Załóżmy że chcemy skompilować sobie jakiś porgram i utworzyć z niego pakiet, który później zainstalujemy w systemie. Na instalacje mamy dwa „główne” sposoby:
- instalujemy program w specjalnie wydzielonym katalogu będący katalogiem root dla niego
- instalujemy program od razu w systemie, a później dodajemy odpowiednie informacje do naszej bazy pakietów
Przyjrzyjmy się po kolei obu metodom.
W pierwszym przypadku musimy tak pokierować „make install” aby do ścieżek wszystkich instalowanych plików i katalogów dodał nasz root-katalog, nazwijmy go /tmp/pkg-nasz_program. Tak więc instalator czyli make install (w większości przypadków, zdarzają się wyjątki, ale o nich później) zamiast instalować plik do /usr/bin/super_program powinien go zainstalować do /tmp/pkg-nasz_program/usr/bin/super_program. Jedyny problem to jak to zrobić? W pliku Makefile w katalogu ze źródłami programu jest cała konfiguracja wraz ze ścieżkami do odpowiednich katalogów, wystarczy je wszystkie pozmieniać … 😉 ale oczywiście na dłuższą metę jest to zbyt męczące. Przeważnie pliki Makefile na początku powinny zawierać coś takiego:
--cut-- prefix = /usr/local exec_prefix = ${prefix} bindir = ${exec_prefix}/bin sbindir = ${exec_prefix}/sbin libexecdir = ${exec_prefix}/libexec sysconfdir = ${prefix}/etc sharedstatedir = ${prefix}/com localstatedir = ${prefix}/var libdir = ${exec_prefix}/lib infodir = ${prefix}/info mandir = ${prefix}/man includedir = ${prefix}/include oldincludedir = /usr/include DESTDIR = --cut--
Wszystkie zmienne odpowiadają za zainstalowanie poszczególnych plików w odpowiednich miejscach. Ostatnia zmienna DESTDIR służy właśnie do zmiany katalogu głównego podczas instalacji programu. Jak już skompilowaliśmy program możemy go zainstalować poleceniem
make DESTDIR=/tmp/pkg-nasz_program install
I ot, cała filozofia instalacji. Później tworzymy odpowiedniego spec-a lub odpowiednik. W najlepszej sytuacji są użytkownicy Slackware, gdyż wystarczy wydać polecenie:
# cd /tmp/pkg-nasz_program && makepkg ../nasz_program.tgz && installpkg ../nasz_program.tgz
Ale co będzie jeżeli w Makefile nie znajdziemy „DESTDIR” ? To wtedy musimy popróbować z innymi zmiennymi jak „prefix”, „libdir”, … wymienionymi w Makefile.
Do niektórych programów autorzy dostarczają tzw. spec-e służące do budowania pakietów dla dystrybucji opartych o RPM. Jeżeli nie wiemy co zrobić, aby zmienić katalog instalacyjny programu wystarczy że zajrzymy do takiego spec-a (np. cat nasz_program.spec) i w sekcji „%install” poszukamy linijki wyglądającej jak ta:
--cut-- make coś=tam i_jezszcze=coś_tam install --cut--
To właśnie polecenie służy do instalacji programu w innym katalogu, niż został podany podczas kompilacji. Oczywiście oprócz RPM-owych spec-ów możemy poszukać innych plików odpowiedzialnych za tworzenie pakietów dla konkretnych dystrybucji. Zasada jest prosta: po co mamy robić to sami, skoro ktoś już to zrobił za nas ;).
Ale zawsze możemy trafić na jakiś „nienormalny” pakiet. I ża nic nie da się zmienić katalogu instalacyjnego. I tutaj dochodzimy do drugiej metody, czyli instalujemy nasz_program bezpośrednio w systemie, a potem szukamy co, jak i gdzie zostało zainstalowane. Oczywiście nie zawsze jesteśmy gotowi na poświęcenie się i ręczne przeszukiwanie wszystkich katalogów w systemie aby odnaleźć wszystkie nowe/skasowane pliki ;). Przydał by się jakiś program, który zaloguje wszystkie zmiany dokonane przez make install. Oczywiście taki program już istnieje ;), no bo po co bym pisał ten artykuł ;)). Ten porgram to InstallWatch, pobrać możemy go ze strony http://mayams.net/~izto/installwatch.html. Najnowasza wersja to 0.5.6.
Po pobraniu pliku http://mayams.net/~izto/installwatch-0.5.6.tgz rozpakowujemy go do katalogu /usr/src. Standardowo program instaluje się do katalogu /usr/local, jeżeli chcemy zainstalować go do innego, np. /usr, to musimy zmienić zmienną PREFIX w Makefile. Program kompilujemy poleceniem make. Jeżeli chcemy zainstalować go do innego katalogu niż określony zmienną PREFIX, to wydajemy polecenie make PREFIX=/tmp/pkg-installwatch/STARY_PREFIX install (patrz punkt a) ). Po zainstalowaniu programu możemy przystąpić już do jego używania. InstallWatch-a uruchamiamy poleceniem:
installwatch [-o plik_z_logiem] polecenie
Polecenie jest to program, którego wywaołania systemowe IstallWatch ma zapisać. Standardowym przykładem użycia InstallWatch-a jest polecenie:
installwatch make install
Po wydaniu go w katalogu ze źródłami naszego_programu InstallWatch za pomocą sysloga zaloguje wszystkie zmiany dokonane na naszym dysku przez make install. Jednak czytanie tych informacji z logów systemowych nie jest wygodne, lepiej zalogować wszystko do jednego pliku, możemy zrobić to poleceniem:
installwatch -o nasz_program.iw make install
Teraz wszystkie informacje przechwycone przez InstallWatch-a znajdziemy w pliku nasz_program.iw. Jak się okazuje logi tworzone przez InstallWatch-a nie są zby przyjazne dla użytkownika, ich analiza też raczej nie przyspoży nam przyjemnych uczuć.
Skoro wiemy co zostało zmienione i mamy zapisane to w jednym pliku, to możemy pokusić się o napisanie programu/skryptu który przeanalizuje ten plik i utworzy odpowiedni pakiet dla naszego systemu. Oczywiście takie narzędzia też już istnieją ;), wraz z programem dostarczany jest skrypt inst2rpm, który tworzy odpowiednie pakiety RPM w oparciu o logi InatallWatch-a. Na stronie programu znajdziemu również program CheckInstall, który potrafi tworzyć pakiety Slackware oraz RPM. Trzecim programem (a właściwie skryptem) jest InstallWatch FrontEnd (iwfe) mojego autorstwa ;). Napisałem go gdyż SPASM (inny program do tworzenia pakietów na podstawie logów InstallWatch-a) posiadał zbyt skromne mozliwości ;). Jak na razie iwfe działa dość dobrze, jego podstawowym zadaniem jest utworzenie nieskompresowanej kopii pakietu w katalogu /tmp/package-NAZWA_PAKIETU. Opcjonalnie możemy utworzyć gotowy pakiet dla dystrybucji Slackware lub dodać program do bazy pakietów Slackware. Jeżeli nie potrzebujemy rozpakowanej wersji pakietu, to możemy nakazać iwfe dodać pakiet do bazy lub utworzyć pakiet i skasować /tmp/package-NAZWA_PAKIETU. Iwfe znjdziemy na stronie http://linux.sky.pl/maciek/iwfe-0.06.tgz.
Wszystkie opisywane tu programu (bez iwfe) znajdziemy w serwise Freshmeat.net.
Archiwalny news dodany przez użytkownika: maciekk.
Kliknij tutaj by zobaczyć archiwalne komentarze.