петак, 19 априла, 2024
Сам свој мајстор

Инсталирање програма из изворног кода

Аутори: Никола Харди и Стефан Ножинић

О проблему

Слободан софтвер стиже до рачунара крајњих корисника у разним облицима. Данас су најпопуларније тзв. „бинарне” дистрибуције (енг. binary based distribution) које се базирају на систему пакета у ризницама, а сваки пакет садржи програме који су већ преведени у извршни облик (енг. executable) и увезани (енг. linked) са одговарајућим верзијама дељених библиотека. Одговарајуће верзије тих библиотека су такође доступне у неким другим пакетима. О овоме можете детаљно да прочитате у 34. броју часописа.

Други начин за добављање новог софтвера је преузимање кода. Постоје дистрибуције које су базиране на изворном коду (енг. source based distribution) као што су Слеквер (енг. Slackware) и Џенту (енг. Gentoo). Пакет менаџери таквих дистрибуција преузимају изворни код софтвера и изворне кодове његових зависности, преводе их и тек потом премештају на потребне локације (инсталирање). Обе варијанте имају и своје предности и своје мане.

Предност бинарних дистрибуција је што захтевају мање процесорских ресураса јер нема потребе за превођењем програма при инсталацији. Мана је мањак флексибилности при инсталацији јер је програм доступан само у оном облику у којем је припремљен.

Дистрибуције базиране на изворном коду превазилазе тај проблем, али уносе додатно време и употребу процесора при инсталацији (и свакој надоградњи!) сваког пакета. Дистрибуције базиране на изворном коду нису тема овог чланка јер је у том случају процес превођења аутоматизован. Тема овог чланка је како преузети код програма који иначе није могуће инсталирати стандардним путем или када желимо да направимо неку измену у њему (енг. patch). Главна тема је софтвер који је типично писан у програмским језицима Ц и Ц++.

Код једноставнијих пројеката који се састоје од свега неколико датотека проблем превођења је тривијалан. Постоји јасна полазна тачка (енг. main entry point) а скуп зависности је минималан. Проблем се јавља када се пројекат састоји из великог броја датотека и ослања се на велики број библиотека које морају бити присутне у тренутку превођења. Проблем постаје још сложенији када желимо да изменимо неке претпоставке као што су подразумевана локација за тражење библиотека, избор преводиоца или искључивање неких делова кода.

Проблем је другачији код неких других оперативних система и програмских језика. На линуксу и другим јуниксоликим системима је ситуација таква да се програми ослањају на скуп дељених библиотека (енг. shared libraries). На неким другим платформама су библиотеке или статички увезане (део су самог програма), или се дистрибуирају заједно са програмом. У оба случаја при превођењу су заглавља (енг. headers) свакако неопходна. Пајтон и Пип (енг. Pip) управници пакета могу то сами да разреше, APT такође. Уколико желимо да инсталирамо програм који није доступан у нашој дистрибуцији, проблем се мало другачије решава.

На почетку је напоменуто да су језици у којима су ови пројекти писани углавном Ц и Ц++. За пројекте писане у Пајтону постоји специфичан и једноставан начин превођења и такав пројекат је најчешће доступан у ризницама управника пакета Пип. За Јаваскрипт постоји npm као и слични управници за пројекте у осталим језицима. Употреба ових специфичних управника за ове језике је веома једноставна, разрешавање зависности иде аутоматски па их нећемо овде описивати.

Еволуција алата

На почетку је проблем донекле решаван тзв. билд скриптама (енг. build script) који су до одређене мере могле да аутоматизују процес превођења. Појавио се шаблон и појавила се потреба за новим алатом. Тако је настао језик за специфичну намену (енг. domain specific language, dsl) под називом M4. M4 је заправо скраћеница од речи Макро, по принципу почетног слова и броја слова које следе. М и још четири слова. М4 се користи за писање мејкфајлова (енг. makefile) и дан-данас.

Иако је М4 помогао у аутоматизацији, он није могао да помогне у проблему портабилности. Процес превођења није потпуно исти на Линуксу и на БСД-у или Соларису. Због тога су као помоћни алат настале скрипте за конфигурацију (енг. config). Њихов посао је да открију у каквом окружењу се тренутно налазе, који преводилац је доступан, да ли су све зависности задовољене итд. Као резултат скрипте за конфигурацију је један мејкфајл који је валидан за тренутну платформу. Поред наведених могућности, скрипте за конфигурацију су и дан-данас начин за фино подешавање програма при превођењу. Например, можете да преведете плејер без подршке за графичко окружење или уређивач текста без могућности за истицање синтаксе. То је механизам који дистрибуције засноване на изворном коду користе за фино подешавање пакета. Пошто је и у процесу писања скрипти за конфигурацију примећен известан шаблон, успостављен је одређени стандард и направљен је скуп алата. Писање скрипте за конфигурацију није нимало једноставан задатак. То су алати који се усавршавају већ више од двадесет година. Један такав алат је Гнуов систем за превођење (енг. GNU build system) познат као Autotools. Други је знатно млађи (десетак година) и у неким принципима другачији систем – Си-Мејк (енг. CMake). Оба система имају исту намену: на основу одређених подешавања произвести исправан мејкфајл на било којој од подржаних платформи, уз препознавање доступног преводиоца, проверу зависности и подршку за фино подешавање могућности. Ово је, наравно, само груб опис. Мејкфајлови могу да се користе за различите намене (покретање процеса генерисања документације или тестирања), а данас не морају да буду ни у М4 језику – постоје и други билд системи, например Нинџа (енг. Ninja). У овом чланку ћемо се бавити само проблемом употребе ових система од стране корисника, не програмера. Припрема пројекта тако да користи неки од ових система је тема за неки други чланак.

Гнуов систем за превођење

Гнуов систем за превођење је нешто старији скуп алата. Важи за сложену машинерију. Може се рећи да је најзаступљенији, барем када је реч о Ц и Ц++ пројектима. Иако је прилично сложен за постављање, једноставан је за употребу. Састоји се углавном од три корака:

  1. покренути скрипту за конфигурацију;
  2. покренути превођење;
  3. покренути инсталацију.

Ово се обично састоји из три команде које се редом извршавају:

./configure
make
make install

Различити параметри се могу поставити при извршавању скрипте за конфигурацију, а за више детаља о датим параметрима довољно је извршити команду за добијање помоћне документације:

./configure --help

sourceСи-Мејк

Прича каже да је Си-Мејк скраћеница од колор мејк (енг. „colour make” – мејк у боји). То и јесте најочигледнија разлика за једног корисника. Током процеса превођења извештаји су у боји, а тренутни напредак је изражен у процентима уместо криптичним дугим линијама које представљају записник о извршеним командама. И Си-Мејк решава проблем откривања окружења, проверу зависности и фино подешавање заставицама (енг. flags). Начин је мало другачији, скрипте за конфигурацију су у језику направљеном специфично за овај алат, уместо класичних беш (енг. bash) скрипти. Резултат може да буде М4 или Нинџа мејкфајл. Најчешће је то баш М4 који се стандардно покреће командом make. Процес се састоји од следећих корака:

cmake .
make
make install

Разрешавање зависности

Овде није реч о „оним зависностима”. Зависност је у овом контексту библиотека на коју се жељени програм ослања. Најчешће је та библиотека потребна у облику дељене библиотеке (енг. shared library) са .so екстензијом. Таква зависност се назива и зависношћу потребном за покретање програма (енг. runtime dependency). Такав облик је неопходан за покретање програма, али није довољан за превођење. За превођење су потребна и заглавља.

Списак зависности може да се открије на много начина. Неки су мање а неки више мучни. Ово је некада давно била главна мука корисника линукса, у време када управници пакетима нису постојали или нису били толико напредни.

Најочигледнији начин за откривање зависности је документација. Аутори програма често напишу упутство за превођење програма у којем се налази и списак зависности. Традиционално се та датотека назива README (енгл. прочитај ме) или INSTALL.

Други начин је покретање скрипте за конфигурацију која ће пријавити грешку сваки пут када наиђе на незадовољену зависност. Нажалост, незадовољене зависности се откривају једна по једна тако да је процес итеративан и замарајућ.

Трећи начин је вероватно најелегантнији. Сваки пакет у себи носи списак својих зависности за покретање и за превођење. Уколико имамо ту срећу да нам је доступан, можемо да инсталирамо све зависности или само да их излистамо. Например, овако за Убунту:

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

Конкретан пример

Код можете да преузмете из званичног „узводног” репозиторијума за тај програм (енг. upstream), или помоћу управника пакетом из репозиторијума дистрибуције.

Први начин даје најсвежији доступан код. Ово је препоручена полазна тачка ако желите да исправите неку грешку, прво проверите да ли је та грешка још увек присутна чак и у најновијој верзији кода. Ако јесте, проверите да ли ју је неко већ пријавио. Тек онда се препустите хаковању и писању закрпе (енг. patch).

Неопходно је да имате већ инсталиран Гит. То можете проверити командом:

which git
ili
git --version

Као пример Гнуовог стила узећемо IRSSI. Конзолни ИРЦ клијент.

Преузимање најновијег кода:

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

Преузимање кода из репозиторијума дистрибуције:

apt-get source irssi

Обратите пажњу да изворни репозиторијуми обично нису укључени. Проверите да ли је то и код вас случај и, ако јесте, укључите их.

После тога је неопходно инсталирати зависности. Експеримента ради, можете да покушате да покренете скрипту за конфигурацију пре инсталирања зависности како бисте видели како изгледају поруке о грешкама.

Зависности можете инсталирати овом командом:

apt-get build-dep irssi

Додатна зависност може да се појави, например, dh-autoreconf у овом случају!

Процес компајлирања започети овим командама:

./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)

Си-Мејк пример

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

Први програм можете тестирати покретањем извршног фајла који је наведен горе или, ако сте извршили и инсталацију, односно премештање извршних фајлова – потребно је само да у конзоли откуцате:

irssi

source1Требало би да добијете конзолни интерфејс који подсећа на прозор за дописивање. Откуцајте следеће да се конектујете на наш канал:

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

Други програм можете покренути покретањем извршног фајла који се налази у директоријуму у који сте прешли након превођења, или, ако сте извршили инсталацију, покретањем команде:

weechat

А можете се конектовати на следећи начин:

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

Ако будете имали неких недоумица или проблема, можете нас контактирати путем електронске поште или наших страница на Фејсбуку и Твитеру.source2