You are on page 1of 64

GNU

programerski alati

Aleksandar Samardi

(asamardzi matf.bg.a .yu)

Matematiki fakultet
Univerzitet u Beogradu

Verzija 1.1.0, septembar 2002.

Copyright ( ) 2001-2002 Aleksandar Samardi.


Dokument je dozvoljeno kopirati, distribuirati i/ili modikovati
prema uslovima navedenim u GNU Free Do umentation Li ense
li en i u verziji 1.1 ili bilo kojoj kasnijoj verziji objavljenoj od
strane Free Software Foundation -a. Kopija li en e se moe nai
na adresi http://www.gnu.org/li enses/li enses.html#TOCFDL.

Predgovor
Operativni sistem UNIX nastao je na prelazu izmeu 60-tih i 70-tih godina
u AT&T Bell istraivakim laboratorijama kao produkt nastojanja grupe
programera da za svoje potrebe naprave adekvatno radno okruenje, a pod
uti ajem operativnog sistema Multi s na ijem je razvoju veina njih prije
toga radila. Od ovakvog ini ijalno skromno postavljenog ilja UNIX je vremenom izrastao u moan i veoma rairen operativni sistem i tu svoju pozi iju
je zadrao do danas.
Postoji vie razloga za veliku popularnost koju je ovaj operativni sistem
stekao; za poetno irenje UNIX -a svakako je najzaslunija njegova implementa ija u drugoj itera iji na C programskom jeziku1 , ime je praktino
postao prvi operativni sistem implementiran na viem programskom jeziku
umjesto na asembleru. Ovo je omoguilo portovanje UNIX -a na vei broj
arhitektura koje su tada bile u upotrebi, to je predstavljalo znatnu prednost u odnosu na postojee operativne sisteme koji su bili striktno vezani za
arhitekturu za koju su ini ijalno bili razvijeni. Takoe, irenju popularnosti
UNIX -a svakako je bitno doprinijelo to to ga je AT&T besplatno dijelio
univerzitetima i drugim zainteresovanim stranama od kojih je pak zauzvrat
dobijao zakrpe za postojee programe, kao i sasvim nove programe kojima je
onda proirivan bazni operativni sistem - duh slobodne irkula ije rezultata
programerskog rada od poetka je bio sastavni dio UNIX kulture (sa svim
pozitivnim i negativnim posledi ama). Ipak, svakako da je najvei razlog uspjeha UNIX -a njegov izuzetan ini ijalni dizajn; kon epti na kojima je UNIX
izgraen su izdrali probu vremena i omoguili mu da ak i sada, 30 godina nakon nastanka, bude tehniki superioran u odnosu na ostale operativne
sisteme.
Zajedno sa ekspanzijom UNIX -a tokom sedamdesetih i poetkom osamdesetih godina dolo je i do njegove fragmenta ije, takoe i do negativnih prom1

C jezik je upravo namjenski razvijen radi implementa ije UNIX operativnog sistema

ii

Predgovor

jena sa korisnike take gledita u pogledu povoljnih uslova li en iranja koji


su vaili u vrijeme pojave ovog operativnog sistema. Nezadovoljstvo takvom
situa ijom navelo je grupu programera da 1984. pokrenu projekat kreiranja
potpuno besplatnih verzija svih programa za koje se obino smatra da sainjavaju UNIX operativni sistem. Veina tih programa zaista biva implementirana na ovaj nain; itav ovaj napor dobija naziv GNU projekat2 , pa se
onda ti programi oznaavaju i imenom GNU programi.
Po prirodi stvari, prvi skup programa nastao na opisani nain su bili programerski alati - oni su bili potrebni da bi se pomou njih napravili ostali
programi; takoe, u to vrijeme se u duhu starijih shvatanja o tome ta obuhvata operativni sistem smatralo da su ovi programi njegov sastavni dio, pa
je i sa te strane bilo vano da se isti implementiraju. Veina ovih alata e
se pokazati veoma kvalitetnim, do te mjere da danas veina komer ijalnih
varijanti UNIX -a ukljuuje ove alate kao standardne. Ti programerski alati
bie predmet razmatranja ovog teksta i u narednim poglavljima bie predstavljeni naini korienja za svaki od njih ponaosob. Opet po prirodi stvari,
ovi alati su bili primarno usmjereni ka pisanju programa na C programskom
jeziku; mada veina njih sada podrava ravnopravno i druge programske
jezike, fokus ovog teksta bie na njihovoj primjeni u C programiranju. Inae, za svaki od tih programa postoji i detaljna originalna dokumenta ija do
koje se moe doi info naredbom tako to se iza ove naredbe navede ime
programa (npr. za g prevodila naredbom info g ). Jasno je da ovaj
kratki tekst moe predstaviti samo uzak podskup elementarnih osobina ovih
inae veoma kompleksnih programa, kao i da je pisanje dueg teksta koji
bi udvajao postojeu dokumenta iju besmisleno. Zato info strani e treba
konsultovati po svim pitanjima koja se tokom korienja ovih alata jave, a
koja ne budu ovdje razmotrena.
Takoe treba rei i da je uinjen svaki napor da ovaj tekst bude primjenjiv
na to iri broj UNIX varija ija, ali je ipak sve to u njemu stoji provjereno
samo na Sla kware 8.1 distibu iji Linux -a i na FreeBSD -u 4.6, tako da u
sluaju da neto od onog to je navedeno u tekstu ne radi na datoj varija iji
UNIX -a treba konsultovati za tu varija iju spe inu dokumenta iju.

GNU je rekurzivna skraeni a od GNU's Not UNIX i ne znai nita

Sadraj

Predgovor

GNU ema s editor

Primjer - rjeavanje kvadratne jednaine

GNU indent program za formatiranje koda

13

GNU g C

15

GNU make alat za odravanje projekta

21

GNU gdb debager

33

GNU gprof

41

GNU ar

CVS

prevodila

program za analizu izvravanja programa

arhiver i kreiranje biblioteka

alat za kontrolu verzija

47
51

iv

SADRAJ

Poglavlje 1

GNU ema s editor


Prva komponenta koja je programeru potrebna u realiza iji bilo kakvog projekta svakako je editor za unos koda u odgovarajue fajlove. GNU ema s
je visoko kongurabilni programerski editor sa posebnim reimima rada za
veliki broj programskih jezika. ema s se pokree naredbom:
ema s

nakon ega e biti kreiran novi prozor1 za ema s program. ema s se, kao i
sve ispravno pisane X Window System aplika ije, moe kongurisati preko
tzv. resursa. Izgled ema s prozora po startovanju je prikazan na sli i 1.1.
Glavninu prozora zauzima naravno povrina namijenjena za unos teksta, pri
vrhu prozora nalazi se meni, sa lijeve strane je s roll-bar, a pri dnu prozora nalaze se jedno iznad drugog statusna linija i tzv. minibuer koji slui
za unos dodatnih parametara komandi ema s -a. I pored toga to program
sadri meni i s roll-bar kao standardne elemente grakog korisnikog interfejsa, te to reaguje na odreeni broj komandi miem, ema s je zamiljen
tako da se komande prevashodno zadaju sa tastature. tavie, radi to breg
ku anja sve komande se mogu (i trebaju) zadavati bez pomjeranja ruku sa
glavnog dijela tastature. Takav rad sa ema s -om je najekasniji i zato treba
od poetka nastojati da se komande zadaju na ovaj nain.
Za zadavanje komandi sa tastature obino se koriste tasteri Ctrl i Alt u kombina iji sa nekim slovima. Ovi tasteri se u ema s dokumenta iji oznaavaju
1

pretpostavka ovog teksta je da se radi u X Window System okruenju; naravno, kao i


za sve druge programe koji se izvravaju u posebnom prozoru zgodno je na kraj navedene
naredbe za pokretanje dodati & da bi mogao da se nastavi rad u shell-u iz koga se ema s
pokree

GNU ema s editor

Slika 1.1: Izgled ema s prozora.


sa C odn. M (npr. pritiskanje tastera f dok je pritisnut taster Ctrl se oznaava
kao C-f, a pritiskanje istog tastera dok je pritisnut taster Alt kao M-f), pa
e takva nota ija i ovdje biti koriena.
Prva komanda koju je potrebno znati u ema s -u je vjerovatno komanda za
naputanje programa i ona se aktivira sekven om C-x C- (ovo znai da
prvo treba pritisnuti taster x dok je taster Ctrl ukljuen, a potom pritisnuti
taster opet dok je taster Ctrl ukljuen).
Nakon ove komande, naredni znaajan skup komandi koje su neophodne pri
editovanju teksta su komande za pomjeranje kroz tekst. Tekua pozi ija je,
kao to je to uobiajeno kod unosa teksta, predstavljena kursorom, pa pre iznije reeno ove komande predstavljaju komande za pomjeranje kursora.

U tabeli 1.1 dat je pregled ovih komandi. Treba uoiti da se ovdje komande
koje ukljuuju upotrebu Ctrl tastera uglavnom odnose na elementarne jedini e teksta (karaktere, linije), dok se komande koje ukljuuju upotrebu
Alt tastera odnose na semantike jedini e teksta (rijei, reeni e, paragra).
Pored komandi nabrojanih u tabeli, na veini tastatura alternativno se mogu
koristiti standardni tasteri za pomjeranje kursora (tasteri sa streli ama, tasteri PgUp i PgDn itd.); meutim kombina ije tastera navedene u tabeli
omoguavaju da se komande izdaju bez pomjeranja ruku sa glavnog dijela
tastature pa ih treba, kako je ve sugerisano, to prije usvojiti. Isto vai i za
pozi ioniranje kursora korienjem mia - s roll-bar se moe koristiti za tu
namjenu2
Komanda
C-f
C-b
C-p
C-n
M-f
M-b
C-a
C-e
M-a
M-e
C-v
M-v
M-<
M->
C-l

Efekat komande
pomjeranje kursora za jedan karakter unaprijed
pomjeranje kursora za jedan karakter unazad
pomjeranje kursora na prethodnu liniju
pomjeranje kursora na narednu liniju
pomjeranje kursora za jednu rije unaprijed
pomjeranje kursora za jednu rije unazad
pomjeranje kursora na poetak linije
pomjeranje kursora na kraj linije
pomjeranje kursora na poetak reeni e
pomjeranje kursora na kraj reeni e
pomjeranje kursora za jedan ekran unaprijed
pomjeranje kursora za jedan ekran unazad
pomjeranje kursora na poetak teksta
pomjeranje kursora na kraj teksta
pomjeranje teksta tako da linija u kojoj se nalazi kursor doe
na sredinu ekrana

Tabela 1.1: Naredbe za pomjeranje kursora u ema s -u.


Za veinu komandi u ema s -u se moe zadati i broj ponavljanja ukoliko je
potrebno da se ista komanda izvri vie puta. To se postie komandom C-u
nakon ega treba navesti broj ponavljanja i onda normalno komandu koja
2
ema s prozor je implementiran korienjem Athena seta widget-a (kontrola od kojih
se sastoji korisniki interfejs), kod kojeg se pomjeranje thumb-a na s roll-bar-u vri tako
to se klikne srednjim dugmetom mia na thumb i onda se povue miem drei srednje
dugme pritisnuto, dok se klik lijevim dugmetom mia uvijek prevodi u pomjeranje za jedan
ekran unaprijed, desnim dugmetom mia za jedan ekran unazad, a srednjim dugmetom
mia na pozi ioniranje vrha thumb-a na taku u kojoj se kliknulo

GNU ema s editor

treba da bude izvrena vie puta. Tako npr. ako se eli da se kursor pomjeri
za 5 linija unaprijed, odgovarajua sekven a komandi bi glasila C-u 5 C-n.
Sa druge strane, zadavanje ili izvravanje neke komande se moe u svakom
trenutku prekinuti komandom C-g.
Unoenje teksta pomou ema s -a se naravno vri prosto tako to se uku aju
odgovarajui karakteri. Ukoliko se prilikom unosa teksta doe do kraja linije
na ekranu, dalje uneseni karakeri e biti prikazani u narednoj liniji pri emu
e na kraj prve linije biti stavljena obrnuta kosa rta (\) da oznai da na tom
mjestu zapravo nije kraj linije. Komanda za zadavanje broja ponavljanja se
moe koristiti i za unos karaktera - ako se iza ove komande i broja ponavljanja
ne zada neka druga komanda ve obian karakter, ema s e taj karakter
unijeti u tekst zadati broj puta.
Za brisanje teksta u ema s -u postoji vie naredbi. Brisanje karaktera koji
se nalazi ispred kursora vri se pomou Del tastera. Karakter iza kursora se
brie komandom C-d. Po analogiji, rije ispred kursora se brie istovremnim
pritiskom Alt i Del tastera, dok se rije iza kursora brie M-d komandom.
Slino, tekst od pozi ije kursora do kraja linije se brie komandom C-k, dok se
tekst od pozi ije kursora do poetka linije brie komandom M-k. Komanda
C-k, ukoliko je linija prazna brie samu liniju. Za brisanje veih djelova
teksta, treba pritisnuti istovremeno tastere Ctrl i Spa e na poetku (odn.
kraju) dijela teksta koji se eli obrisati i onda se pozi ionirati na kraj (odn.
poetak) tog dijela teksta i tamo izvriti komandu C-w. Ovako obrisani dio
teksta moe se u svakom trenutku povratiti naredbom C-y. Ako se eli na
taj nain povratiti neki dio teksta nakon koga je bilo jo slinih brisanja,
treba nakon komande C-y izdavati komandu M-y sve dok se ne pojavi dio
teksta koji se eli povratiti. Ukoliko se neki dio teksta ne eli obrisati na
ovaj nain, ve samo sauvati da bi kasnije bio ubaen na neko mjesto, onda
na kraju (odn. poetku) tog dijela teksta umjesto komande C-w treba zadati
komandu M-w.
Ponitavanje poslednje ak ije (tzv. undo ) u ema s -u se vri komandom C-x
u ili alternativno komandom C-_. Komande koje ne mijenjaju tekst se ne
pamte, pa se ne mogu ni ponititi. Sama undo komanda takoe se pamti,
tako da je za ponitavanje njenog efekta potrebno prvo izdati neku komandu
koja ne mijenja tekst (da se ne bi nastavilo sa ponitavanjem efekta prethodnih komandi), npr. pomjeriti kursor na neki nain, a zatim opet izdati undo
komandu.
Otvaranje fajla u ema s -u se vri komandom C-x C-f nakon ega u minibuer u treba zadati ime fajla. Pritom se moe koristiti standardna shell ekspanzija

- ukoliko se uku a poetak imena fajla i potom pritisne Tab taster ime fajla
e biti dopunjeno ukoliko je jedinstveno, a ukoliko nije u donjem dijelu ema s
prozora bie izlistani svi fajlovi koji imaju takav poetak imena (ova lista e
sama nestati kada se uku a puno ime fajla). ema s u naelu ne dozvoljava
rad sa neimenovanim fajlovima tako da se kreiranje novog fajla vri tako
to se na isti nain zada C-x C-f komanda i onda spe i ira ime koje e u
ovom sluaju biti dato novom fajlu. Snimanje fajla se vri komandom C-x
C-s. Prilikom snimanja ema s pravi kopiju stare verzije fajla pod imenom
koje je jednako originalom imenu sa karakterom  kao suksom. Takoe,
tokom rada ema s automatski povremeno snima tekuu verziju fajla dodajui karakter # kao preks i suks imenu - ovaj fajl moe da se iskoristi za
oporavak dijela onog to je uraeno u sluaju eventualnog pu anja programa.
Ime tekueg fajla inae uvijek stoji u statusnoj liniji.

ema s naravno podrava rad sa vie fajlova. Svakom otvorenom fajlu se dodjeljuje tzv. bafer; takoe u ema s -u postoje i neki baferi koji nisu pridrueni

fajlovima. Lista tekuih bafera se moe dobiti komandom C-x C-b. Ova
komanda e podijeliti ema s prozor na dva potprozora3 ; da bi se oslobodilo
drugog prozora treba pozi ionirati kursor u onaj prozor u kome se eli ostati
i izdati komandu C-x 1. Da bi se odjednom sauvao sadraj svih bafera
koji su povezani sa fajlovima treba izdati komandu C-x s, nakon ega e za
svaki od takvih bafera koji su editovani biti postavljeno pitanje da li se eli
sauvati njihov sadraj u odgovarajuem fajlu.

Iz dosadanjeg izlaganja bi trebalo da se moe uoiti nain na koji se zadaju


komande sa tastature u ema s -u - za esto koriene komande koristi se kombina ija tastera Ctrl ili Alt sa nekim karakterom, dok se za ree koriene
komande koristi komanda C-x koju prati neki karakter ili opet kombina ija
tastera Ctrl i nekog karaktera. Obzirom da ema s sadri mnogo vei broj
komandi nego to ima kombina ija tastera, one najree koriene komande
zadaju se punim imenom, tako to se nakon komande M-x u minibuer -u
otku a ime odgovarajue komande. Tako se npr. komanda za zamjenu teksta4 moe zadati tako to se prvo izvri M-x, a onda u minibuer -u otku a
ime komande repla e-string. Prilikom ku anja imena komande moe se
(kao pri shell ekspanziji imena komandi) pritisnuti taster Tab i ime komande
e biti dopunjeno do one take do koje je to ime jedinstveno. Po zadavanju komande treba pritisnuti taster Enter da bi komanda bila izvrena
(komanda za zamjenu dijela teksta zahtijeva jo i dva argumenta: tekst koji
e biti zamjenem i tekst koji predstavlja zamjenu koje takoe treba zadati u
3
4

ustvari su ti potprozori ono to se u ema s terminologiji naziva prozorom


za ovu komandu inae postoji i skraeni a sa tastature

GNU ema s editor

minibuer -u).
Za pretraivanje u ema s -u se koriste komande C-s za pretraivanje unaprijed i C-r za pretraivanje unazad. Po izdavanju ovih komandi u minibuer -u
treba zadati i string koji se trai; pretraivanje e poeti jo dok se string
zadaje. Za ponavljanje pretraivanja treba opet izdati komandu C-s odn.
C-r. Pretraivanje utie na pozi iju kursora, tj. kursor se pri svakom pretraivanju pozi ionira na mjesto na kome je pronaen dati string.
Kako je ve reeno, ema s prozor moe u nekim situa ijama biti podijeljen na vie potprozora. Da bi se to uradilo dok se edituje neki fajl treba
zadati komandu C-x 2. Nakon toga se prozor dijeli na dva potprozora i
svaki od njih sadri po jedan bafer koji odgovara datom fajlu. Ovi baferi se
mogu nezavisno editovati, mada se najee ovo radi da bi se imao stalno na
pogledu jedan dio fajla dok se edituje drugi njegov dio. Komandom C-x o se
prelazi iz jednog u drugi potprozor. Dok se nalazi u nekom potprozoru, moe
se u njemu otvoriti i neki drugi fajl standardom komandom za otvaranje fajla
C-x C-f.
Ve je pomenuto da statusna linija u ema s -u sadri ime fajla. Ispred imena
se nalaze zvjezdi e ukoliko je bafer modikovan - kada se snimi sadraj bafera
u fajl ove zvjezdi e nestaju. Na desnom kraju statusne linije nalazi se indikator trenutne pozi ije u okviru teksta i to prvo kao broj linije sa preksom
L, a potom kao pro enat u odnosu na itav tekst. Izmeu imena fajla i ovih
indikatora nalazi se oznaka ema s moda. U ema s -u se razlikuju glavni (major ) i sporedni (minor ) modovi; u jednom trenutku moe biti aktivan samo
jedan glavni mod, dok istovremeno moe biti aktivno vie sporednih modova.
Oznaka u statusnoj liniji se odnosi na glavni mod. Glavni mod se odreuje
prema tipu teksta koji se unosi i ema s podrava veliki broj ovih modova
koji se odnose na editovanje odgovarajuih vrsta fajlova - tako npr. postoji
mod za pisanje C programa, mod za pisanje obinog teksta, mod za pisanje
TEX dokumenata itd. U svakom od ovih modova ema s na odgovarajui
nain pomae pri unosu teksta; re imo u C modu automatski uvlai nove
linije i boji pojedine rijei prema sintaksi jezika, takoe nudi i mnoge druge
mogunosti o kojima e vie rijei biti u ostalim poglavljima. Pored toga,
ema s stavlja na raspolaganje i posebne komande za rad sa datom vrstom
teksta - neke od ovih komandi su dostupne i preko posebne stavke u meniju
koja se pojavljuje ispred Help stavke. Sporedni modovi se odnose na neke
ire primjenjive naine obrade teksta koji se mogu ukljuivati po elji i kombinovati sa glavnim modom i drugim sporednim modovima. Jedan primjer
ovakvog moda je tzv. Auto Fill mod koji automatski uba uje novi red nakon
odreenog broja (70 u podrazumijevanom stanju) karaktera. Ovaj mod se

ukljuuje M-x auto-fill-mode komandom. Pored ove komande, ovaj mod


obuhvata i komande C-x f za zadavanje broja kolone nakon koje e se linije
prelamati i M-q za prelamanje pasusa kada se isti edituje negdje u sredini.

ema s sadri i veoma detaljnu dokumenta iju koja je korisniku na raspo-

laganju opet u vidu funk ija koje se pozivaju na standardni nain. Tu je


prije svega izuzetan tutorial za poetnike koji se aktivira komandom C-h t
- ovo poglavlje nije nita drugo do preprian ovaj tutorial. Pomo u vezi
neke ema s komande moe se dobiti na razne naine. Ukoliko se izda komanda C-h , a potom komanda za koju se trai pomo bie odtampano
ime komande. Ukoliko se izda komanda C-h k, pa onda komanda za koju se
trai pomo bie otvoren potprozor sa detaljnom dokumenta ijom za datu
komandu. Ako se pak izda komanda C-h a i nakon toga otku a neki string,
ema s dokumenta ija e biti pretraena i u potprozoru e biti nabrojani svi
njeni djelovi u kojima se dati string javlja.

ema s je visoko kongurabilan program. Pored kongurisanja standardnih parametara X Window System aplika ije koje je pomenuto na poetku,
svaki segment ema s -a koji se odnosi na rad sa tekstom se moe kongurisati. Obzirom da se ispod ema s -a zapravo nalazi Lisp interpreter, to se
ova podeavanja izvode Lisp izrazima za dodjeljivanje vrijednosti odreenim
varijablama odn. za pozivanje funk ija. Sve komande koje se izdaju sa tastature se zapravo na kraju svode na izvravanje ovakvih izraza. Od posebnog
znaaja su svakako trajna podeavanja, tj. ona podeavanja za koja se eli
da budu na snazi svaki put kada se pokrene ema s. Ovakva podeavanja
treba kao odgovarajue Lisp izraze upisati u /.ema s fajl. Tako npr. ako
se eli postaviti podrazumijevani broj karaktera nakon koga e linija biti
prelomljena u ovaj fajl treba staviti liniju:
(setq-default fill- olumn 78)

a ukoliko se eli da kada je na snazi Text glavni mod da uvijek bude aktivan
i Auto Fill sporedni mod, u ovaj fajl treba dodati liniju:
(add-hook 'text-mode-hook 'turn-on-auto-fill)

Ako se npr. hoe da region teksta bude oznaen pri markiranju sa tastature
na isti nain kao to to biva kada se region markira miem, odgovarajua
linija u /.ema s fajlu bi glasila:
(setq-default transient-mark-mode t)

GNU ema s editor

Za puno kongurisanje svakako je potrebno upoznati se sa osnovama Lisp -a i


detaljno prouiti ema s dokumenta iju koja se tie ugraenih promjenljivih
i funk ija.
Na ovom mjestu bi bilo vrlo poeljno da se provjeba sa ema s -om na primjeru iz narednog poglavlja - najbolje tako to e se problem opisan u prvom
pasusu pokuati uraditi samostalno, bez gledanja na priloeno rjeenje.

Poglavlje 2
Primjer - rjeavanje kvadratne
jednaine
Za demonstriranje GNU programerskih alata bie korien jednostavan primjer programa koji nalazi realne korijene kvadratne jednaine ax2 + bx + c.
U ovom poglavlju dat je izvorni kod po fajlovima koji sainjavaju taj mali
projekat. U duhu UNIX kon epta pravljenja malih programa koji primaju
ulazne podatke sa standardnog ulaza u tekstulanom formatu i tampaju
rezultate na standardnom izlazu opet u tekstualnom formatu, program e
sa standardnog ulaza itati koe ijente kvadratne jednaine a, b i c, a na
standardnom izlazu ispisati broj realnih korijena te jednaine, kao i same
korijene (ukoliko ih ima). Sa druge strane, u duhu pro eduralne paradigme
na kojoj je zasnovan C jezik, izraunavanje korijena jednaine bie izdvojeno
u posebnu funk iju i poseban fajl u odnosu na glavni program koji sadri kod
za uitavanje ulaznih podataka odn. ispis rezultata.
Pretpostaviemo da je za ovaj projekat kreiran poseban direktorijum sa
imenom quadri . Fajl u kome se nalazi funk ija za odreivanje korijena
kvadratne jednaine zvae se quadri . i imae sledei sadraj:
#in lude <math.h>
#in lude "quadri .h"
int
quadri (double a, double b, double , double *x0, double *x1)
{
double dis r;
/* Diskriminanta jedna ine. */
double mul;
/* Re ipro na vrijednost imenio a u razlomku
* koji odredjuje rjesenja jedna ine. */

10

Primjer - rjeavanje kvadratne jednaine

/*
* Izra unava se diskriminanta jedna ine.
*/
dis r = b * b - 4 * a * ;
/*
* Ukoliko je diskriminanta ve a od 0, jedna ina ima dva realna
* rjesenja. Izra unavaju se rjesenja jedna ine i upisuju u loka ije
* na koje ukazuju x0 i x1, a iz funk ije se vra a 2 kao broj realnih
* rjesenja.
*/
if (dis r > 0)
{
dis r = sqrt (dis r);
mul = 1 / (2 * a);
*x0 = (-b + dis r) * mul;
*x1 = (-b - dis r) * mul;
return 2;
}
/*
* Ukoliko je diskriminanta jednaka 0, jedna ina ima jedno realno
* rjesenje. Izra unava se vrijednost tog rjesenja i upisuje u
* loka iju na koju ukazuje x0, a iz funk ije se vra a 1 kao broj
* realnih rjesenja.
*/
if (dis r == 0)
{
*x0 = -b / (2 * a);
return 1;
}

/*
* Ukoliko je diskriminanta manja od 0 jedna ina nema realnih
* rjesenja, pa se iz funk ije vra a 0.
*/
return 0;

Interfejs ove funk ije bie dat u quadri .h fajlu. Obzirom da onaj ko koristi
funk iju treba da vodi rauna samo o interfejsu (tj. u prin ipu ne treba da
uopte gleda quadri . fajl), u ovom fajlu je funk ija detaljno dokumentovana. Fajl ima oblik:
#ifndef quadri _h
#define quadri _h
/*
*
*
*
*
*
*

Funk ija quadri () odredjuje realne korijene kvadratne jedna ine


a*x^2+b*x+ =0. Argumenti funk ije su:
a, b, - koefi ijenti kvadratne jedna ine
x0, x1 - pokaziva i na loka ije u koje e biti upisana rjesenja jedna ine
Funk ija vra a broj pronadjenih realnih korijena. Ukoliko jedna ina
nema realnih korijena, loka ije na koje pokazuju x0 i x1 ostaju

11

* neizmijenjene. Ukoliko jedna ina ima jedan realni korijen, njegova


* vrijednost biva upisana u loka iju na koju pokazuje x0. Ukoliko
* jedna ina ima dva realna korijena, njihove vrijednosti bivaju
* respektivno upisane na loka ije na koje pokazuju x0 i x1.
*/
int quadri (double a, double b, double , double *x0, double *x1);
#endif

Na kraju, glavni program u kome se uitavaju koe ijenti jednaine sa standardnog ulaza, poziva quadri funk ija da izrauna realna rjeenja jednaine
i ispisuju ta rjeenja na standardni izlaz bie u fajlu test. (ime potie od
toga to zapravo ovaj dio koda slui za testiranje ispravnosti implementa ije
funk ije quadri ()) i imae oblik:
#in lude <stdio.h>
#in lude "quadri .h"
/*
* Program pronalazi realna rjesenja date kvadratne
* jedna ine. Koefi ijenti jedna ine se u itavaju sa standardnog ulaza,
* da bi se potom na standardnom izlazu odstampao broj realnih rjesenja
* jedna ine, a zatim, ako jedna ina ima realnih rjesenja, i sama
* rjesenja. Program nema ugradjenu provjeru gresaka na ulazu.
*/
int
main ()
{
double a, b, ;
/* Koefi ijenti kvadratne jedna ine. */
int ount;
/* Broj realnih rjesenja jedna ine. */
double x0, x1;
/* Realna rjesenja jedna ine. */
/*
* U itavaju se koefi ijenti jedna ine.
*/
s anf ("%lf%lf%lf", &a, &b, & );
/*
* Odredjuju se realna rjesenja jedna ine.
*/
ount = quadri (a, b, , &x0, &x1);
/*
* Ispisuje se broj realnih rjesenja jedna ine.
*/
printf ("%d\n", ount);
/*
* Ispisuju se rjesenja jedna ine.
*/
swit h ( ount)
{
ase 1:

12

Primjer - rjeavanje kvadratne jednaine

printf ("%f\n", x0);


break;
ase 2:
printf ("%f\n", x0);
printf ("%f\n", x1);
break;
}
}

return 0;

Mada je za dalji tekst od najveeg znaaja ustvari opisana raspodjela projekta po fajlovima, poeljno je da se u ovom trenutku proui i sam kod i
pritom obrati posebna panja na dekompozi iju problema na potprobleme,
te na detaljno komentarisanje i davanje deskriptivnih imena promjenljivim u
nastojanju da se kod uini to itljivijim. Sve nabrojano je naravno poeljno
pri bilo kakvom programiranju, ali se smatra i obaveznim u UNIX zajedni i.

Poglavlje 3

GNU indent program za


formatiranje koda

U poglavlju o ema s -u je pomenuto kako programerski modovi automatski


postavljaju pravilno uvlaenje prilikom unosa koda. Na slian nain ema s
pomae u vezi jo nekih elementarnih formatiranja koda; meutim, ovaj
editor ipak ne moe sam po sebi obezbijediti potpuno uniformno formatiranje datog koda. Sa druge strane, uniformno formatiranje znatno popravlja
itljivost koda, tako da je obaveza u iole ozbiljnijem projektu obezbijediti da
kod bude uniformno formatiran, kao i da to formatiranje bude usaglaeno sa
nekim opteprihvaenim konven ijama. Naravno, poto je tako neto teko
osigurati samo nastojanjem programera, pojavili su se alati koji za pojedine programske jezike vre automatsko reformatiranje fajlova sa kodom da
bi se kod u njima doveo u sklad sa eljenom konven ijom. Ovakvi alati se
oznaavaju imenom beautier -i.

GNU alat koji je namijenjen za formatiranje C koda naziva se indent 1.

Upotreba ovog programa je vrlo jednostavna - u komadnoj liniji se iza imena


programa navede ime fajla (ili imena fajlova) koje treba obraditi i indent e
izvriti reformatiranje, npr:
indent hello.

Pritom, reformatirani kod e biti sauvan u fajlu sa istim imenom, dok e


originalni sadaj fajla biti sauvan na isti nain kao to ema s uva rezervne
1
treba voditi rauna da se na BSD varija ijama UNIX -a ovim imenom referen ira
originalni indent program, dok se GNU verzija komande moe pozvati imenom gindent

GNU indent program za formatiranje koda

14

kopije - u fajlu sa suksom . Ako se kao argument navede samo jedan fajl,
onda je mogue korienjem op ije -o2 ekspli itno zadati ime fajla u koji e
biti smjeten reformatirani kod:
indent hello. -o beautified.

GNU indent ima jako veliki broj op ija (vidjeti odgovarajue info strani e)
koje omoguavaju da se podesi skoro svaki zamislivi aspekat formatiranja
koda. Ipak, najee se koristi nekoliko predenisanih stilova od kojih svaki
podrazumijeva odreenu kombina iju op ija formatiranja. Podrazumijevani
stil, koji se primjenjuje kada se ne navede nikakva op ija (kao u gornjim
primjerima) je obino GNU stil formatiranja3 . Ovaj stil je primijenjen na
formatiranje fajlova iz prethodog poglavlja. Pored GNU stila koji se moe
i ekspli itno zadati op ijom -gnu, indent podrava i tzv. Kernigan-Rii stil
(prema formatiranju koda u knjizi Programski jezik C od ovih autora) koji
se zadaje op ijom -kr, npr.:
indent -kr hello.

kao i tzv. Berkli stil koji se zadaje op ijom -orig. Ako se pored op ije za stil
navede ekspli itno i neka pojedinana op ija koja se razlikuje od op ije koju
za odgovarajui aspekt formatiranja propisuje dati stil, onda pojedinano
zadata op ija ima prioritet i primjenjuje se njome odreeno formatiranje.

na UNIX -u se op ije programu obino zadaju tako to se navede rti a i slovo koje
predstavlja skraeni u za op iju; u ovom sluaju u pitanju je op ija sa argumentom
(imenom fajla) koji se zadaje iza rti e i slova
3
GNU stil, odnosno one njegovi aspekti koje editor moe obezbijediti, primjenjuje i
ema s za reformatiranje tokom editovanja

Poglavlje 4

GNU g C

prevodila

Centralno mjesto u paleti programerskih alata svakako zauzima C prevodila ; GNU verzija ovog programa jeste g prevodila . Ukoliko se C program
nalazi u jednom fajlu, npr. sa imenom hello. , nain pozivanja prevodio a
je veoma jednostavan:
g hello.

g e prevesti program i, ukoliko nema sintaksnih greaka, kreirae izvrni

fajl; u suprotnom e prevodila ispisati poruke o grekama zajedno sa referen ama na linije u kojima se te greke javljaju u izvornom fajlu. g ima
meutim veliki broj op ija kojima se mogu no podeavati parametri prevoenja; najvanije od njih bie pobrojane u daljem tekstu. Prva od takvih
op ija jeste op ija za zadavanje imena izvrnog programa; ako se ova op ija
ne zada, izvrni program e uvijek nositi ime a.out. Spe i iranje imena
izvrnog programa se vri -o op ijom, pa ako se u gornjem sluaju eli da se
taj fajl zove hello1 , odgovarajua naredba bi glasila:
g -o hello hello.

g predstavlja ustvari kolek iju prevodio a, trenutno su podrani C, C++,


Fortran 77 i Obje tive C programski jezi i. Koji e prevodila biti pokrenut

odreuje se na osnovu ekstenzije fajla, pa tako za fajlove sa ekstenzijom


. biva pokrenut C prevodila , za fajlove sa ekstenzijama . , . p, . xx,
. pp, . ++ i .C biva pokrenut C++ prevodila itd. Ukoliko ekstenzija fajla
1

na UNIX -u je konven ija da izvrni fajlovi nemaju nikakvu ekstenziju

GNU g C

16

prevodila

ne odgovara nekoj od navedenih, tada se prevodila koji e biti pokrenut


moe zadati -x op ijom koja ima kao argument identikator jezika za koji
e biti pozvan prevodila ; ako je npr. C program iz nekog razloga stavljen u
fajl sa imenom hello. ode, onda bi naredba za njegovo prevoenje i davanje
imena hello izvrnom fajlu glasila:
g -x -o hello hello. ode

Sledea vana op ija odnosi se na podvrgavanje C standardu. g , kao i svaki


drugi prevodila , podrava neke nestandardne ekstenzije koje se iskljuuju
zadavanjem op ije -ansi. Korienje nestandardnih ekstenzija je neto to
u naelu treba uvijek izbjegavati; meutim, kod g -a je u pitanju mali broj
inae veoma korisnih ekstenzija, tako da u situa ijama kada se zna da e
program koji se razvija uvijek biti prevoen ovim prevodio em ima smisla
razmisliti o njihovom korienju. Od ovih ekstenzija treba pomenuti: typeof
operator za odreivanje tipa objekta, omplex tip sa odgovarajuim funk ijama u standardnoj bibliote i za podrku radu sa kompleksnim brojevima,
mogunost deklarisanje polja ija duina nije konstantna i koja e biti automatski osloboena po izlasku iz dosega, mogunost zadavanja ini ijalizatora koji nisu konstantni, zadavanje ranga vrijednosti umjesto samo jedne
vrijednosti u ase granama swit h naredbe i podrku za jednolinijske komentare u C++ stilu (tj. za // komentare). Dobar dio g ekstenzija (npr.
omplex tip i ne-konstantni ini ijalizatori) je ugraen u poslednji, tzv. C99
standard C jezika.
Kao i svaki drugi komapajler, i g pored poruka o sintaksnim grekama
(u sluaju ijeg postojanja ne biva generisan izvrni fajl) moe da generie i poruke o upozorenjima na konstruk ije koje su sintaksno ispravne, ali
lie na semantiki neispravne2 . ta e sve biti prijavljeno kao upozorenje
odreuje se op ijama koje imaju preks -W. Najvei broj ovakvih konstruk ija na koje treba obratiti panju bie prijavljivan ako se prosto zada grupna
op ija -Wall; treba meutim obratiti panju i na one konstruk ije koje nisu
obuhvaene ovom op ijom i po potrebi ukljuiti njima odgovarajue op ije - jedna takva konstruk ija bila bi korienje realnih brojeva na nekoj
strani jednakosti, za koju se prijavljivanje upozorenja ukljuuje op ijom
-Wfloat-equal.
Svaki iole vei program u jednom trenutku treba debagovati od greaka.
GNU alat namijenjen ovom zadatku jeste gdb debager i o njemu e vie
2
tipian primjer je postojanje operatora dodjele u uslovu, gdje bi bilo za oekivati
operator jednakosti

17

rijei biti u jednom od narednih poglavlja; da bi debager meutim mogao


da se koristi nad nekim izvrnim fajlom potrebno je da u taj fajl budu upisane odgovarajue informa ije. Ovo se prilikom prevoenja obezbjeuje -g
op ijom prevodio a. Najboje je tokom razvoja programa ovu op iju drati
stalno ukljuenu i iskljuiti je tek pri generisanju nalne, od greaka (koliko
je to mogue) oiene verzije programa.
Na nain slian -g op iji - u smislu da se njihovim ukljuivanjem u izvrni fajl
upisuju dodatne informa ije koje slue za neki vid analize izvrnog programa
u periodu razvoja programa, funk ioniu i op ije koje predstavljaju podrku
za prola iju izvrnog programa. Vie rijei o ovim op ijama bie u poglavlju
posveenom prola iji.
Jednom kada je debagovanje programa zavreno, mogu se ukljuiti op ije
prevodio a namijenje optimiza iji3 . Slino kao kod op ija koje se odnose na
upozorenja, i ovdje se moe vrlo pre izno denisati kakve se sve optimiza ije
trae ili se moe koristiti neka od grupnih op ija koja u sebi podrazumijeva
vei broj elementarnih optimiza ija. U ovu drugu grupu spadaju op ije -O0,
-O1, -O2 i -O3, svaka sa rastuim brojem ukljuenih optimiza ija, kao i -Os
kojom se minimizuje memorija koju e izvrni program da koristi.
Jedan podskup g op ija se odnosi na prepro esor. Dvije op ije koje su
najvanije u ovoj grupi su op ije za denisanje odnosno ukidanje deni ije
makroa. Prva op ija se navodi sa preksom -D koga slijedi ime makroa i
op iono znak jednakosti i vrijednost koja se dodjeljuje makrou (u suprotnom
se makrou dodjeljuje vrijednost 1). U itavoj ovoj sekven i ne smije biti
blanko znakova. Druga op ija se navodi na slian nain - iza preksa -U
stavi se ime makroa ija se deni ija ukida.

g prevodila ustvari predstavlja omota za skup programa od kojih svaki


obavlja pojedinu fazu prevoenja4 . Stoga se jedan skup op ija ovog prevodio a odnosi na stepen prevoenja. Op ijom -E se spe i ira da se izvri
samo prepro esiranje, pri emu se rezultat prikazuje na standardnom izlazu.
Op ijom -S se zadaje da se prevoenje zaustavi nakon generisanje asemblerskog koda, tj. da se ne generie mainski kod. Asemblerski kod pritom biva
smjeten u fajl sa istim imenom kao fajl sa izvornim kodom, ali sa ekstenzijom .s. Sintaksa u kojoj e biti ispisan asemblerski kod je tzv. AT&T
sintaksa; istu sintaksu koristi as GNU asembler, ali treba primijetiti da je
u pitanju sintaksa koja se unekoliko razlikuje od sintakse koju uobiajeno
3
ove op ije podrazumijevaju da kompila ija traje znatno due nego to je uobiajeno
u ilju generisanja ekasnijeg izvrnog koda
4
ovdje se ubrajaju prepro esor, prevodila u uem smislu, asembler i linker

GNU g C

18

prevodila

koriste drugi asembleri. Najvanija od op ija koje se odnose na nepotpuno


prevoenje svakako je - op ija kojom se zadaje da se generiu samo objektni fajlovi, tj. da se ne izvri linkovanje. Pritom, objektni fajl dobija isto
ime kao fajl sa originalnim kodom, s tim to se ekstenzija mijenja u .o. Ova
op ija se standardno koristi za svaki projekat koji ima dva ili vie fajlova sa
izvornim kodom: prvo se svaki od ovih fajlova koristei ovu op iju prevede u
odgovarajui objektni fajl, a zatim se novim pozivom prevodio a izvri linkovanje tih objektnih fajlova. Na primjeru programa za rjeavanje kvadratne
jednaine, generisanje objektnih fajlova bi se izvrilo naredbama:
g -ansi -Wall - -o quadri .o quadri .
g -ansi -Wall - -o test.o test.

dok bi se linkovanje izvrilo naredbom:


g -o test quadri .o test.o

Poslednja naredba e prijaviti poruku o gre i koja e biti pojanjena u


narednom pasusu. Ovdje treba uoiti kako kako su pri prevoenju koriene
op ije -ansi da se obezbijedi potovanje C jezikog standarda i -Wall da bi
bila generisana upozorenja na odreene sumnjive konstruk ije u kodu.
Od op ija koje se odnose na linker najvanija je -l op ija kojom se navodi
ime biblioteke sa kojom treba linkovati program. Korienje ove op ije se
moe pokazati na prethodnom primjeru; kako je ve reeno, naredba za linkovanje e prijaviti poruku o gre i. Razlog tome je to se u fajlu quadri .
poziva sqrt() funk ija iz standardne biblioteke, pa se onda mora linkovati
quadri .o objektni fajl sa odgovarajuim kodom iz standardne biblioteke.
Meutim, g za razliku od veine drugih prevodio a ne linkuje automatski
sa itavom standardnom bibliotekom, ve su matematike rutine iz standardne biblioteke izdvojene u posebnu biblioteku5 koja se oznaava imenom
libm6 . Zato se mora ekspli itno zadati linkovanje sa tom bibliotekom da bi
prevoenje u jelini bilo uspjeno izvreno:
g -lm -o test quadri .o test.o
5

ovo je iz razloga ekasnosti, na taj nain je duina izvrnog fajla kraa ako se ne
koriste funk ije iz ovog dijela standardne biblioteke
6
lib iz imena biblioteke se nikad na navodi kada se ime biblioteke spe i ira -l op ijom
linkera

19

Poslednji interesantan skup op ija g prevodio a su op ije koje se odnose


na dodatne direktorijume u kojima se trae header fajlovi ili biblioteke. g
odrava skup standardnih direktorijuma sa ovim fajlovima koje pretrauje
tokom prevoenja odn. linkovanja (tu npr. spadaju direktorijumi u kojima se nalaze header fajlovi odn. fajlovi sa objektnim kodom standardne
biblioteke), a dodatni direktorijumi se mogu zadati op ijama -I za header
fajlove, odnosno -L za biblioteke. Nakon ovih op ija odmah se, bez blanko
znakova, navodi putanja do direktorijuma koji se dodaje u skup direktorijuma koji se pretrauju za date fajlove.
Kako je ve nagovijeteno, neke pomenute op ije g prevodio a bie detaljnije pojanjene, a neke koje nisu pomenute bie uvedene u poglavljima
posveenim ostalim alatima za koje su te op ije vane.

20

GNU g C

prevodila

Poglavlje 5

GNU make alat za odravanje


projekta

U prethodnom poglavlju su navedene naredbe koje je potrebno izvriti radi


prevoenja opisanog programa za rjeavanje kvadratne jednaine. Svaki put
kada se neto promijeni u kodu, ove naredbe treba ponovo primijeniti da bi
se aurirao izvrni fajl. Jasno je da uzastopno ponovno ku anje naredbi u
shell -u nije previe pametna ideja, tako da bi prvi korak ka automatiza iji
te pro edure bio da se napravi shell skript koji bi sadrao te naredbe, pa da
se onda rekompajliranje izvri prostim pozivanjem ovog skripta. Ovo meutim nije dobro rjeenje jer bi na taj nain svaki put svi fajlovi bili iznova
prevedeni, mada to esto nije neophodno. Re imo u datom primjeru, ako se
promijeni fajl quadri . onda nema potrebe da se regenerie fajl test.o i
obrnuto; na ovako malom projektu usporenje ne bi bilo znaajno, meutim
na iole veem projektu gdje se u najveem broju sluajeva rekompajliranje
pokree nakon izmjene samo jednog ili par fajlova, gubitak vremena bi bio
osjetan. Sa druge strane, vraajui se na pokretanje naredbi za prevoenje
iz komandne linije, ak i ako se zanemari gubitak vremena na ku anju ve na
posmatranom primjeru se vidi da bi bilo previe komplikovano za programera da nakon svake izmjene odreuje koje sve djelove projekta treba prevesti:
tako bi ovdje programer morao stalno da vodi rauna da kad promijeni fajl
quadri . treba da pokrene prvu i treu naredbu, kad promijeni fajl test.
da treba da pokrene prvu i drugu naredbu i kad promijeni fajl quadri .h da
mora da pokrene sve tri naredbe (jer je ovaj fajl ukljuen i u quadri . i u
test. fajlove). Oigledno je potreban neki alat koji e automatski odreivati koje djelove projekta treba rekompajlirati; takvi alati se oznaavaju

GNU make alat za odravanje projekta

22

terminom make alati, a GNU varijanta ovog alata upravo i nosi ime make 1 .
Da bi make mogao da obavi svoj posao, mora mu se zadati skup pravila
na osnovu kojih se vri auriranje fajlova koji zavise od nekih drugih fajlova. Ovaj skup pravila se upisuje u tzv. makele fajl koji najee ima
ime Makefile ili makefile, odn. GNUmakefile ako sadri neke konstruk ije
spe ine za GNU verziju make alata. Pod pretpostavkom da se u tekuem
direktorijumu nalazi makele sa odgovarajuim imenom, pozivanje programa
se vri naredbom:
make

U suprotnom, ukoliko je potrebno ekspli itno navesti ime makele -a bilo


zato to se isti nalazi u nekom drugom direktorijumu ili to nema neko od
podrazumijevanih imena, ime makele -a se moe zadati -f op ijom.
Pravila u makele -u imaju striktan format. U prvoj liniji se navodi fajl (tzv.
ilj odn. target ) koga treba aurirati kada se neki drugi fajlovi promijene,
zatim slijedi dvotaka, a potom lista fajlova (tzv. zavisnosti odn. dependen ies ) od kojih je ovaj prvi zavisan. Potom slijedi proizvoljan broj redova
koji sadre komande za regenerisanje ilja na osnovu zavisnosti; svaki od ovih
redova mora obavezno da poinje Tab znakom. Tako bi re imo na posmatranom primjeru pravilo za regenerisanje quadri .o fajla kada se promijene
fajlovi od kojih je ovaj zavisan glasilo:
quadri .o: quadri . quadri .h
g -ansi -Wall - -o quadri .o quadri .

Obino makele sadri vei broj pravila; make pritom uvijek izvrava samo
jedno pravilo i to ili ono koje je prvo u listi ako iza naredbe make nije nita
navedeno ili pak ono pravilo iji je ilj naveden iza make naredbe. Ukoliko se
u zavisnostima ovog ilja javi neki drugi ilj iz makele -a onda se rekurzivno
izvava i pravilo koje se odnosi na taj drugi ilj i tako redom. Na taj nain,
u makele -u za posmatrani primjer kao prvo bi trebalo navesti pravilo za
generisanje samog izvrnog programa, a potom pravila za generisanje objektnih fajlova, pa bi makele mogao imati oblik:
test: quadri .o test.o
g -lm -o test quadri .o test.o
1
slino indent programu, na BSD varija ijama UNIX -a se ovim imenom referen ira
originalna verzija ovog alata, dok se GNU make pokree komandom gmake

23

quadri .o: quadri . quadri .h


g -ansi -Wall - -o quadri .o quadri .
test.o: test. quadri .h
g -ansi -Wall - -o test.o test.

Pod pretpostavkom da je make program pokrenut bez argumenata, bie analizirano prvo pravilo. Prvi elemenat iz liste zavisnosti je ilj drugog pravila,
pa e make prei na analizu drugog pravila. Ovdje su zavisnosti obini fajlovi, pa e make odrediti (prostim poreenjem datuma zadnje izmjene fajla
koji predstavlja ilj i fajlova koji predstavljaju zavisnosti) da li je potrebno
aurirati ilj i eventualno to auriranje uraditi pokretanjem komande koja je
navedena u drugom pravilu. make se nakon toga vraa na analizu prvog pravila, ustanovljava da je i drugi element liste zavisnosti ilj i prelazi na analizu
odgovarajueg (treeg) pravila. Ovo pravilo se obrauje na isti naina kao
drugo pravilo, ako je potrebno regenerie se fajl test.o i make se opet vraa
na analizu prvog pravila. Ovaj put sve zavisnosti su ve aurirane tako da
se sada mogu porediti vremena njihovih zadnjih izmjena sa vremenom zadnje izmjene ilja prvog pravila i eventualno pokrenuti komanda navedena u
prvom pravilu da bi se izvrni fajl aurirao. Nakon toga make zavrava rad,
a svi fajlovi u projektu ostaju u auriranom stanju.
Mada je gornji makele potpuno funk ionalan, on se moe uiniti znatno
itljivijim i lakim za odravanje korienjem promjenljivih. Promjenljive se
u makele -ovima uvode prosto tako to se navede ime promjenljive, potom
znak jednakosti i onda vrijednost koja se dodjeljuje promjenljivoj. Referen iranje promjenljive se vri tako to se ime promjenljive navede izmeu
obinih zagrada, sa znakom $ kao preksom. U datom primjeru bi se mogla
uvesti jedna promjenljiva da uva egove -ansi -Wall koji se prenose C prevodio u. Takoe, moe se uvesti jedna promjenljiva da uva listu biblioteka
sa kojima treba linkovati izvrni program, kako bi eventualno dodavanje
biblioteka u tu listu bilo pojednostavljeno. Pored toga, obino se i sam prevodila referen ira preko promjenljive zato to razni prevodio i na UNIX -u
uglavnom rade na isti nain, ali imaju drugaija imena pa se onda postie da
se prostom izmjenom vrijednosti ove promjenljive isti makele moe koristiti
i sa nekim drugim prevodio em. Sa navedenim izmjenama, makele bi dobio
oblik:
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri .o test.o

GNU make alat za odravanje projekta

24

$(CC) -o test quadri .o test.o $(LDLIBS)


quadri .o: quadri . quadri .h
$(CC) $(CFLAGS) - -o quadri .o quadri .
test.o: test. quadri .h
$(CC) $(CFLAGS) - -o test.o test.

U toku pisanja komandi za neko pravilo, na raspolaganju su odreene spe ijalne promjenljive; tako promjenljiva $ predstavlja ilj pravila, promjenljiva
$ sadri listu svih zavisnosti pravila, a promjenljiva $< sadri prvu iz liste
zavisnosti. Koristei ove promjenljive, moe se gornji makele kompaktnije
zapisati u obliku:
CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri .o test.o
$(CC) -o $ $^ $(LDLIBS)
quadri .o: quadri . quadri .h
$(CC) $(CFLAGS) - -o $ $<
test.o: test. quadri .h
$(CC) $(CFLAGS) - -o $ $<

Odreivanje liste fajlova od kojih zavisi neki fajl i odravanje te liste je


u iole veem projektu veoma naporno; zato je mnogo bolje taj posao prepustiti nekom alatu. Veina modernih prevodila a podrava kreiranje liste
zavisnosti za dati fajl; u g -u se ta lista generie op ijama -M za listu svih
zavisnosti ukljuujui i header fajlove iz standardne biblioteke odnosno -MM
za listu zavisnosti bez standardne biblioteke. Op ije -MD odnosno -MMD su
ekvivalentne pomenutim, s tim to listu zavisnosti ne ispisuju na standardni
izlaz ve je smjetaju u fajl sa istim imenom kao izlazni fajl2 , ali sa ekstenzijom .d. Ovo se moe iskoristiti da se u makele automatski ukljue ove
liste zavisnosti i time izbjegne potreba za njihovim runim odravanjem. Da
bi se to uradilo potrebno je prilikom generisanja objektnih fajlova zadati
op iju -MMD3 g prevodio u, pa e liste zavisnosti biti kreirane i smjetene
u odgovarajue fajlove sa ekstenzijom .d. Potom treba iskoristiti in lude
direktivu da bi se ovi fajlovi ukljuili u makele, a onda se mogu izba iti
header fajlovi iz liste zavisnosti za objektne fajlove i makele dobija oblik:
2

ako takvog ima, ako je pak zadata samo ova op ija onda u fajl sa istim imenom kao
ulazni fajl
3
pretpostavlja se da se fajlovi iz standardne biblioteke na datom sistemu nee mijenjati,
te da ih nije potrebno navoditi u listi zavisnosti

25

CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri .o test.o
$(CC) -o $ $^ $(LDLIBS)
quadri .o: quadri .
$(CC) $(CFLAGS) - -o $ -MMD $<
test.o: test.
$(CC) $(CFLAGS) - -o $ -MMD $<
-in lude quadri .d test.d

Direktiva in lude se uvijek izvrava prije obrade pravila, tako da pravila


navedena u fajlovima ukljuenim u makele ovom direktivom bivaju tretirana kao da su se od poetka nalazila u makele -u. Ispred in lude direktive
je stavljen znak - koji u makeleu -u oznaava da treba nastaviti sa radom
ak i ako pri izvravanju date komande odn. direktive doe do greke. Prilikom prvog pokretanja make -a nad ovim makele -om fajlovi sa ekstenzijom
.d ne postoje, tako da bi u sluaju da znak - nije stavljen ispred in lude
direktive odmah bila prijavljena greka i makele -e se uopte ne bi mogao
izvriti.
Lista zavisnosti koji bude kreirana re imo za fajl quadri . zbog ukljuene
-MMD op ije g -a ima oblik:
quadri .o: quadri . quadri .h

Dakle, u pitanju je zapravo jo jedno pravilo (sa praznom listom komandi)


koje ima quadri .o kao ilj. Kada postoji vie pravila sa istim iljem, make
ih povezuje u jedno pravilo koje u listi zavisnosti ima uniju svih zavisnosti
koje se javljaju u listama zavisnosti pojedinanih pravila. Vano je samo
da pritom komande postoje samo u jednom pravilu, kako je ovdje i sluaj.
Na taj nain se postie upravo ono to je potrebno - da se ne moraju zavisnosti navoditi runo ve da budu automatski generisane dok e u sluaju
da je potrebno izvriti regenerisanje ilja biti pokrenute odgovarajue komande kao i ranije. U vezi sa ovim automatskim generisanjem lista zavisnosti potrebno je napraviti jo jednu korek iju u gornjem makele -u, ali e
ista biti objanjena nakon to makele bude dalje pojednostavljen.
U poslednjoj verziji makele -a se moe primijetiti da su pravila za generisanje
objektnih fajlova osim imena fajlova u svemu drugom identina. Ova pravila
se mogu objediniti ukoliko se upotrijebi operator % uparivanja proizvoljnog
broja karaktera u rijeima i makele se moe napisati na sledei nain:

GNU make alat za odravanje projekta

26

CC
= g
CFLAGS = -ansi -Wall
LDLIBS = -lm
test: quadri .o test.o
$(CC) -o $ $^ $(LDLIBS)
%.o: %.

$(CC) $(CFLAGS) - -o $ -MMD $<

-in lude quadri .d test.d

Kada se ovdje u prvom pravilu obrauje neki od objektnih fajlova, on se


pronalazi kao ilj drugog pravila (jer se njegovo ime zavrava na .o), a onda
se u listi zavisnosti trai fajl sa istim imenom i ekstenzijom . i po potrebi
vri auriranje objektnog fajla odgovarajuim komandama.
Moe se primijetiti da se slina lista fajlova pojavljuje na dva mjesta u poslednoj verziji makele -a. Obino se u makele -ovima imena fajlova koji sainjavaju projekat navode samo na jednom mjestu, najee u nekoj promjenljivoj na poetku fajla), a onda se koriste neke od monih komandi za
substitu iju da se ta imena generiu po potrebi u ostatku makele -a. U
ovom sluaju to bi moglo da se uradi obinom komandom za substitu iju
stringa u sadraju promjenljive na sledei nain:
SOURCES
CC
CFLAGS
LDLIBS

=
=
=
=

quadri . test.
g
-ansi -Wall
-lm

test: $(SOURCES:. =.o)


$(CC) -o $ $^ $(LDLIBS)
%.o: %.

$(CC) $(CFLAGS) - -o $ -MMD $<

-in lude $(SOURCES:. =.d)

Ovom komandom se prosto iza imena promjeljive i dvotake navodi string


koji se mijenja, a potom se stavlja znak jednakosti i navodi string koji predstavlja zamjenu. Svaka pojava prvog stringa u sadraju promjenljive potom
biva zamijenjena drugim stringom i takav izmijenjeni sadraj predstavlja
vrijednost promjenljive u datom sluaju.
Zajedno sa objektnim fajlovima i izvrnim fajlom, kao i fajlovima koji sadre
liste zavisnosti, broj fajlova u direktorijumu projekta poinje da raste. Da
ne bi prilikom manipula ije ovim fajlovima grekom dolo do brisanja ili

27

oteenja fajlova sa kodom, ponekad je zgodno te fajlove izdvojiti u poseban


poddirektorijum. Meutim, nakon ovoga bi trebalo dodati ime tog poddirektorijuma ispred svakog pravila u makele -u. Da bi se to izbjeglo, moe
se iskoristiti spe ijalna promjenljiva koja se zove VPATH. Kada make analizira makele, fajlovi koji su navedeni u listi zavisnosti se trae u tekuem
direktorijumu ili u direktorijumima navedenim u promjenljivoj VPATH, tako
da je nakon premjetanja fajlova sa kodom u neki poddirektorijum dovoljno
postaviti odgovarajuu vrijednost za ovu promjenljivu pa da makele bude
obraen na isti nain kao i ranije. Ovakav pristup organiza iji projekta nee
biti dalje razraivan u ovom tekstu, ali ako bi npr. fajlovi sa kodom u posmatranom primjeru bili prebaeni u poddirektorijum sr tada bi bilo dovoljno
u makele -u na kraj liste promjenljivih staviti:
VPATH

= sr

da bi ovi fajlovi bili pronaeni, a onda bi prevoenje teklo na isti nain kao
i ranije.
Ve je pomenuto da se sa gornjim nainom automatskog generisanja zavisnosti moe pojaviti jedan problem. Radi se o tome da kada se neki od
fajlova sa kodom obrie ili mu se promijeni ime, make nee biti u stanju da
prevede projekat, jer e taj fajl i dalje da stoji u listi zavisnosti, a nee biti
nikakvog pravila da se isti regenerie. Rjeenje ovog problema jeste da se za
svako automatski generisano pravilo o zavisnosti doda jo jednom pravilo u
kome se zavisnosti javljaju kao iljevi, a lista njihovih zavisnosti (kao i lista
komandi za takvo pravilo) je prazna. Kada make naie na praznu listu zavisnosti u nekom pravilu, smatra se da komande koje sadri to pravilo uvijek
treba da budu primijenjene. Poto u ovom sluaju nema komandi, smatrae
se da je ilj auriran i, poto je pronaen, make e biti u stanju da nastavi
sa daljom analizom. Generisanje opisanih pravila treba da se vri zajedno
sa automatskim generisanjem liste zavisnosti i najjednostavniji nain da se
to uradi jeste da se, po generisanju liste zavisnosti u fajlu sa ekstenziojom
.d, uzme takav fajl i od njega napravi drugi fajl, re imo sa ekstenzijom .P
koji e sadrati pravilo koje se nalazi u prvom fajlu, kao i jo jedno pravilo
u kome e lista zavisnosti iz prvog pravila biti ilj, a ostatak pravila e biti
prazan. Onda treba taj fajl sa ekstenzijom .P ukljuiti u originalni makele
umjesto fajla sa ekstenzijom .d. Navedeni postupak se moe implementirati
tako to e u listi komandi za generisanje objektnih fajlova (kom prilikom e
biti generisani i fajlovi sa ekstenzijom .d) biti dodata komanda koja koristi
program sed 4 da automatski edituje fajl sa ekstenzijom .d u opisanom smislu
4

tzv. stream editor

GNU make alat za odravanje projekta

28

i da od njega kreira fajl sa ekstenzijom .P koji e onda biti ukljuen u makele. Makele bi sa ovom komandom i ukljuivanjem fajlova sa ekstenzijom
.P umjesto fajlova sa ekstenzijom .d imao oblik:
SOURCES
CC
CFLAGS
LDLIBS

=
=
=
=

quadri . test.
g
-ansi -Wall
-lm

test: $(SOURCES:. =.o)


$(CC) -o $ $^ $(LDLIBS)
%.o: %.

$(CC) $(CFLAGS) - -o $ -MMD $<


 p $*.d $*.P; \
sed -e 's/#.*//' -e 's/^[^:*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' <$*.d >>$*.P; \
rm -f $*.d

-in lude $(SOURCES:. =.P)

U dodatoj komandi, drugoj u skupu komandi koje se odnose na auriranje


objektnih fajlova (treba uoiti da se ova komanda prostire na 4 reda - u makele -ovima je \ oznaka za nastavljanje tekue linije u narednoj liniji), prvo
se fajl sa ekstenzijom .d kopira u fajl sa ekstenzijom .P, zatim se pokree
sed da bi se u fajl sa ekstenzijom .P dodalo nedostajue pravilo i na kraju
se brie fajl sa ekstenzijom .d. Znak  na poetku komande oznaava da komanda ne treba da se odtampa prilikom izvavanja. U komandi je koriena
i spe ijalna promjenljiva $* koja predstavlja ime fajla u stringu uparenom
operatorom %. Nain na koji se poziva sed nee biti ovdje objanjavan jer
je u pitanju veoma kompleksan program; ipak, treba pomenuti da sve ove
naizgled udne sekven e karaktera predstavljaju regularne izraze - kako se
regularni izrazi inae javljaju u velikom broju vanih UNIX komandi, a njihova sintaksa je uni irana, to bi bilo dobro potruditi se da se ista iz info
strani a odgovarajuih programa naui.
Kao to se moglo naslutiti iz metode za ispravku problema sa automatskim
generisanjem lista zavisnosti u sluaju brisanja nekog fajla iz te liste, iljevi
u pravilima makele -a ne moraju biti fajlovi; kao to je tamo reeno, ukoliko
ilj nekog pravila nije fajl, onda e se komande koje se odnose na njegovo
auriranje uvijek izvriti, pa je to zgodan nain da se u makele ukljue i
sve one komande koje slue za odravanje projekta mimo samog prevoenja.
Vano je samo da se takvi iljevi navedu u listi zavisnosti spe ijalnog .PHONY
ilja, ime se izbjegava konikt u situa iji da se eventualno u datom direktorijumu ipak pojavi fajl sa imenom takvog ilja. Pretpostavimo da u

29

datom makele -u hoemo da dodamo iljeve lean za brisanje svih fajlova


generisanih tokom prevoenja, beauty za pokretanje beautier -a i dist za
kreiranje arhive projekta - tada bi makele imao oblik (uz dodate jo neke
promjenljive radi bolje itljivosti i lake izmjene strukture projekta):
PROBLEM
PROGRAM
SOURCES
CC
CFLAGS
LDLIBS

=
=
=
=
=
=

quadri
test
$(PROBLEM). $(PROGRAM).
g
-ansi -Wall
-lm

$(PROGRAM): $(SOURCES:. =.o)


$(CC) -o $ $^ $(LDLIBS)
%.o: %.

$(CC) $(CFLAGS) - -o $ -MMD $<


 p $*.d $*.P; \
sed -e 's/#.*//' -e 's/^[^:*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' <$*.d >>$*.P; \
rm -f $*.d

-in lude $(SOURCES:. =.P)


.PHONY: beauty lean dist
beauty:

lean:

-indent *.h *.
-rm *~
-rm *.o *.P $(PROGRAM)

dist: beauty lean


-tar - zv -C .. -f ../$(PROBLEM).tar.gz $(PROBLEM)

Sada se proputanje koda kroz beautier moe prosto uraditi naredbom:


make beauty

Na slian nain, jednostavno i bez ponovnog ku anja dugakih komandi,


mogu se obrisati fajlovi generisani prevoenjem, odnosno kreirati arhiva projekta komandama:
make lean

odnosno:

GNU make alat za odravanje projekta

30

make dist

Iz ovog razloga make se ne oznaava samo alatom za automatsko auriranje


fajlova zavisnih od nekih drugih fajlova, ve u punom smislu predstavlja alat
za odravanje projekta. U gornjem primjeru treba uoiti korienje znaka ispred komandi koji obezbeuje da make nastavi sa izvravanjem narednih
komandi ukoliko pri izvravanju neke komande doe do greke5 . Takoe
treba uoiti kako su kod dist ilja u listi zavisnosti navedeni lean i beauty
iljevi ime se obezbeuje da prije kreiranja arhive budu obrisani svi fajlovi
generisani tokom prevoenja odnosno da kod bude automatski proputen
kroz beautier.
Radi rekompajliranja projekta nije neophodno naputati editor - ema s ima
u Tools meniju op iju Compile... kojom se poziva make. Prije pozivanja,
komandna linija kojom se poziva make bie ispisana u minibuer -u. U podrazumijevanom stanju, make se pokree sa op ijom -k koja oznaava da
se sa prevoenjem nastavi koliko god je mogue dalje, tj. da se re imo prevoenje ne prekida im se naie na sintaksnu greku u nekom fajlu, ve da
se nastavi sa drugim fajlovima iz liste. Tekui direktorijum u kome ema s
pokree make je onaj direktorijum u kome se nalazi trenutno otvoreni fajl, a
op ijom -C moe sa spe i irati da make promijeni svoj tekui direktorijum.
Ukoliko je ova ili bilo koja druga make op ija potrebna, dovoljno je navesti
samo prilikom prvog pokretanja makele -a, za ubudue e ema s zapamtiti
op iju i sam e je dodavati u komandnu liniju.
Nakon pokretanja rekompajliranja, u donjoj polovini ema s prozora biva
otvoren potprozor u kome se ispisuju rezultati prevoenja. Ukoliko se prilikom prevoenja jave greke, u ema s -u se uzastopnom primjenom naredbe
C-x ` moe pozi ionirati na fajlove i linije u kojima je greka prijavljena.
Ukoliko se ovoj izuzetno korisnoj funk iji ema s -a doda mogunost prikaza
stabla direktorijuma projekta koja se aktivira op ijom Display Speedbar
op ijom iz Tools menija ema s -a, zatim mogunost direktnog pristupa raspoloivoj
programerskoj dokumenta iji komadnom M-x man, te mogunosti interaktivnog rada sa debagerom i drugim programerskim alatima bez naputanja
ema s -a koje e biti pojanjene u odgovarajuim poglavljima, jasno je zato UNIX programerima nisu potrebna tzv. integrisana razvojna okruenja
- ema s ima sve to takva okruenja nude i jo mnogo vie od toga. Tipian primjer radne sesije u ema s -u tokom ispravljanja sintaksnih greaka
5
striktno posmatrajui, ovaj znak nije neophodan ispred poslednje komande u skupu
komandi, ali nije ga zgoreg napisati svuda radi eventualnog kasnijeg dodavanja komandi
u listu

31

prikazan je na sli i 5.1.

Slika 5.1: Primjer sesije u ema s -u. Gornji potprozor sadri fajl sa kodom,
u donjem potprozoru su rezultati prevoenja. Poto ima sintaksnih greaka,
odgovarajuom komandom pozi ioniran je kursor u fajlu sa kodom na
jednu od njih (u pitanju je zapravo isputen terminator na kraju prethodne
naredbe). Opis greke je istovremeno automatski postavljen na vrh potprozora sa rezultatima prevoenja. Sa lijeve strane prozora nalazi se speedbar
sa hijerarhijom direktorijuma projekta.
Na kraju ovog poglavlja trebalo bi da se stekao uvid o velikom mogunostima

GNU make -a po svim aspektima odravanja projekta. Treba uoiti i kako je


dobijen vrlo generiki makele koji se moe uz minimalne izmjene koristiti

i za druge projekte sline strukture, ak nezavisno od programskog jezika


na kome se projekt implementira. Pored primjene u programiranju, make

32

GNU make alat za odravanje projekta

program se moe koristiti i svuda gdje postoji potreba da se neki fajlovi


automatski auriraju na osnovu nekih drugih fajlova. Tako je npr. make
korien i prilikom pisanja ovog teksta - originalni tekst je napisan na LATEXu iz koga su onda generisane verzije u raznim drugim formatima, pri emu su
to generisanje verzija kao i drugi aspekti odravanja teksta automatizovani
putem odgovarajueg makele -a.

Poglavlje 6

GNU gdb debager


Kako je ve pomenuto, da bi debager mogao da se koristi obavezno je prilikom
prevoenja ukljuiti -g op iju g prevodio a. Ovo je najbolje uraditi tako
to e se na kraj liste op ija sadrane u promjenljivoj CFLAGS u makele -u
dodati i ova op ija. Treba napomenuti i da se alternativno, ukoliko e za
debagovanje biti korien GNU gdb debager, moe koristiti i -ggdb op ija u tom sluaju e u izvrni fajl biti upisane i neke dodatne informa ije koje
omoguavaju da se iskoriste dodatne op ije gdb -a.
Nakon to je obezbijeeno da je projekat preveden sa nekom od navedenih
op ija ukljuenom, debager se pokree tako to se iza imena programa navede
ime izvrnog fajla koji e biti debagovan, uz eventualne argumente komandne
linije. Koristei pokazni primjer i pod pretpostavkom da se nalazimo u korenom direktorijumu projekta, naredba za pokretanje debagera bi glasila:
gdb test

Nakon ovoga, aktivira se gdb shell koji je veoma slian obinom shell -u, samo
to naravno ovaj prepoznaje samo komande koje se odnose na debagovanje.
Program koji se debaguje se iznova pokree naredbom run, ili krae r - za
sve komande gdb -a dovoljno je navesti samo onoliko karaktera sa poetka
imena koliko ih razlikuje od drugih komandi, to za veinu komandi znai
da je prvo slovo imena dovoljno1 . Dalje se sve odvija kao pri normalnom
pokretanju programa - obzirom da pokazni primjer oekuje da se na poetku
1
gdb shell, ba kao i pravi shell, podrava automatsko kompletiranje imena komande
pritiskom na Tab taster, to takoe treba obavezno koristiti u ilju izbjegavanja ku anja
punih imena komandi

34

GNU gdb debager

unesu koe ijenti kvadratne jednaine ija se realna rjeenja trae, program
e na odgovarajuem mjestu zastati oekujui unos, a potom e biti izraunati korijeni i ispisani rezultati, nakong ega e gdb odtampati poruku o
normalnom zavretku programa i prikazati prompt oekujui dalje naredbe.
Naravno, svrha sesije sa debagerom nije da se izvri program kao to bi
bio izvren i bez debagera, ve da se program izvrava u kora ima, pratei
ta se tokom tog izvravanja tano deava. Postoje brojne naredbe gdb -a
kojima se moe upravljati ovakvim izvravanjem programa i koje e u ostatku
poglavlja biti opisane. Meutim, prije nego to se pree na razmatranje tih
naredbi treba rei da se iz gdb -a izlazi naredbom quit, dok se pomo moe
u svakom trenutku dobiti naredbom help. Takoe treba pomenuti i da se
koristei komandu shell moe bez izlaska iz gdb shell -a izvriti bilo koja
UNIX naredba, a koristei komandu make moe se pokrenuti make bez i da
se ku a shell make.
Da bi program mogao da se izvrava korak po korak, potrebno je prije njegovog pokretanja postaviti neku prekidnu taku (breakpoint ). Prekidne take
se postavljaju naredbom breakpoint pri emu se pozi ija prekidne take
moe zadati na vie naina. Najjednostavnije je za spe i iranje prekidne
take navesti ime funk ije na ijem poetku se hoe da se gdb zaustavi. Tako
bi postavljanje prekidne take na poetak posmatranog programa bilo izvedeno naredbom breakpoint main. Nakon ovoga gdb ispisuje poruku da je
postavio prekidnu taku, navodei u toj poru i redni broj prekidne take. Sve
dalje opera ije sa tom prekidnom takom zahtijevaju ovaj broj kao argument.
Alternativno, prekidna taka se esto zadaje i tako to se navedu razdvojeni
dvotakom ime fajla i broj linije u koje se prekidna taka postavlja. Ako se
prekidna taka postavlja u tekui fajl, onda je dovoljno navesti samo broj
linije; obzirom da je po pokretanju gdb -a tekui fajl onaj koji sadri main()
funk iju, prethodno pomenuta prekidna taka se mogla postaviti i naredbom
breakpoint 17. esto se za postavljanje prekidne take kao argument koriste + ili - praeni nekim brojem u kom sluaju se prekidna taka postavlja
onoliko linija koda iza odn. ispred tekue pozi ije u izvravanju programa
koliko iznosi dati broj.
Kada se nakon postavljanja prekidne take pokrene program naredbom run,
izvravanje e biti zaustavljeno na poetku main() funk ije. Treba naglasiti da se izvravanje zaustavlja uvijek ispred linije u kojoj je postavljena
prekidna taka, tj. instruk ija koja se nalazi u toj liniji ne biva izvrena.
Izvravanje moe biti nastavljeno na vie naina. Jedna mogunost je da se
postavi prekidna taka re imo na sledeoj liniji koda naredbom breakpoint
20, pa da se onda nastavi program naredbom ontinue. Naredba ontinue

35

slui za nastavljanje izvravanja programa do prve prekidne take na koju


se naie u toku tog izvravanja. U ovom sluaju e program oekivati da se
unesu ulaznu poda i da bi se potom opet zaustavio zbog prekidne take u
liniji 20. Jedna digresija na ovom mjestu - ve nakon nekoliko pokretanja
izvrnog programa ili sesija sa debagerom postae oigledno da je neprestano
unoenje ulaznih podataka naporno. Bolje rjeenje je da se ulazni poda i upiu u neki fajl, a da se potom prilikom pokretanja programa (bilo normalno,
bilo preko debagera) preusmjerava standardni ulaz na ovaj fajl. U tu svrhu
se moe u direktorijumu projekta kreirati fajl re imo sa imenom data.in sa
ulaznim poda ima. Npr. za jednainu x2 3x + 2 taj fajl bi imao oblik:
1 -3 2

i onda bi, nakon pokretanja debagera, program trebalo pokretati naredbom


run <data.in.
Prekidna taka se brie naredbom delete, pri emu se kao argument navodi
redni broj prekidne take. Ako se ne navede agument, onda se briu sve
prekidne take. Na isti nain funk ioniu naredbe disable odn. enable,
kojima se privremeno iskljuuju odn. opet ukljuuju pojedine prekidne take.
Umjesto postavljanja breakpoint -a na narednu instruk iju da bi se prelo na
nju, moe se za kretanje kroz kod korak po korak iskoristiti naredba next.
Kada se koristi bez argumenata, ova naredba spe ira izvravanje tekue
instruk ije programa; kada se pak navede argument, koji mora biti broj,
onda se izvrava onoliko sledeih naredbi programa koliko iznosi dati broj.
Ukoliko se kree kroz pokazni primjer naredbom next, primijetie se da ova
naredba tretira poziv funk ije quadri () kao jednu instruk iju, tj. ne ulazi
se u ovu funk iju. Ukoliko se eli kretati korak po korak kroz program, ali
uz ulaenje u funk ije, onda treba koristiti naredbu step. Ova naredba se
koristi na potpuno isti nain kao i next naredba. Ukoliko se eli u jednom
koraku zavriti tekua funk ija i zaustaviti se nakon povratka iz nje, onda
treba upotrebiti naredbu finish.
Svaki put kada se izvri neka od naredbi za kretanje kroz program, gdb
tampa tekuu instruk iju. Meutim, radi lakeg orijentisanja u kodu, moe
se koristiti i list nareba. Ako se zada bez argumenata, ova naredba tampa
10 narednih linija koda poev od tekue instruk ije, sa jednim argumentom
tampa 10 linija koje okruuju liniju koja je data tim argumentom i sa dva
argumenta tampa sve linije izmeu linija datih argumentima.
Unekoliko slina prethodnoj naredbi je naredba info, pa e i ona biti pojanjena na ovom mjestu. Ova naredba slui za prikaz informa ija o stanju

36

GNU gdb debager

debagera i stanju izvravanja programa. Ova naredba je obavezno praena


argumentom koji odreuje koja grupa informa ija e biti prikazana. Broj
grupa informa ija koje se na ovaj nain mogu prikazati je jako veliki. Tako se
npr. naredbom info breakpoints prikazuje lista svih postavljanih prekidnih taaka, naredbom info sour e informa ije o tekuem fajlu, naredbom
info registers sadraj registara glavnog pro esora, naredbom info float
sadraj registara numerikog kopro esora itd.
Izvravanje programa korak po korak samo po sebi nije dovoljno za debagovanje programa. Druga neophodna komponenta za uspjeno obavljanje ovog
zadatka je mogunost oitavanja vrijednosti promjenljivih i izraza tokom
izvravanja programa. gdb naravno prua ovakvu mogunost - naredbom
print se moe u trenutku kada je izvravanje programa prekinuto odtampati vrijednosti proizvoljne promjenljive ili izraza koji su navedeni kao argument ove naredbe. Neka je re imo prekidna taka postavljena na liniju 14 fajla quadri . (ova prekidna taka bi bila spe i irana naredbom
breakpoint quadri . :14). Tada se mogu ispisati vrijednosti argumenata
funk ije quadri () naredbama print a, print b i print , zatim re imo
vrijednost promjenljive dis r naredbom print dis r2 , ili re imo vrijednosti izraza koji ulaze u izraunavanje diskriminante naredbama print b*b
i print -4*a* . Treba uoiti da je sintaksa izraza uobiajena C -ovska sintaksa.
Za prikaz sadraja memorijskih loka ija slui naredba x (od examine ). Ova
naredba moe kao argument da ima adresu memorijske loka ije koja e biti
prikazana, a takoe postoje op ije za zadavanje broja memorijskih loka ija
koje e biti izlistane, te formata u kome e njihov sadraj biti interpretiran.
Za prikaz registara pro esora odn, kopro esora slue ve pominjane naredbe
info registers odn. info float.
Veoma esto je potrebno da se sadraj neke promjenljive ili izraza prikae
svaki put kada doe do zaustavljanja programa. Ovo se moe postii naredbom display koja ima istu sintaksu kao i naredba print osim to se nakon izdavanja ove naredbe dati promjenljiva odn. izraz ne prikau samo jednom ve
svaki put kada doe do zaustavljanja programa. Naredba display je slina
naredbi breakpoint u smislu da se pri svakom pozivanju ove naredbe dodjeljuje redni broj promjenljivoj odn. izrazu koji se spe iraju za prikazivanje,
te da se njihov prikaz moe ukinuti undisplay naredbom (ekvivalent delete
naredbe za prekidne take) odn. privremeno iskljuiti i opet ukljuiti nared2
dobra prilika da se podsjeti kako neini ijalizovane promjenljive na C -u imaju potpuno
proizvoljne vrijednosti

37

bama disable display i enable display (ekvivalenti naredbi disable i


enable za prekidne take), pri emu se za svaku od ovih naredbi kao argument navodi redni broj koji su promjenljiva odn. izraz dobili prilikom poziva
display naredbe. Postoji i naredba info display koja ispisuje informa ije
o svim promjenljivim odn. izrazima spe i iranim za prikazivanje.
U izrazima koji se zadaju u naredbama print i display mogu gurisati samo
globalne promjenljive u programu ili lokalne promjenljive u onoj funk iji u
kojoj je izvravanje programa zaustavljeno, tj. samo one promjenljive koje
su trenutno u dosegu. Ukoliko se npr. u trenutku kad se sa izvravanjem
programa prelo u funk iju quadri () pokua oitati vrijednost promjenjive
ount iz funk ije main() naredbom print ount bie prijavljena greka.
Naredbom frame mogu se dobiti poda i o tekuoj funk iji, dok se naredbom
ba ktra e dobija hijerarhija svih poziva funk ija koja je dovela izvravanje
programa do date take. Pritom, svakom pozivu funk ije je dodijeljen redni
broj, pri emu poziv tekue funk ije ima broj 0, poziv funk ije iz koje je
pozvana tekua funk ija broj 1 i tako redom. Da bi se moglo pristupiti
nekoj promjenljivoj iz funk ije koja nije tekua, treba se prvo privremeno
pozi ionirati na odgovarajui nivo hijerarhije poziva, to se radi opet naredbom frame, s tim to se ovdje navodi argument i to broj koji je dodijeljen toj funk iji u hijerarhiji. Dakle, za oitavanje vrijendosti promjenljive
ount iz main() funk ije bi trebalo prvo izvriti naredbu frame 1, a potom
naredbu print ount. Alternativno, kretanje kroz hijerahiju poziva moe
se vriti naredbama up odn. down kojima se pomjera za po jedan nivo navie odn. nanie u hijerarhiji. Tako se u posmatranom primjeru ispisivanje
vrijednosti promjenljive ount moglo postii i sekven om naredbi up, print
ount. Treba primijetiti da se kretanjem kroz stek ne remeti tok izvravanja
programa, tj. da kad se izda neka naredba za nastavak izvravanja programa
gdb se automatski vraa u najnii nivo hijerarhije i izvravanje programa se
nastavlja od take u kojoj se bilo stalo. U vezi sa hijerarhijom poziva treba
jo pomenuti i da se varija ijama naredbe info mogu dobiti neke korisne
informa ije - tako se npr. naredbom info args u svakom trenutku moe
dobiti spisak vrijednosti argumenata tekueg poziva (neoptereen ostalim informa ijama koje se inae dobijaju uz njega naredbom frame), a naredbom
info lo als se moe dobiti spisak vrijednosti svih lokalnih promjenljivih u
tekuem pozivu.
Koristei gdb mogue je i izmijeniti nain izvravanja programa. Naredbom
set variable koju slijede ime promjenljive, znak jednakosti i nova vrijednost vri se izmjena vrijednosti promjenljive. Naredbom jump koju slijedi
spe ika ija linije koda skae se sa tekue take u izvravanju programa na

GNU gdb debager

38

zadatu liniju. Naredbom return vri se trenutni povratak iz tekue funk ije
(ako je funk ija deklarisana da vraa neku vrijednost, onda se obavezno iza
ove naredbe mora zadati neka povratna vrijednost).
Na kraju, ukoliko se eli u nekom trenutku tokom debagovanja pogledati
listing mainskih instruk ija u koje je preveden posmatrani program, to se
moe uraditi naredbom disassemble. Sintaksa asemblera je ve pomenuta
AT&T sintaksa.
Mada je u gdb -u uloeno dosta napora da se korienje debagera uini jednostavnijim, ipak stalno ku anje komandi moe biti zamorno. Za programere
koji su navikli na debagovanje u nekom grakom okruenju reenje je GNU
DDD (Data Display Debugger ). Radi se praktino o grakom omotau
oko gdb -a, gdje se komande gdb -a mogu izdavati preko menija i toolbar -a,
a prekidne take postavljati ili vrijednosti promjenljivih i izraza oitavati
pomou mia. Primjer sesije sa DDD -om je prikazan na sli i 6.1. Treba
uoiti kako se u donjem dijelu prozora vidi gdb -ov prompt u kome se moe
sa gdb -om raditi na uobiajeni nain, ku anjem komandi.
Meutim, DDD spada u onu grupu GNU programerskih alata koji se obino
ne isporuuju uz UNIX distribu ije, ve se moraju naknadno nabavljati i
instalirati. Zbog te injeni e, kao i zato to je prirodno da se debagovanje vri
u okruenju u kome se obavljaju ostali programerski zada i, najbolje je za
ovu svrhu koristiti ema s, koji u odgovarajuem reimu rada podrava slian
nain debagovanja kao i DDD. Naime, u Tools meniju ema s -a postoji op ija
Debugger... kojom se pokree gdb, pri emu interak ija sa njime ide kroz
poseban ema s bafer. Kao i kod pokretanja make -a iz ema s -a, u minibuer u je nakon pokretanja ove komande mogue zadati parametre komandne
linije za pokretanje debagera (obavezno je navesti bar ime programa), nakon
ega se otvara prozor za interak iju sa njime.
U trenutku kada je pokrenut debager, meni za fajlove koji sadre kod dobija
podmeni Gud3 sa komandama debagera. Stavkama iz ovog menija, naravno
i odgovarajuim kombina ijama tastera, mogue je postaviti prekidnu taku
na liniju koda u kojoj se nalazi kursor, upravljati tokom izvravanja programa, odtampati vrijednost promjenljive ili izraza nad kojom se nalazi
kursor i tome slino. Tokom debagovanja, ema s prozor je podijeljen na
dva potprozora (jedan za debager, drugi za fajl sa kodom), kao na sli i 6.2.
Pritom, komande koje se izdaju u potprozoru sa debagerom poinju sekven om C- (npr. komanda up se poziva sa C- <), dok komande koje se izdaju
u potprozoru koji sadri kod poinju sekven om C- C-a (npr. komanda up
3

grand unied debugger

39

Slika 6.1: Primjer sesije sa DDD -om.


se ovdje poziva sa C- C-a <). Izuzetak je komanda za postavljanje prekidne
take, koja se u prozoru sa kodom zadaje sa C-x koga slijedi pritisak na Spa e
taster.
Pretjerano korienje debagera je loa navika; umjesto toga, mnogo bolje je
greke otkrivati paljivim pregledom samog koda. Ipak, u situa ijama kada
je upotreba debagera neizbjena, gdb je, bilo da se koristi iz komandne linije
ili iz nekog od pomenutih okruenja, moan alat za obavljanje tog zadatka.
Osim onih pomenutih kroz ovo poglavlje, gdb, kao i drugi ovdje razmatrani
alati, ima jo mnogo drugih korisnih op ija o kojima se moe (i treba) vie

GNU gdb debager

40

Slika 6.2: Primjer sesije sa gdb -om u ema s -u.


proitati u originalnoj dokumenta iji.

Poglavlje 7

GNU gprof

program za

analizu izvravanja programa

Korak u razvoju programa koji slijedi debagovanje jeste optimiza ija. Ve


je reeno da na polju lokalne optimiza ije g prevodila moe dosta toga
da uradi. to se globalne optimiza ije tie, tu opet vai savjet iz poslednjeg pasusa poglavlja o gdb -u: najbolji rezultati se mogu postii paljivim
pregledom samog koda i eventualnim unapreenjima na planu korienih
algoritama. Ipak, postoje i alati koji mogu da analiziraju izvravanje programa i izraunaju neke pokazatelje u pogledu njegove ekasnosti; takvi alati
se oznaavaju imenom proler -i i GNU varijanta ovog programa jeste gprof.
Da bi neki program mogao biti analiziran pomou gprof -a, potrebno je i
prilikom prevoenja i prilikom linkovanja u listu op ija prevodio a dodati i
-pg. Ovu op iju je potrebno ukljuiti kako prilikom generisanja objektnih
fajlova tako i prilikom generisanja izvrnog fajla (tj. linkovanja). Nakon
ovoga treba normalno izvriti program; izvravanje programa e tei sporije
nego inae jer e prilikom izvravanja biti prikupljane i informa ije potrebne
za analizu koje e biti upisane u fajl pod imenom gmon.out u direktorijumu
iz koga je pokrenut program. Prilikom kasnije analize treba voditi rauna
na koji nain je izvravan program - djelovi programa koji nisu aktivirani
nee biti zastupljeni u izvjetaju prola ije, naravno ne zato to su posebno
ekasno napisani ve zato to se kroz njih nije prolazilo.
Obzirom da je pokazni primjer izuzetno jednostavan, za potrebe demonstriranja rada proler -a test program e biti neto izmijenjen u smislu da nee
rjeavati jednu jednainu sa datim koe ijentima ve e umjesto toga generisati veliki broj (u ovom sluaju 1000000) pseudo-sluajno odabranih trojki

GNU gprof

42

program za analizu izvravanja programa

koe ijenata, rjeavati jednainu za svaku od tih trojki i onda uvrtavati


rjeenja u jednainu u ilju provjere njihove ispravnosti. Fajl test. e za
ovako postavljen zadatak imati oblik:
#in lude
#in lude
#in lude
#in lude
#in lude

<stdio.h>
<stdlib.h>
<math.h>
<assert.h>
"quadri .h"

/*
* Program testira funk iju za odredjivanje realnih korijena kvadratne
* jedna ine. Koefi ijenti jedna ine se generisu kao slu ajni brojevi iz
* datog intervala, a onda se poziva funk ija za odredjivanje korijena
* da bi se potom korijeni uvrstili u jedna inu i ispitivalo se koliko
* tako dobijena vrijednost odstupa od 0. Ni za jednu kombina iju
* koefi ijenata ne smije ova vrijednost pre i zadatu ta nost; u
* suprotnom se program prekida i smatra se da metoda nije dovoljno
* pre izna.
*/
int
main ()
{
onst int n = 1000000;
/* Broj testova. */
onst double lo = -10, hi = 10;
/* Opseg iz koga e uzimati vrijednosti
* koefi ijenti jedna ine. */
onst double epsilon = 0.000001;
/* Ta nost na koju se vrsi testiranje. */
double a, b, ;
/* Koefi ijenti kvadratne jedna ine. */
int ount;
/* Broj realnih rjesenja jedna ine. */
double x0, x1;
/* Realna rjesenja jedna ine. */
int i;
/* Broja u petljama. */
/*
* Zadati broj puta...
*/
for (i = 0; i < n; i++)
{
/*
* ...generisu se slu ajne vrijednosti koefi ijenata iz datog
* opsega,...
*/
a = lo + (hi - lo) * rand () / RAND_MAX;
b = lo + (hi - lo) * rand () / RAND_MAX;
= lo + (hi - lo) * rand () / RAND_MAX;
/*
* ...odredjuju se realna rjesenja jedna ine...
*/
ount = quadri (a, b, , &x0, &x1);
/*
* ...i ispituje se ta nost rjesenja.
*/
swit h ( ount)
{

43

ase 1:
assert (fabs (a * x0 * x0 + b * x0 + ) < epsilon);
break;

}
}

ase 2:
assert (fabs (a * x0 * x0 + b * x0 + ) < epsilon);
assert (fabs (a * x1 * x1 + b * x1 + ) < epsilon);
break;
}

return 0;

Kada se prevede i izvi ovaj program, proler se pokree naredbom:


gprof -b test

tj. iza imena programa navode se op ije i ime izvrnog fajla. Pritom je
vano da se proler pokrene iz istog direktorijuma iz koga je pokretan i
izvrni program odn. iz onog direktorijuma u kome se nalazi fajl gmon.out.
Op iju -b treba uvijek koristiti jer e u suprotnom proler pored rezultata
analize uvijek ispisivati i objanjenje o nainu interpretiranja rezultata.
Postoje dva osnovna skupa rezultata koje ispisuje proler i to tzv. at prole,
te graf poziva. Za dati primjer ispis proler -a bi bio oblika
Flat profile:
Ea h sample ounts as 0.01 se onds.
%
umulative
self
self
time
se onds
se onds
alls ns/ all
72.12
1.50
1.50
27.88
2.08
0.58 1000000
580.00

total
ns/ all
580.00

name
main
quadri

Call graph
granularity: ea h sample hit overs 4 byte(s) for 0.48% of 2.08 se onds
index % time

self

hildren

alled

name

<spontaneous>
1.50
0.58
main [1
0.58
0.00 1000000/1000000
quadri [2
----------------------------------------------0.58
0.00 1000000/1000000
main [1
[2
27.9
0.58
0.00 1000000
quadri [2
----------------------------------------------[1

100.0

Index by fun tion name


[1 main

[2 quadri

44

GNU gprof

program za analizu izvravanja programa

Razmotrimo prvo at prole. U poslednjoj koloni dato je ime funk ije na
koju se poda i iz odgovarajueg reda odnose. U prvoj koloni se nalazi pro enat ukupnog vremena tokom izvravanja programa koje je provedeno u
posmatranoj funk iji. U drugoj koloni je dato zbirno vrijeme, odn. vrijeme
koje je tokom izvravanja programa provedeno u datoj funk iji i funk ijama
koje su iznad nje na listi, dok je u treoj koloni dato vrijeme provedeno
u samoj funk iji. U etvrtoj koloni nalazi se broj pozivanja te funk ije u
programu. U petoj koloni dato je prosjeno vrijeme izvravanja funk ije
po jednom pozivu, u pikosekudnama. Ovo vrijeme se odnosi na kod same
funk ije, ne i na pozive nekih drugih funk ija iz nje, dok je ukupno vrijeme
po pozivu provedeno u samoj funk iji i funk ijama koje su iz nje pozivane
dato u estoj, pretposlednjoj koloni.
Pokazni primjer je opet veoma jednostavan i pravolinijske strukture, tako
da su gornji poda i sasvim oekivani. Ipak, ak i na tako jednostavnom
primjeru interesantno je uporediti odnos vremena utroenog na generisanje
koe ijenata i ispitivanje ispravnosti rjeenja sa vremenom samog rjeavanja
jednaine - moda pomalo neoekivano, ispostavlja se da rjeavanje jednaine
traje krae. Kod komplikovanijih programa, at prole omoguava da se vrlo
lako uoe djelovi programa u kojima se potroi najvie vremena i koje prema
tome ima najvie smisla optimizovati.
Graf poziva predstavlja sline informa ije kao i at prole, samo interpretirane na neto drugaiji nain. Kod ovog grafa su, razdvojeni linijama sa
rti ama, dati poda i za svaku funk iju ponaosob o funk ijama iz kojih je ona
pozvana i o funk ijama koje ona poziva. Svakoj funk iji je dodijeljen redni
broj (ispisan u uglastim zagradama) i u prvoj koloni je oznaena funk ija
na koju se dati blok podataka odnosi. U drugoj koloni za tu funk iju je dat
pro enat vremena ukupnog izvravanja programa koji je proveden u datoj
funk iji i funk ijama koje su iz nje pozvate. U treoj koloni je dat iznos vremena proveden u posmatranoj funk iji, ne raunajui vrijeme u funk ijama
koje su iz nje pozvate, koje je dato u etvrtoj koloni. U narednoj koloni je
dat broj pozivanja te funk ije, dok je u poslednjoj koloni dato ime funk ije
sa indeksom iz liste. Za funk ije iz kojih je pozivana funk ija posmatrana
u datom bloku grafa poziva, vrijeme u treoj koloni se odnosi na vrijeme
provedeno u pozivima posmatrane funk ije, a u etvrtoj koloni na vrijeme
provedeno u funk ijama pozivanim iz posmatrane funk ije. U pretposlednjoj
koloni nalaze se dva broja, od kojih se prvi odnosi na broj poziva posmatrane funk ije iz funk ije iz koje je ona pozivana, dok se drugi odnosi na ukupan broj nerekurzivnih poziva posmatrane funk ije. Tako se npr. u drugom
bloku gornjeg grafa vidi da je iz funk ije main() funk ija quadri () pozivana

45

1000000 puta dok je istovremeno ukupan broj nerekurzivnih poziva funk ije
quadri takoe jednak 1000000. Za funk ije koje su pozivane iz funk ije posmatrane u datom bloku grafa poziva trea kolona predstavlja vrijeme provedeno u toj funk iji, ne raunajui funk ije koje su iz nje pozivane i za koje
je vrijeme provedeno u njima dato u etvrtoj koloni. U petoj koloni su opet
data dva broja od kojih prvi predstavlja broj poziva te funk ije iz funk ije
posmatrane u datom bloku, dok je drugi ukupan broj nerekurzivnih poziva
te funk ije. U prvom bloku gornjeg grafa opet se iz ove kolone vidi da je
funk ija quadri () pozivana 1000000 puta iz funk ije main() dok je ukupan
broj nerekurzivnih poziva te funk ije takoe jednak 1000000. U sluajevima
uzajamno rekurzivnih ili samorekurzivnih poziva u svakom bloku se izdvaja
po jedan red za svaki iklus ovakvog tipa.
Ukoliko se prilikom pozivanja proler -a navede op ija -l, onda su jedini e
prikazivanja pojedinane linije koda umjesto funk ija. Da bi ova op ija mogla
da se koristi, potrebno je prilikom prevoenja pored -pg op ije zadati i -g
ili -ggdb op iju. Op ija -l proler -a je korisna uglavnom za at prole, kod
grafa poziva je korienje funk ija kao jedini a prikaza znatno informativnije.
Sa druge strane, ukoliko se pri prevoenju zada i op ija -a, istom prilikom e
u fajl pod imenom bb.out biti upisan broj prolaza kroz svaki blok koda, to
takoe moe biti veoma korisna informa ija za optimiza iju programa. Ovaj
fajl nije meutim u previe itljivom formatu, pa je bolje konvertovati ga u
format koji gprof moe da obradi, to se radi pomou skripta bb onv.pl.
Ovaj skript se naalost obino ne nalazi u distribu ijama UNIX -a, ve je
potrebno izvaditi ga iz originalne verzije GNU binutils paketa, koji u sebi
obuhvata i gprof. Kada se instalira ovaj skript (dovoljno ga je staviti negdje
u path ), tada prvo treba konvertovati format fajla bb.out i smjestiti rezultat
re imo u fajl bb.gmon.out naredbom:
bb onv.pl <bb.out >bb.gmon.out

a onda pokrenuti gprof naredbom:


gprof -l -A -x -s test gmon.out bb.gmon.out

Efekat op ije -l je, kao to je ve reeno, da se prola ija sprovodi nad


pojedinanim linijama koda. Op ija -A oznaava da kao rezultat analize
treba da budu ispisani fajlovi sa kodom sa naznaenim brojem prolazaka
kroz pojedine segmente koda. Op ija -x oznaava da su segmenti koda koji
e biti oznaeni pojedinane linije, a ne itavi blokovi koda. Na kraju, op ija

46

GNU gprof

program za analizu izvravanja programa

-s oznaava da kao ulaz u gprof treba umjesto samo gmon.out fajla korisiti
vie fajlova, ija e imena biti navedena iza imena izvrnog programa koji
se analizira (ovi fajlovi e biti povezani u fajl sa imenom gmon.sum i taj
fajl e biti korien kao ulaz u gprof. Jedan segment izlaza ovakve naredbe
na pokaznom primjeru za fajl quadri . ima oblik (sa komentarima runo
izbaenim radi bolje preglednosti):
1000000 ->
628162
628162
628162
628162
628162

->
->
->
->
->

371838 ->
##### ->
##### ->

if (dis r > 0)
{
dis r = sqrt (dis r);
mul = 1 / (2 * a);
*x0 = (-b + dis r) * mul;
*x1 = (-b - dis r) * mul;
return 2;
}
if (dis r == 0)
{
*x0 = -b / (2 * a);
return 1;
}

Iz gornjeg listinga se vidi da je prva if naredba izvrena 1000000 puta, dok


su naredbe u tijelu ove if konstruk ije izvrene 628162 puta. Druga if
naredba je pak izvrena 371838 puta; naredbe u tijelu te konstruk ije nisu
izvrene nijednom, to znai da nije bilo nijedne kombina ije koe ijenata
koja bi dala jedno realno rjeenje.
Sve informa ije koje generie proler, a koje se tiu vremena, prikupljaju
se tako to se nakon kratkih regularnih intervala program zaustavlja i gleda
se gdje se u tom trenutku unutar njega nalazi (duina intervala je uvijek
odtampana na poetku at prole izvjetaja). Na taj nain ove informa ije
treba uzimati sa odreenom rezervom, jer su podlone statistikim devija ijama. Da bi se obezbijedilo da one budu pouzdanije, poeljno je da se program izvrava to due. Sa druge strane, informa ije koje se odnose na broj
poziva funk ije ili broj prolaza kroz neki blok koda se dobijaju brojanjem,
tako da su u pitanju potpuno tani brojevi.

Poglavlje 8

GNU ar arhiver i kreiranje

biblioteka

Funk ija quadri () iz pokaznog primjera je napisana tako da rjeava pre izno odreen problem nezavisno od konteksta u kome se taj problem javlja.
Zato se moe oekivati da ova funk ija bude korisna i za neke druge programe, a ne samo za konkretan program koji je u pokaznom primjeru uz
nju napisan. Izdvajanjem ove funk ije u poseban fajl znatno je olakano
njeno korienje i u nekim drugim projektima, ali ipak jo uvijek treba svaki
put ukljuivati i prevesti fajl quadri . u svakom projektu u kome e ova
funk ija da se koristi. Bolje rjeenje bi bilo prekompajlirati ovu funk iju, zajedno sa eventualno jo nekim funk ijama sline namjene, i onda je u takvom
obliku ukljuivati u projekte u kojima je potrebna. Skup prekompajliranog
koda ovog oblika naziva se bibliotekom. U zavisnosti od toga kako se taj kod
povezuje sa projektom u kome e funk ije sadrane u bibliote i biti koriene
razlikuju se statike i dinamike biblioteke; u ovom tekstu bie razmotrene
samo statike biblioteke koje nisu nita drugo do skup objektnih fajlova objedinjenih u jedan fajl (uz jo neke dodatne informa ije upisane u taj fajl,
a koje se odnose na sadraj objektnih fajlova, pre iznije na listu funk ija
koje su implementirane u tim fajlovima). Alat koji se koristi za kreiranje
biblioteka na UNIX -u jeste obian arhiver ar. Biblioteka se kreira tako to
se iza imena arhivera navedu odgovarajue komandne op ije, potom ime
biblioteke, a onda imena objektnih fajlova koji e ui u sastav biblioteke.
Po konven iji, ime fajla koji sadri biblioteku na UNIX -u poinje preksom
lib, a ekstenzija za fajlove sa statikim bibliotekama je .a, pa bi naredba
za kreiranje biblioteke od fajla quadri .obj glasila:

GNU ar

48

arhiver i kreiranje biblioteka

ar rusv libquadri .a quadri .o

ar spada u grupu programa kojima se op ije ne navode iza rti e. Op ija


oznaava da arhivu treba kreirati ako ne postoji. Op ija r oznaava da
fajlove koji su nabrojani treba umentuti u arhivu uz zamjenu prethodne
verzije svakog fajla ako takva postoji u arhivi. Op ija u oznaava da u
arhivu treba umetati samo one fajlove koji su noviji od verzije fajla koja
ve eventualno postoji u arhivi. Op ija s oznaava da su fajlovi koji se
dodaju u arhivu objektni fajlovi, te da treba u arhivu dodati i informa ije o
sadraju tih fajlova. Op ija v oznaava da tokom arhiviranja program treba
da prikazuje detaljne informa ije o tome ta radi.
Jednom kada je biblioteka napravljena, da bi se koristila iz nekog projekta
dovoljno je ukljuiti odgovarajui header fajl u fajlove iz kojih se pozivaju
funk ije biblioteke, kao i linkovati projekat sa bibliotekom. U posmatranom
primjeru, fajl quadri .h je ve ukljuen u fajl test. , tako da jedino to
treba uraditi da bi se rekompajlirao projekat, pri emu je ovaj put funk ija
quadri izdvojena u bibliotku, jeste da se navede biblioteka prilikom linkovanja:
g -L. -lquadri -lm -o test test.

Treba uoiti da je ovdje prevoenje fajla test. i linkovanje uraeno u


jednom koraku. Op ijom -L dodat je tekui direktorijum (a to treba da
bude koreni direktorijum projekta) u listu direktorijuma koji se pretrauju
za biblioteke, a op ijom -l navedeno je ime biblioteke (ime biblioteke se
uvijek navodi bez preksa lib i ekstenzije). Ove op ije su pomenute u
poglavlju o g prevodio u.
Na kraju, evo nove (i nalne) verzije makele -a koja obuhvata i kreiranje
biblioteke:
LIBRARY
PROGRAM
SOURCES
CC
CFLAGS
LDFLAGS
LDLIBS

=
=
=
=
=
=
=

quadri
test
quadri .
g
-ansi -Wall
-L.
-lm -l$(LIBRARY)

all: lib$(LIBRARY).a $(PROGRAM)


$(PROGRAM): $(PROGRAM). lib$(LIBRARY).a
$(CC) $(CFLAGS) $(LDFLAGS) -o $ $^ $(LDLIBS)

49

lib$(LIBRARY).a: $(SOURCES:. =.o)


ar rusv $ $^
%.o: %.

$(CC) $(CFLAGS) - -o $ -MMD $<


 p $*.d $*.P; \
sed -e 's/#.*//' -e 's/^[^:*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' <$*.d >>$*.P; \
rm -f $*.d

-in lude $(SOURCES:. =.P)


.PHONY: beauty lean dist
beauty:

lean:

-indent *.h *.
-rm -f *~
-rm -f *.a *.o *.out *.P *.sum $(PROGRAM)

dist: beauty lean


-tar - zv -C .. -f ../$(PROBLEM).tar.gz $(PROBLEM)

Treba uoiti da bi ovaj makele vjerovatno u realnim uslovima bio razbijen


na dva - jedan za biblioteku i jedan za test program. Izmjene u odnosu na
prethodnu verziju makele -a bi trebalo da su razumljive; ovdje e biti samo
pomenuto da je, obzirom na prethodno poglavlje, pod lean iljem dodata
naredba za brisanje fajlova eventualno generisanih gprof -om ili ar -om. Za
ukljuivanje dodatnih fajlova u biblioteku dovoljno je staviti njihova imena
na kraj liste imena u promjenjivoj SOURCES u makele -u.

50

GNU ar

arhiver i kreiranje biblioteka

Poglavlje 9

CVS alat za kontrolu verzija


Tokom razvoja iole veeg softverskog projekta dolazi do situa ija kada je
potrebno odravati paralelno dvije ili vie verzija projekta ili kada je potrebno
vratiti se na prethodnu verziju projekta ili dijela projekta. Runo odravanje
verzija je mogue, ali veoma naporno, pa su zato napravljeni alati koji automatizuju taj postupak. Jedan od alata koji se koriste za ovu namjenu jeste
CVS (Con urrent Versions System ).
Osnovna paradigma u CVS sistemu jeste skladite, odn. loka ija na koju se
smjetaju fajlovi koji sainjavaju projekat, pri emu su svakom faju pridruene
i dodatne informa ije koje omoguavaju da se restaurie bilo koja njegova
ranija verzija. CVS je veoma kompleksan program koji omoguava da vie
programera radi na istom projektu, pa ak i na istom fajlu pri emu je spajanje izmjena maksimalno automatizovano; takoe, CVS omoguava da se
skladite nalazi i na udaljenoj1 loka iji i da mu se pristupa putem TCP/IP
veze. Meutim, podeavanje CVS -a za takav nain rada je razmjerno komplikovan zadatak2 , tako da e na ovom mjestu biti primarno razmatrana
situa ija kada jedan programer koristi CVS na svom raunaru za odravanje
verzija projekta.
Prije nego to se pone sa korienjem CVS -a, mora se ini ijalizovati skladite.
Ovo je potrebno uraditi samo jednom, jedno skladite moe da sadri vei
broj projekata. Ini ijaliza ija skladita se obavlja naredbom oblika:
vs -d ~/ vsroot init
1
2

bilo gdje na Internetu


posebno ukoliko se nastoji da se pristup skladitu ostvari sigurnom konek ijom

52

CVS

alat za kontrolu verzija

Ovdje je vs naravno ime programa. Op ijom -d se navodi loka ija skladita.


Prilikom ini ijaliza ije, taj direktorijum e biti kreiran ukoliko ne postoji.
Po konven iji, koreni direktorijum skladita se zove vsroot i on se mora
postaviti tamo gdje korisnik ima pravo upisa, u ovom sluaju u njegovom
home () direktorijumu. Na kraju komandne linije data je CVS komanda u ovom sluaju komanda init za ini ijaliza iju skladita.
Na slian nain se izdaju i druge CVS komande. Prvo uvijek ide vs kao
ime programa (koji u stvari u sebi sadri vie komandi), potom tzv. globalne
op ije (tj. op ije koje su iste za sve komande), onda ime komande i na kraju
eventualno lokalne op ije (tj. op ije koje su spe ine za datu komandu).
Op ija -d kojom se zadaje loka ija skladita je globalna op ija i ona se obino
navodi svaki put, poto je uz svaku CVS komandu potrebno spe irati tu
loka iju. Alternativno, moe se postaviti environment promjenljiva CVSROOT
da ukazuje na loka iju skladita i onda se ista ne mora navoditi svaki put pri
pokretanju vs programa.
Prvi korak pri upotrebi CVS -a za kontrolu verzija nekog projekta jeste unoenje projekta u skladite, to se obavlja naredbom import. Kada se kreira
osnovna struktura direktorijuma projekta, re imo pokaznog primjera, tada
se unoenje projekta u skladite moe izvriti naredbom (pod pretpostavkom
da smo pozi ionirani u koreni direktorijum projekta):
vs -d ~/ vsroot import -m "Unos projekta u skladiste" quadri MatF start

U gornjoj komandi, naredbu import slijedi lokalna op ija -m kojom se zadaje


poruka koja ostaje sauvana kao podsjetnik ta je prilikom datog slanja u
skladite promijenjeno3 , potom slijedi ime direktorijuma u skladitu u kome
e biti uvan projekat (ovaj direktorijum biva kreiran ispod korenog direktorijuma skladita), zatim neto to treba da ukae na organiza iju koja je
vlasnik projekta i na kraju obavezno treba da stoji start.
Nakon to se unese projekat u skladite, moe se obrisati direktorijum koji je
za njega kreiran. Naime, projekat je sada smjeten u skladitu i dalji rad sa
njime treba da se pone kreiranjem radnog direktorijuma projektu na osnovu
one verzije projekta koja je unesena u skladite.
Dovlaenje radne verzije projekta iz skladita vri se naredbom he kout.
Pod pretpostavkom da smo pozi ionirani u direktorijumu u kome elimo da
napravimo radnu kopiju, ova opera ija bi se izvrila naredbom:
3
ako se ova poruka ne zada u komandnoj liniji, CVS e po izdavanju komande otvoriti
editor oekujui da se poruka unese na taj nain

53

vs -d ~/ vsroot he kout quadri

Ovdje je he kout naredba za kreiranje radne kopije, dok je quadri ime direktorijuma u skladitu koji sadri projekat na kome eli da se radi. Nakon
ovoga u tekuem direktorijumu bie kreiran direktorijum quadri sa radnom kopijom projekta u koji se moe ui i normalno raditi sa projektom.
Treba primijetiti da e ovaj direktorijum, kao i svi njegovi poddirektorijumi,
sadrati pored originalnih fajlova i poddirektorijuma i poddirektorijum pod
imenom CVS - u pitanju su poddirektorijumi u koje CVS smjeta svoje administrativne fajlove i koji se ne smiju mijenjati ili brisati.
Po kreiranju radne kopije se, kako je reeno u prethodnom pasusu, normalno radi sa njome. Nakon to su unesene odreene izmjene, moe se
aurirati verzija projekta u skladitu. Pretpostavimo da je promijenjen fajl
quadri . , kao i makele, u tom sluaju bi slanje izmjena bilo izvreno
naredbom (pod pretpostavkom da se nalazimo u korenom direktorijumu
radne kopije projekta):
vs -d ~/ vsroot ommit -m "Razne izmjene" quadri . Makefile

Ovdje je ommit ime naredbe za slanje izmjena, op ijom -m se opet navodi


propratna poruka (koja naravno treba da je mnogo informativnija nego kako
gore izgleda), a potom imena fajlova koji se auriraju. Alternativno, komanda je mogla da se zada i na sledei nain:
vs -d ~/ vsroot ommit -m "Razne izmjene" .

Naime, ommit komanda, kao i veina drugih CVS komandi, je rekurzivna,


pa kada se izda nad nekim direktorijumom onda e ona biti izvrena nad tim
direktorijumom, svim njegovim fajlovima i rekurzivno nad svim njegovim
poddirektorijumima. U gornjem primjeru, CVS bi tokom tog rekurzivnog
izvravanja ommit naredbe odredio da su samo fajlovi quadri . i Makefile
izmijenjeni, pa bi samo njih i aurirao.
Kada se eli da se aurira radna verzija projekta na osnovu onog to se
nalazi u skladitu, primjenjuje se update komanda. Ovu komandu ima smisla
koristiti samo kada na projektu radi vie programera, jer ako na njemu radi
samo jedan programer, onda ne postoji mogunost da u skladitu ima fajlova
koji su aurniji od onih u radnoj kopiji. Auriranje radne kopije bi u datom
primjeru bilo izvreno naredbom:

CVS

54

alat za kontrolu verzija

vs -d ~/ vsroot update .

Ukoliko na projektu radi vie programera, onda rad treba striktno da se


odvija tako to e se svaki put kada hoe da se nastave aktivnosti na projektu
aurirati radna kopija na osnovu sadraja skladita naredbom update, da bi
se potom radilo na ovoj radnoj kopiji, pa onda jednom kada se zavri sesija
sa projektom sadraj skladita se aurira na osnovu radne kopije naredbom
ommit4 . Redovno korienje update i ommit naredbi je veoma vano kada
na projektu radi vie programera, na taj nain se aurno prati ta drugi rade
i rano otkrivaju eventualne simultane izmjene na istom fajlu.
U podrazumijevanom reimu rada, CVS dozvoljava da vie programera pravi
izmjene na istom fajlu. CVS moe da radi i u ekskluzivnom reimu, sa zakljuavanjem fajlova, ali za tim najee nema potrebe. Kada se po primjeni
naredbe update pokae da je fajl na kome se trenutno radi neko u meuvremenu ve izmijenio i poslao u skladite, CVS e pokuati automatski
da povee te izmjene sa izmjenama koje su napravljene na radnoj kopiji.
Ukoliko ova opera ija uspjeno proe, programer nee ni primijetiti da je
bilo simultanog editovanja; u suprotnom, CVS opet spaja dvije verzije fajla
naznaavajui jasno gdje postoje konikti i ostavljajui programeru da ih
sam rijei, nakon ega treba ommit naredbom da poalje nalnu verziju u
skladite. Ovaj mehanizam praktino u veini situa ija savreno funk ionie,
tako da rijetko ima potrebe za prelaskom na reim rada sa zakljuavanjem
fajlova.
Da bi se naznailo da nee vie da se radi na projektu koji je preuzet iz
skladita, koristi se naredba release. Na pokaznom primjeru, ova opera ija
se moe izvesti naredbom (nakon to se prvo pozi ioniramo u direktorijum
koji je iznad korenog direktorijuma radne kopije):
vs -d ~/ vsroot release -d quadri

Ovdje je release naravno ime komande, lokalna op ija -d (treba uoiti da


nosi istu oznaku kao i globalna op ija za spe i iranje loka ije skladita,
ali da nema konikta jer ih razlikuje pozi ija u komandnoj liniji) oznaava
da treba obrisati radnu kopiju, dok se na kraju komadne linije navodi ime
direktorijuma koji sadri radnu kopiju projekta. Po izdavanju ove komande,
CVS provjerava da li su svi fajlovi iz radne kopije aurirani u skladitu i
4
obino se ovo radi na dnevnoj bazi, tj. na poetku radnog dana se aurira radna
kopija na osnovu sadraja skladita, da bi se na njegovom kraju opet auriralo skladite
na osnovu radne kopije

55

ispisuje odgovarajuu poruku traei da se potvrdi ili poniti namjeravana


ak ija. Ako dobije potvrdu, CVS u skladitu oznaava da na datom projektu
vie niko ne radi i brie radnu kopiju.
Svaku verziju nekog fajla koja se alje u skladite CVS oznaava brojem,
poev od 1.1 pa nadalje. Ovi brojevi se oznaavaju kao brojevi revizija i
nemaju veze sa verzijama projekta (u zavisnosti od toga koliko esto se radi
na pojedinim fajlovima iz projekta bie razliiti i njihovi brojevi revizija).
Postavljanje oznake verzije na pojedine fajlove ili ee na itav projekat
oznaava se u CVS terminologiji tag -ovanjem. Naredba kojom bi se dodijelio
tag re imo imena quadri -1_0_0 itavom projektu bi glasila:
vs -d ~/ vsroot tag quadri -1_0_0 .

Tag se dodjeljuje direktno tekuoj verziji projekta u skladitu, a ne onome


to se nalazi u radnom direktorijumu, pa o tome treba voditi rauna ako
izmeu radnog direktorijuma i skladita postoje razlike.
Komanda he kout ima lokalnu op iju -r koja omoguava da se navede
ime verzije projekta na osnovu koje e biti kreirana radna kopija. Ukoliko
ova op ija nije navedena, komanda naravno kreira radnu kopiju na osnovu
poslednjih revizija fajlova koji sainjavaju projekat.
Porukama koje su prilikom slanja u skladite pridruene pojedinim revizijama fajla moe se pristupiti log naredbom. Tako bi poruke koje su pridruene
fajlu quadri . (uz jo neke dodatne informa ije) bile izlistane naredbom:
vs -d ~/ vsroot log quadri .

Tokom rada na projektu svakako e doi do situa ije da neke fajlove ili direktorijume treba dodati u projekat ili obrisati iz njega. Ovo se radi naredbama
add odn. remove. Da bi fajl ili direktorijum bio dodat u skladite, isti treba
da postoji u radnoj kopiji; da bi bio obrisan iz skladita isti treba da bude
obrisan iz radne kopije. Ovim naredbama se samo naznaava CVS -u da treba
da unese odgovarajue izmjene u skladite, stvarne opera ije e biti obavljene pri narednom izdavanju ommit naredbe. Za razliku od veine drugih
CVS naredbi, naredbe add i remove nisu rekurzivne, to znai da treba da
se izdaju za svaki fajl ponaosob. Ako se npr. odlui da se u biblioteku doda
rjeavanje linearne jednaine i isto implementira u fajlovima linear.h, odn.
linear. , tada bi se unoenje ovih fajlova u skladite sprovelo naredbama
(pod pretpostavkom da se nalazimo u korenom direktorijumu radne kopije):

CVS

56

alat za kontrolu verzija

vs -d ~/ vsroot add linear.h linear.


vs -d ~/ vsroot ommit -m "Dodato rjesavanje linearne jedna ine" .

Tekua verzija fajla iz radne kopije se moe u svakom trenutku uporediti


sa verzijom koja se nalazi u skladitu naredbom diff. Ako hoemo re imo
da uporedimo tekuu verziju makele -a sa onom iz skladita, odgovarajua
komanda bi glasila:
vs -d ~/ vsroot diff Makefile

Nakon ovoga e u formatu UNIX di programa za poreenje fajlova biti


ispisane razlike.
Jednom kada se tag -ovima oznae verzije projekta, CVS prua mogunost
razdvanjanja razvoja projekta na dvije ili vie grana (pri emu je svaka od
njih zasnovana na drugoj verziji), kao i kasnijeg spajanja tih grana. Pretpostavimo da je nakon kreiranja stabilne verzije 1.0.0 projekta iz pokaznog
primjera zapoet rad na dodavanju rjeavanja linearnih jednaina u biblioteku i da je u jednom trenutku stablu projekta dodijeljena verzija 1.1.0.
Pretpostavimo dalje da je otkrivena greka u quadri funk iji i da se eli ista
odmah ispraviti i nainiti raspoloivom korisni ima. Re imo da je ispravka
trivijalna; meutim, poto se intenzivno radi na novim op ijama u bibliote i,
glavna verzija 1.1.0 projekta nije stabilna i najbolje bi bilo nekako napraviti ispravku na verziji 1.0.0 i tu ispravljenu verziju napraviti raspoloivom
korisni ima, a onda ispravku ukljuiti i u glavnu verziju. CVS omoguava
da se ovo elegantno rijei pomou grananja. Prvo je potrebno kreirati radnu
kopiju na osnovu verzije 1.0.0 naredbom:
vs -d ~/ vsroot he kout -r quadri -1_0_0 quadri

Nakon toga treba ui u radni direktorijum i kreirati grananje, to se izvodi


tag naredbom sa -b op ijom:
vs -d ~/ vsroot tag -b quadri -1_0_1

Dalje treba obrisati radnu kopiju verzije 1.0.0 i kreirati radnu kopiju na
osnovu verzije 1.0.1 (prethodno se naravno treba pozi ionirati u direktorijum
iznad direktorijuma sa radnom kopijom):
vs -d ~/ vsroot release -d quadri
vs -d ~/ vsroot he kout -r quadri -1_0_1 quadri

57

Nakon ovoga se normalno radi sa radnom kopijom - sve izmjene bie unoene
u granu 1.0.1 i nee niim uti ati na glavnu granu 1.1.0 razvoja projekta.
Kada se eli da se ispravke napravljene u verziji 1.0.1 ukljue u glavnu granu
projekta (tj. da se spoje razdvojene grane projekta), to se jednostavno moe
uraditi -j (od join ) op ijom update naredbe. Pod pretpostavkom da se
nalazimo u korenom direktorijumu radne kopije kreirane na osnovu glavne
1.1.0 verzije projekta, povezivanje bi se izvrilo naredbom:
vs -d ~/ vsroot update -j quadri -1_0_1 .

Ukoliko se prilikom povezivanja javi neki konikt, isti e biti razreavan na


nain koji je ve opisan ranije.
ema s ima ugraenu podrku za rad sa odreenim brojem CVS komandi. U
Tools meniju ema s -a postoji Version Control podmeni koji sadri odgovarajue stavke. Kada je fajl koji se edituje u ema s -u dio radne kopije,
u statusnoj liniji je ispisana oznaka sistema za kontrolu verzija5 , u ovom
sluaju CVS -a, kao i broj revizije fajla. Izmeu ove dvije oznake stoji - ukoliko verzija fajla na disku nije modikovana u odnosu na verziju u skladitu,
odnosno : ukoliko jeste modikovana. Osnovna komanda za rad sa CVS om u ema s -u jeste C-x C-q koja odgovara ommit naredbi CVS -a. Po
izdavanju ove naredbe, verzija tekueg fajla u skladitu se aurira prema
sadraju fajla u radnoj kopiji. Pritom, prvo se otvara potprozor u kome se
unosi propratna poruka i tek poto se u ovom prozoru izda komanda C-
C- fajl biva odaslat u skladite. U potprozoru za unos propratne poruke
moe se koristiti i komanda M-n kojom se unosi ista propratna poruka koja
je koriena za prethodni fajl. Ukoliko je eventualno fajl koji se komandom
C-x C-q namjerava poslati u skladite tamo ve izmijenjen onda e ema s
umjesto ommit CVS naredbe izvriti update naredbu i na taj nain ukljuiti
izmjene iz skladita u tekui fajl.
Nazivi komandi koji se odnose na kontrolu verzija se unekoliko razlikuju od
naziva komandi CVS -a. Tako se npr. komanda za dodavanje fajla odn. direktorijuma u skladite u ema s -u oznaava kao Register komanda, dok je
naziv za istu komandu u CVS -u add. To je zato to je odgovarajui podsistem ema s -a generiki, tj. kako je ve pomenuto podrava pored CVS -a i
druge sisteme za kontrolu verzija. Ipak, veina komandi CVS -a je prisutna,
a takoe postoji poseban reim rada sa direktorijumima, koji se aktivira
komandom C-x v d i u kome je mogue CVS opera ije obaviti nad vie
fajlova istovremeno. Naravno, sve komande su detaljno opisane u ema s
5

ema s podrava i druge sisteme za kontrolu verzija pored CVS -a

58

CVS

alat za kontrolu verzija

dokumenta iji, pa istu treba konsultovati u sluaju nejasnoa. Pored ovog


osnovnog reima za rad za sistemom za kontrolu verzija koji se uvijek isporuuje uz ema s, postoji i dodatak koji je bolje prilagoen radu sa CVS om i koji se naziva p l- vs, pa se isti po potrebi moe instalirati i koristiti na
slian nain kao osnovni reim.
Ovim poglavljem se zavrava pregled GNU programerskih alata, na osnovu
koga bi trebalo da se stekla predstava o tome koliko je UNIX, opremljen
ovim alatima, mono okruenje za programiranje6 . tavie, svi ovi alati se
kontinualno unapreuju i, to je najvanije od svega, pravili su ih i odravaju
ih programeri za programere, to obezbeuje da ovi alati jesu i da e biti
meu najproduktivnijim postojeim sistemima za obavljanje poslova vezanih
za programiranje.

6
treba imati na umu da jedan broj GNU alata nije predstavljen u ovom pregledu:
npr. ex i bison alati za generisanje parsera ili auto onf i automake alati za automatsko
kongurisanje projekta, odnosno kreiranje makele-ova

You might also like