petak, 19 aprila, 2024
Sam svoj majstor

Instaliranje programa iz izvornog koda

Autori: Nikola Hardi i Stefan Nožinić

O problemu

Slobodan softver stiže do računara krajnjih korisnika u raznim oblicima. Danas su najpopularnije tzv. „binarne” distribucije (eng. binary based distribution) koje se baziraju na sistemu paketa u riznicama, a svaki paket sadrži programe koji su već prevedeni u izvršni oblik (eng. executable) i uvezani (eng. linked) sa odgovarajućim verzijama deljenih biblioteka. Odgovarajuće verzije tih biblioteka su takođe dostupne u nekim drugim paketima. O ovome možete detaljno da pročitate u 34. broju časopisa.

Drugi način za dobavljanje novog softvera je preuzimanje koda. Postoje distribucije koje su bazirane na izvornom kodu (eng. source based distribution) kao što su Slekver (eng. Slackware) i Džentu (eng. Gentoo). Paket menadžeri takvih distribucija preuzimaju izvorni kod softvera i izvorne kodove njegovih zavisnosti, prevode ih i tek potom premeštaju na potrebne lokacije (instaliranje). Obe varijante imaju i svoje prednosti i svoje mane.

Prednost binarnih distribucija je što zahtevaju manje procesorskih resurasa jer nema potrebe za prevođenjem programa pri instalaciji. Mana je manjak fleksibilnosti pri instalaciji jer je program dostupan samo u onom obliku u kojem je pripremljen.

Distribucije bazirane na izvornom kodu prevazilaze taj problem, ali unose dodatno vreme i upotrebu procesora pri instalaciji (i svakoj nadogradnji!) svakog paketa. Distribucije bazirane na izvornom kodu nisu tema ovog članka jer je u tom slučaju proces prevođenja automatizovan. Tema ovog članka je kako preuzeti kod programa koji inače nije moguće instalirati standardnim putem ili kada želimo da napravimo neku izmenu u njemu (eng. patch). Glavna tema je softver koji je tipično pisan u programskim jezicima C i C++.

Kod jednostavnijih projekata koji se sastoje od svega nekoliko datoteka problem prevođenja je trivijalan. Postoji jasna polazna tačka (eng. main entry point) a skup zavisnosti je minimalan. Problem se javlja kada se projekat sastoji iz velikog broja datoteka i oslanja se na veliki broj biblioteka koje moraju biti prisutne u trenutku prevođenja. Problem postaje još složeniji kada želimo da izmenimo neke pretpostavke kao što su podrazumevana lokacija za traženje biblioteka, izbor prevodioca ili isključivanje nekih delova koda.

Problem je drugačiji kod nekih drugih operativnih sistema i programskih jezika. Na linuksu i drugim juniksolikim sistemima je situacija takva da se programi oslanjaju na skup deljenih biblioteka (eng. shared libraries). Na nekim drugim platformama su biblioteke ili statički uvezane (deo su samog programa), ili se distribuiraju zajedno sa programom. U oba slučaja pri prevođenju su zaglavlja (eng. headers) svakako neophodna. Pajton i Pip (eng. Pip) upravnici paketa mogu to sami da razreše, APT takođe. Ukoliko želimo da instaliramo program koji nije dostupan u našoj distribuciji, problem se malo drugačije rešava.

Na početku je napomenuto da su jezici u kojima su ovi projekti pisani uglavnom C i C++. Za projekte pisane u Pajtonu postoji specifičan i jednostavan način prevođenja i takav projekat je najčešće dostupan u riznicama upravnika paketa Pip. Za Javaskript postoji npm kao i slični upravnici za projekte u ostalim jezicima. Upotreba ovih specifičnih upravnika za ove jezike je veoma jednostavna, razrešavanje zavisnosti ide automatski pa ih nećemo ovde opisivati.

Evolucija alata

Na početku je problem donekle rešavan tzv. bild skriptama (eng. build script) koji su do određene mere mogle da automatizuju proces prevođenja. Pojavio se šablon i pojavila se potreba za novim alatom. Tako je nastao jezik za specifičnu namenu (eng. domain specific language, dsl) pod nazivom M4. M4 je zapravo skraćenica od reči Makro, po principu početnog slova i broja slova koje slede. M i još četiri slova. M4 se koristi za pisanje mejkfajlova (eng. makefile) i dan-danas.

Iako je M4 pomogao u automatizaciji, on nije mogao da pomogne u problemu portabilnosti. Proces prevođenja nije potpuno isti na Linuksu i na BSD-u ili Solarisu. Zbog toga su kao pomoćni alat nastale skripte za konfiguraciju (eng. config). Njihov posao je da otkriju u kakvom okruženju se trenutno nalaze, koji prevodilac je dostupan, da li su sve zavisnosti zadovoljene itd. Kao rezultat skripte za konfiguraciju je jedan mejkfajl koji je validan za trenutnu platformu. Pored navedenih mogućnosti, skripte za konfiguraciju su i dan-danas način za fino podešavanje programa pri prevođenju. Naprimer, možete da prevedete plejer bez podrške za grafičko okruženje ili uređivač teksta bez mogućnosti za isticanje sintakse. To je mehanizam koji distribucije zasnovane na izvornom kodu koriste za fino podešavanje paketa. Pošto je i u procesu pisanja skripti za konfiguraciju primećen izvestan šablon, uspostavljen je određeni standard i napravljen je skup alata. Pisanje skripte za konfiguraciju nije nimalo jednostavan zadatak. To su alati koji se usavršavaju već više od dvadeset godina. Jedan takav alat je Gnuov sistem za prevođenje (eng. GNU build system) poznat kao Autotools. Drugi je znatno mlađi (desetak godina) i u nekim principima drugačiji sistem – Si-Mejk (eng. CMake). Oba sistema imaju istu namenu: na osnovu određenih podešavanja proizvesti ispravan mejkfajl na bilo kojoj od podržanih platformi, uz prepoznavanje dostupnog prevodioca, proveru zavisnosti i podršku za fino podešavanje mogućnosti. Ovo je, naravno, samo grub opis. Mejkfajlovi mogu da se koriste za različite namene (pokretanje procesa generisanja dokumentacije ili testiranja), a danas ne moraju da budu ni u M4 jeziku – postoje i drugi bild sistemi, naprimer Nindža (eng. Ninja). U ovom članku ćemo se baviti samo problemom upotrebe ovih sistema od strane korisnika, ne programera. Priprema projekta tako da koristi neki od ovih sistema je tema za neki drugi članak.

Gnuov sistem za prevođenje

Gnuov sistem za prevođenje je nešto stariji skup alata. Važi za složenu mašineriju. Može se reći da je najzastupljeniji, barem kada je reč o C i C++ projektima. Iako je prilično složen za postavljanje, jednostavan je za upotrebu. Sastoji se uglavnom od tri koraka:

  1. pokrenuti skriptu za konfiguraciju;
  2. pokrenuti prevođenje;
  3. pokrenuti instalaciju.

Ovo se obično sastoji iz tri komande koje se redom izvršavaju:

./configure make make install

Različiti parametri se mogu postaviti pri izvršavanju skripte za konfiguraciju, a za više detalja o datim parametrima dovoljno je izvršiti komandu za dobijanje pomoćne dokumentacije:

./configure --help

sourceSi-Mejk

Priča kaže da je Si-Mejk skraćenica od kolor mejk (eng. „colour make” – mejk u boji). To i jeste najočiglednija razlika za jednog korisnika. Tokom procesa prevođenja izveštaji su u boji, a trenutni napredak je izražen u procentima umesto kriptičnim dugim linijama koje predstavljaju zapisnik o izvršenim komandama. I Si-Mejk rešava problem otkrivanja okruženja, proveru zavisnosti i fino podešavanje zastavicama (eng. flags). Način je malo drugačiji, skripte za konfiguraciju su u jeziku napravljenom specifično za ovaj alat, umesto klasičnih beš (eng. bash) skripti. Rezultat može da bude M4 ili Nindža mejkfajl. Najčešće je to baš M4 koji se standardno pokreće komandom make. Proces se sastoji od sledećih koraka:

cmake . make make install

Razrešavanje zavisnosti

Ovde nije reč o „onim zavisnostima”. Zavisnost je u ovom kontekstu biblioteka na koju se željeni program oslanja. Najčešće je ta biblioteka potrebna u obliku deljene biblioteke (eng. shared library) sa .so ekstenzijom. Takva zavisnost se naziva i zavisnošću potrebnom za pokretanje programa (eng. runtime dependency). Takav oblik je neophodan za pokretanje programa, ali nije dovoljan za prevođenje. Za prevođenje su potrebna i zaglavlja.

Spisak zavisnosti može da se otkrije na mnogo načina. Neki su manje a neki više mučni. Ovo je nekada davno bila glavna muka korisnika linuksa, u vreme kada upravnici paketima nisu postojali ili nisu bili toliko napredni.

Najočigledniji način za otkrivanje zavisnosti je dokumentacija. Autori programa često napišu uputstvo za prevođenje programa u kojem se nalazi i spisak zavisnosti. Tradicionalno se ta datoteka naziva README (engl. pročitaj me) ili INSTALL.

Drugi način je pokretanje skripte za konfiguraciju koja će prijaviti grešku svaki put kada naiđe na nezadovoljenu zavisnost. Nažalost, nezadovoljene zavisnosti se otkrivaju jedna po jedna tako da je proces iterativan i zamarajuć.

Treći način je verovatno najelegantniji. Svaki paket u sebi nosi spisak svojih zavisnosti za pokretanje i za prevođenje. Ukoliko imamo tu sreću da nam je dostupan, možemo da instaliramo sve zavisnosti ili samo da ih izlistamo. Naprimer, ovako za Ubuntu:

apt-get build-dep [paket] apt-rdepends --build-depends [paket]

Konkretan primer

Kod možete da preuzmete iz zvaničnog „uzvodnog” repozitorijuma za taj program (eng. upstream), ili pomoću upravnika paketom iz repozitorijuma distribucije.

Prvi način daje najsvežiji dostupan kod. Ovo je preporučena polazna tačka ako želite da ispravite neku grešku, prvo proverite da li je ta greška još uvek prisutna čak i u najnovijoj verziji koda. Ako jeste, proverite da li ju je neko već prijavio. Tek onda se prepustite hakovanju i pisanju zakrpe (eng. patch).

Neophodno je da imate već instaliran Git. To možete proveriti komandom:

which git
ili
git --version

Kao primer Gnuovog stila uzećemo IRSSI. Konzolni IRC klijent.

Preuzimanje najnovijeg koda:

git clone https://github.com/irssi/irssi

Preuzimanje koda iz repozitorijuma distribucije:

apt-get source irssi

Obratite pažnju da izvorni repozitorijumi obično nisu uključeni. Proverite da li je to i kod vas slučaj i, ako jeste, uključite ih.

Posle toga je neophodno instalirati zavisnosti. Eksperimenta radi, možete da pokušate da pokrenete skriptu za konfiguraciju pre instaliranja zavisnosti kako biste videli kako izgledaju poruke o greškama.

Zavisnosti možete instalirati ovom komandom:

apt-get build-dep irssi

Dodatna zavisnost može da se pojavi, naprimer, dh-autoreconf u ovom slučaju!

Proces kompajliranja započeti ovim komandama:

./autogen.sh # (dodatni korak koji generiše čak i skriptu za konfiguraciju) #prethodna skripta će odmah pokrenuti i configure skriptu, mada možete je opet pokrenuti i sami make -j5 #(kompajliranje, -j5 znači 5 poslova, pravilo je broj jezgara +1) #izvršna datoteka se nalazi u src/fe-text/irssi #po potrebi možete pokrenuti i make install, onda će svi fajlovi biti raspoređeni na svoje mesto #direktno u sistem, obratiti pažnju da install deo morate pokrenuti kao root korisnik

Deo INSTALL datoteke:

Irssi installation instructions ------------------------------- To compile irssi you need: - glib-2.6 or greater - pkg-config - openssl (for ssl support) - perl-5.6 or greater (for perl support) For most people, this should work just fine: ./autogen.sh     (for people who just cloned the repository) ./configure      (if this script already exists, skip ./autogen.sh) make su make install     (not _really_ required except for perl support)

Si-Mejk primer

apt-get source weechat apt-get build-dep weechat cd weechat mkdir build cd build cmake .. make -j5 cd src/gui/curses/weechat

Prvi program možete testirati pokretanjem izvršnog fajla koji je naveden gore ili, ako ste izvršili i instalaciju, odnosno premeštanje izvršnih fajlova – potrebno je samo da u konzoli otkucate:

irssi

source1Trebalo bi da dobijete konzolni interfejs koji podseća na prozor za dopisivanje. Otkucajte sledeće da se konektujete na naš kanal:

/nick nadimak_koji_zelite /server irc.freenode.net /join #floss-magazin

Drugi program možete pokrenuti pokretanjem izvršnog fajla koji se nalazi u direktorijumu u koji ste prešli nakon prevođenja, ili, ako ste izvršili instalaciju, pokretanjem komande:

weechat

A možete se konektovati na sledeći način:

/server add freenode chat.freenode.net /connect freenode /nick nadimak_koji_ste_izabrali /join #floss-magazin

Ako budete imali nekih nedoumica ili problema, možete nas kontaktirati putem elektronske pošte ili naših stranica na Fejsbuku i Tviteru.source2