Monday, May 21, 2007

Kilka słów o instalowaniu ze źródeł

Czasami naprawdę trzeba zainstalować coś ze źródeł. Po prostu nie ma naszego kochanego programu w żadnym repozytorium i nie pozostaje nam nic innego. Jest kilka rzeczy, które mogą nam pomóc, jeżeli wcześniej zwrócimy na nie uwagę.

Źródła rozpakowuje się zazwyczaj:
tar -xf nasz-program-10.tar.gz
a czasami jeżeli spakowane są bz2
bunzip2 nasz-program.tar.gz.bz2
tar -xf nasz-program-10.tar.gz
Po wypakowaniu źródeł zazwyczaj powstaje katalog nasz-program. Po wejściu do niego koniecznie przeczytaj pliki INSTALL i README. To bardzo dużo ułatwia. Często programy używają innych bibliotek, które ktoś już opracował i na ich podstawie budują swoją funkcjonalność. Zamiast denerwować się, że coś się nie kompiluje sprawdź najpierw te dwa pliki (jak są inne wyglądające podejrzanie, których nazwy napisane są wielkimi literami też je sprawdź). Użyteczna przydaje się komenda:
vim INSTALL README -p
która otwiera nam nasze pliki w zakładkach, po których możemy poruszać się [gt] (jak go tab). Przeczesz stronę internetową, FAQ, manual, dokumentację (część z instalacją), aby zanim wykonasz pierwszy krok być pewnym, że w systemie jest już wszystko co jest niezbędne do działania tej aplikacji. Warto jest jeszcze zweryfikować czego możemy od programu oczekiwać, z jakimi opcjami kompiluje się domyślnie, jakich brakuje. Po lekturze ./configure --help | less lektura tego help-a jest niezbędna aby dopasować funkcjonalnośc programu (co ma obsługiwać co nie, jakich bibliotek się spodziewać jakich nie, czy ma korzystać z ALSA czy z JACKa itd...) Oczywiście możesz próbować robić podchody w stylu:
updateos -i brakująca-biblioteka
a jak nie znajdzie:
updateos -f brakująca-biblioteka
Czasami jednak trzeba wpisać nazwę biblioteki w googlach, z dodatkiem home page,albo bez i ściągnąć ją i kompilować ze źródeł. Po katalogu ze źródłami warto się jeszcze rozejrzeć po plikach konfiguracyjnych aplikacji, themah i innych gadżetach (pliki konfiguracyjne, themy i skróty klawiszowe znalazłem na przykład w źródłach MOCa). Później zaczynamy ./configure (będąc w katalogu ze źródłami). Programik sprawdza sobie biblioteki dostępne w systemie i patrzy czy są te przez niego wymagane. Jeżeli instalowałeś jakieś biblioteki do systemu (potrzebne do aplikacji) to aby system je "zobaczył", czy łyknął warto dla pewności po ich instalacji, a przed kompilacją źródeł programu wydać polecenie ldconfig. Configure może czegoś nie znaleść. niektóre biblioteki jeżeli nie zostaną znalezione nie spowodują błędu. Program je po prostu pominie, kosztem mniejszej funkcjonalności programu. Aby dowiedzieć się co dokładnie w trawie piszczy możemy wydać polecenie ./configure --help | less i z bliska przyjrzeć się co możemy sobie w programie "włączyć" lub wyłączyć. Często bywa tak że configure albo make generuje jakieś błędy przy jakiejś nazwie. Po przejrzeniu
./configure --help | less widzimy gdzieś tą nazwę a obok nie coś w stylu --disable-to_cos_co_nas_nie_lubi albo --to_cos_co_nas_nie_lubi=no albo --to_cos_...=disable. Wydanie polecenia ./configure --disable-cos. Spowoduje, że do programu nie zostanie włączona obsługa tego czegoś, nie zostanie to wogóle wzięte pod uwagę, program skompiluje się z mniejszą funkcjonalnością, ale w 90% przypadków w ogóle tego nie odczujemy :) bo programy pisane są tak, że jedną rzecz robią na 10 różnych sposobów i jak nie jednym to drugim. Często aby program skompilować pod nasze potrzeby albo pod nasz system piszemy spory tasiemiec: ./configure --disbale-options --enable-gtk --disable-qt [...] --prefix=/usr. No właśnie opcja prefix powoduje, że przed każdym katalogiem do którego będzie kopiowany plik (przed jego nazwą) dopisywane jest /usr. Co to znaczy ? Domyślnie prefix ustawiony jest na /usr/local (chyba, że w programie albo INSTALL albo README albo gdzie indziej jest napisane inaczej). I jak będziesz miał binarki tego progamu to znajdą się one w /usr/local/bin, zasoby w /usr/local/share. Mi to nawet pasuje i wszystko co nie pochodzi z systemu ładuję właśnie tam, wiem przynajmniej gdzie szukać plików w /usr/local. Jednak możesz chcieć władować to do /usr (bin, share itd...). Wtedy dajesz --prefix=/usr i wsio. Po ./configure kiedy system wie co jest i czego nie ma a dzięki temu wie jak skompilowac program tak aby się skompilował robimy polecenie make. To jest kompilacja źródeł. Czasami dopiero tutaj okazuje się, że biblioteki są w złej wersji albo coś nie działa. Możemy znowu instalować biblioteki, aktualizować je albo brutalnie wycinać przez przełączniki przy ./configure. Kiedy make już przejdzie mamy dwie opcje. Albo pokopiować pliki, które właśnie się utworzyły do systemu na łyso przez make install, albo zrobić paczkę. Make install wymaga uprawnień dostępu do katalogów systemowych a więc tu, należy wydać polecenie su i dopiero make install. Pokopiuje on pliki do katalogów i wsio. Wszystkie poprzednie czynności należy wykonywać z uprawnieniami zwykłego użytkownika ponieważ gdyby w kodzie źródłowym był jakiś wirus zadziała on z bardzo ograniczonymi uprawnieniami a nie uprawnieniami superużytkownika. make install ma pewną wadę - otóż, nie działa On jak paczka. Dzisiaj Linuxy mają swój system paczek. Make install nic nikomu nie mówi, gdzie i czy coś skopiowało. Tylko ono wie, że coś się działo. Jedynym sposobem aby potem odinstalować taki program jest zachować sobie katalog, w którym wszystko kompilujemy i w momencie chęci odinstalowania wejść do niego i wydać polecenie Jednak jeżeli katalog ten skasujemy czeka nas ponowna kompilacja z poprzednio ustawionymi flagami i po kolejnym zainstlowaniu do czasu kiedy jeszcze istnieją źródła wydanie natychmiast po tym komendy make uninstall. Jednak istnieje narzędzie checkinstall które pozwala robić paczki. W Kasi paczuszkę slackową (czyli nawet dość pasującą do naszych potrzeb) możemy zrobić wykonując zamiast make install checkinstall -S. Jeżeli nie chcemy być pytani o drobiazgi, i robimy paczkę tylko na chwilkę, aby ją zainstalować możemy kazać programowi stworzyć podstawową dokumentację i odpowiedzieć na pytania twierdząco poprzez checkinstall -S --nodoc -y. Po tym zabiegu powstanie ładna paczuszka tgz, która po pkg -i nasz-program.tgz zarejestruje się w systemie i pozwoli ładnie usunąć przez pkg -r nasz-program, a my źródła kompilacji będziemy mogli wyrzucić do kosza. Ma to jeszcze jeden plus. Możemy za w czasu podejrzeć paczuszkę i sprawdzić gdzie po kopiują się nam pliki i w razie czego prze konfigurować i skompilować ponownie program z innym, bardziej odpowiadającym nam prefiksem. Jeżeli dużo mieszamy ze źródłami, przerwaliśmy make-a bo zapomnieliśmy o dodanie do configure jakiś drobiazgów i przy tym zaczynają się dziać jakieś niespodziewane rzeczy, błędy możemy wyczyścić wszystko co do tej pory pozostawiło po kompilacji swoje pozostałości przez wydanie polecenie make clean co spowoduje, że zaczniemy kompilację od zera.

Jeżeli chcesz wyjść do sklepu i mieć po powrocie działający programik w systemie możesz łączyć polecenia w sprytne łańcuszki. na przykład:
./configure && make && checkinstall -S --nodoc -y && pkg -i nasza-paczka.tgz


Wracasz do domu, terminal zaśmiecony :) ale programik działa :P (o ile po drodze nie wyskoczył żaden błąd).

Powodzenia i miłego kompilowania programów !

No comments: