# Ehitamine ja projektihaldus

Käesolev peatükk tegeleb ainult kompileeritud projektidega, näiteks C++, C&Java; ja Fortrani projektidega. Skriptikeelte (nt. Python ja PHP) projektid käituvad märgatavalt teistmoodi.

Siin leiab järgmist infot:

- &automanag;i kokkuvõte, mis sisaldab &automanag;i üldist ülevaadet,

- Automake'i halduri kasutamine, mis kirjeldab &automanag;i kasutamise põhitõdesid.

## &automanag;i kokkuvõte

Ehitamissüsteemide peatükis andsime kerge ülevaate ehitamissüsteemidest, mis on levinud &UNIX; süsteemides. Nüüd vaatleme kõike seda veidi lähemalt.

Valitseb mõningane segadus, kuidas selliseid asju üldse nimetada. &GNU; kasutab väljendit ehitamissüsteemid (inglise keeles 'build systems'), kui kõne all on Automake, Autoconf ja Libtool. QMake nimetab ennast tööriistaks Makefilde'ide loomiseks erinevatele kompilaatoritele ja platvormidele. &kde; pruugib tihti mõistet projektihalduse süsteemid. Me kasutame seda mõistet laiemas tähenduses kirjeldamaks &tdevelop;i sisseehitatud keskkondi, mida kasutatakse sinu projektide korraldamiseks ja ehitamiseks. Käesolevas osas on aga vaatluse all ennekõike automatiseeritud ehitussüsteemid.

### Automatiseeritud ehitussüsteemi vajadus

Kui sul on lihtne C-keeles kirjutatud Hello World programm, võid selle kompileerida ja linkida &gcc; käsuga `-o hello hello.c` ning käivitada käsuga `./hello`, nii et `Makefile` pole üldse vajalik.

Kui sul on mitme mooduli ja päisefailiga C rakendus, mida sa kasutad ainult enda masinas (&ie; tegemist on nii-öelda koduse rakendusega), on vaja ainult väga lihtne `Makefile`, mille saab hõlpsasti ka käsitsi kirja panna (täpsemat infot annab käsk `info make`).

Raskused algavad siis, kui:

- sinu lähtekood, dokumentatsioon, graafika, helid, tõlked, andmefailid &etc; asuvad mitmes erinevas kataloogis,

- sul on kataloogide ja alamkataloogide hierarhia,

- sa kasutad teeke, mis ei kuulu traditsiooniliselt &UNIX; koosseisu, näiteks &Qt; objektiteek või &kde; teegid,

- sa kasutad eelprotsessorit teatud osa lähtekoodi genereerimiseks, näiteks Qt MOC-i eelkompilaatorit,

- sa kavatsed levitada oma rakendust üle kogu maailma, ka inimestele, kel ei pruugi olla sama &UNIX;/&Linux; süsteem, tarkvara ja riistvara nagu sul,

- sa eeldad automatiseeritud paigaldamis- ja eemaldamistööriista,

- sinu siht on muuta oma rakendus &kde; töökeskkonna osaks.

Kui sinu ees seisab mõni või ka kõik mainitud probleemidest, läheb sul arvatavasti vaja ehitussüsteemi. Toodud näiteks kasutasime &gcc;-d programmi Hello World kompileerimiseks ja ehitamiseks, kuid mitte kõik C kompilaatorid ei kanna nime &gcc;. See tähendab, et kui levitad oma rakendust ka kellelegi, kes kasutab mõnda muud C kompilaatorit, peab sinu Makefile kuidagi oskama toda kompilaatorit ära kasutada, sest muidu sinu rakendus lihtsalt ei kompileeru — ja see oli veel väga lihtne näide raskustest.

Ehitussüsteem selgitab need erinevused sinu eest ise välja:

- see kontrollib, et teegid, mida vajad, oleksid saadaval kõigis sihtmasinates,

- uurib automaatselt läbi kõiki sinu rakenduse kataloogid, et leida failid, mida on vaja eeltöödelda, kompileerida ja paigaldada,

- paigaldab sinu rakenduse komponendid korrektsetesse sihtkataloogidesse, tagades muu hulgas, et

- vajaduse korral luuakse sihtmasinas puuduvad kataloogid.

Lühidalt öeldes pakub ehitussüsteem kindlad ja turvalised meetodid, et sinu rakendust oleks võimalik kompileerida ja paigaldada mis tahes masinas. Nagu juba projektihalduse süsteemide tutvustuses mainitud, pakub &tdevelop; kolme automatiseeritud ehitussüsteemi ning võimalust luua ise enda Makefile (projekti nimele klõpsates näed rohkem infot):

- Automake'i projektid, mis kasutavad &GNU; standardseid arendustööriistu.

- QMake'i projektid, mis kasutavad Trolltechi QMake'i projektihaldurit.

- ANT projektid, mis kasutavad Apache'i ANT projektihaldurit &Java; arenduseks.

- Kohandatud projektid, mille korral pead ise `Makefile`'ide eest hoolt kandma.

Üks neist neljast võimalusest tuleb valida projekti loomise ajal ja et valikut on hiljem raske muuta, tasuks neid kaaluda juba enne projekti loomaasumist.

### Autoconf/Automake/Libtool'i õppevahendid

&GNU; ehitussüsteemi (`Autoconf`, `Automake` ja `Libtool`) kohta, mida &automanag; kasutab, on mitu õppematerjali.

- Lühike autoconfi õppematerjal Christopher W. Curtise sulest on saadaval &tdevelop;i koduleheküljel. See põhiteemaks on peamised sammud `Makefile`'i muutmisel.

- Põhjalikuma õppematerjali leiab suures õppematerjalide kogumikusDeveloping software with GNU.

- Mõistagi on ka kuulus Goat Book pealkirjaga Autoconf, Automake, and Libtool. See on väga hästi kirjutatud kokkuvõtlik sissejuhatus &GNU; 'auto'-tööriistade kasutamisel.

### Mida &automanag; teeb?

&appwizard; loob mõned esialgsed failid `Makefile.am`, kui lood sellist tüüpi uue projekti, mis kasutab &GNU; ehitussüsteemi, näiteks C++ KDE Rakenduse raamistik. Arendustegevuse käigus loob &automanag; kõik muud failid `Makefile.am` projektidele, mis kasutavad &GNU; ehitussüsteemi, ja haldab neid kõiki, olgu nende loojaks siis &appwizard; või &automanag;.

Üks `Makefile.am` luuakse iga sinu projekti kataloogi kohta, kus leidub kompileeritavaid või paigaldatavaid faile. See sisaldab sinu määratlusi failide kompileerimiseks, ehitamiseks ja paigaldamiseks ning viiteid kõigile alamkataloogidele, kus on samuti oma `Makefile.am` ning failid, mida on vaja kompileerida, ehitada ja paigaldada.

Sinu projekti kataloogid ja lähtefailid võivad olla mis tahes sügavuseni struktureeritud, kuid sa võid muidugi eelistada ka nii-öelda lamedat struktuuri, kus kõik alamkataloogid asuvad tipptasemel.

&GNU; ehitussüsteemi eesmärk on luua lähtekoodifailide struktuurid, mida saab kompileerida, ehitada ja paigaldada mis tahes &UNIX; või &Linux; süsteemis järgmiste lihtsate käskudega:

    ./configure
    make
    make install    # Tavaliselt administraatori ("root") õigustes.

ja eemaldada käsuga `make uninstall` (tavaliselt administraatori (root) õigustes).

Kuidas see käib? `configure` on õieti skript, mis

- selgitab välja selle süsteemi iseärasused, kus ta tööle pannakse (nt. kasutatava kompilaatori ja teegid ning nende asukoha), ja seejärel

- loob rekursiivsed `Makefile`'id, täites asendused vastavates `Makefile.in` failides.

`Makefile.in` on sisendfailid (inglise keeles on sisend 'input') — mallid, mis annavad loodavatele `Makefile`'idele teatud infot süsteemi kohta. Neid genereerib tööriist `Automake` failidest `Makefile.am`.

Protsessi `Makefile.am`'ist (`.am` tähendabki Automake'i mallifaili) `Makefile`'ini korraldab automaatselt &tdevelop;i &promanag;, kasutades selleks tööriista `autoconf`, `M4` makrosid ja muid salapäraseid asju, mida me siinkohal pikemalt ei puuduta.

Käsk `make` võtab töölehakkamisel niisiis kasutusele aktiivses keskkonnas saadaolevad komponendid (kompilaator, teegid jne.). Samuti paigutab `make install` sinu rakenduse komponendid (käivitatavad failid, dokumentatsioon, andmefailid jne.) antud keskkonnale sobivatesse asukohtadesse.

Kui levitad oma rakendust tarball'ina (üks tihendatud fail, mille &tdevelop; sinu eest loob), sisaldab see faile `Makefile.in` ja skriptifaili `configure`, nii et selle hankija võib sinu rakenduse kompileerida, ehitada ja paigaldada, ilma et tema masinas oleks olmeas `Automake`, `Autoconf` või &tdevelop;. Kaasatud on ka failid `Makefile.am`, kui hankija peaks soovima mingil põhjusel midagi lähtekoodis muuta.

Reeglid on tublisti teistsugused, kui levitad rakendust veebipõhise lähtekoodihoidla vahendusel (näiteks &kde; &cvs;).

### Automake'i halduri tegevuse kokkuvõte

- Tekitab failid `Makefile.am` alamkataloogides ehk alamprojektides.

- Uuendab projekti struktuuri muutumisel faile `Makefile.am`.

- Uuendab failide lisamisel projekti või nende eemaldamisel faile `Makefile.am`.

- Tuvastab definitsioonid, kuidas erinevaid faile ehitada või paigaldada ning muudab vastavalt faile `Makefile.am`.

- Tuvastab ehitamisel või paigaldamisel kasutatavad parameetrid (⪚ teekide nimed) ning tagab, et neid kasutatakse vajalikes kompileerimis- ja ehitamisetappides.

### Automake'i failide sisu

`Makefile.am` sisaldab ridu muutujate nimedega, millele järgneb võrdusmärk ja failide või parameetrite väärtuste nimekiri. Muutujad on kaheosalised nimetused, näiteks `bin_PROGRAMS`, `minurakendus_SOURCES` või `kdelnk_DATA`. Teist osa nimetatakse põhiosaks ning see tähistab midagi, mida ehitada või paigaldada. Esimene osa on prefiks, mis tähistab:

- kataloogi, kus paigaldus sooritada (⪚ `bin`),

- täpsustit põhiosale (⪚ `minurakendus` `SOURCES` korral annab märku, et lähtekoodifailid, mis on toodud muutuja `minurakendus_SOURCES` järel, on vajalikud `minurakendus`'e ehitamiseks),

- spetsiaalne prefiks `noinst` (lühend sõnadest no installation ehk 'paigaldamine puudub') loetleb tavaliselt programmi päisefaile (`.h`),

- samuti spetsiaalne prefiks `EXTRA` loetleb konfiguratsioonist sõltuvaid asju.

Täpsemat infot tööriista `Automake` ja failide `Makefile.am` kohta annab `info Automake`.

Põhimõtteliselt loob ja uuendab &automanag; muutujate nimesid ja failide või parameetrite nimekirju. Vaatame näiteks järgmist faili `Makefile.am`, mis käib tüüpilise rakenduse `minurakendus` kohta (kommentaarid on eestikeelsed).

    ## minurakendus'e Makefile.am

    # see on paigaldatav programm.  Seda nime kasutatakse
    # kõigis Makefile.am muutujates
    bin_PROGRAMS = minurakendus

    # määrab X, qt ja KDE kaasamise asukoha
    INCLUDES = $(all_includes)

    # teekide otsingutee.
    minurakendus_LDFLAGS = $(KDE_RPATH) $(all_libraries)

    # teegid, millega lingitakse.
    minurakendus_LDADD   = $(LIB_KFILE) $(LIB_TDEPRINT)

    # milline lähtekood minurakendus'e jaoks kompileerida
    minurakendus_SOURCES = main.cpp minurakendus.cpp minurakendusview.cpp

    # projekti päisefailid
    noinst_HEADERS = minurakendus.h minurakendusview.h

    # automoc tegeleb kõigi metalähtekoodifailidega (moc)
    METASOURCES = AUTO

    KDE_ICON = minurakendus

    # siia läheb kdelnk-fail
    kdelnkdir = $(kde_appsdir)/Utilities
    kdelnk_DATA = minurakendus.desktop

    # siia läheb XML-GUI resssursifail
    rcdir = $(kde_datadir)/minurakendus
    rc_DATA = minurakendusui.rc

    AM_CXXFLAGS = -DMY_C++_PREPROCESSOR_OPTION

Nagu näed, seisab sageli võrduse paremal poolel `$(xxx)`. Need on keskkonnamuutujad, mis on defineeritud tegelikus &kde; keskkonnas ja asendatakse tegelike väärtustega, kui `./configure` genereerib sihtmasinas lõpliku `Makefile`'i.

Mõttekas oleks mõni aeg pärast seda, kui oled alustanud tegevust &tdevelop;is, käivitada käsk `./configure --help`, mis näitab paljusid asju, mida saad muuta ehitamise ja paigaldamise ajal (näiteks testkeskkond). Eriti just käsk

    ./configure --prefix=/koht/mida/sa/vaid/soovid

suunab terve paigalduse sinu valitud kataloogistruktuuri, andes seesmisele muutujale `$(prefix)` väärtuse `/koht/mida/sa/vaid/soovid`.

## Automake'i halduri kasutamine

Käesolevas osas leiad &automanag;i elementide üldise kirjelduse ja nende kasutamise juhiseid, sealhulgas:

- &automanag;i aken kirjeldab &automanag;i peaakna ülesehitust.

- Üldvaate aken kirjeldab ülemise alamakna elemente.

- Detailivaate aken kirjeldab alumise alamakna elemente.

- &automanag;is liikumine kirjeldab mõningaid põhitoiminguid, mida saad &automanag;is ette võtta.

- &automanag;i kontekstimenüüd kirjeldab aknaid, mis avanevad &automanag;is toiminguid valides.

### &automanag;i aken

| &automanag; töötab kaheks jagatud aknas. Ülemist osa nimetatakse üldvaateks, alumist detailivaateks. Nende vahel asub peen riba, mida hiirega lohistades saab vaadete suurust muuta. IDEAl aknarežiimi korral saab lohistada ka akende külgi, et nende laiust muuta. Mõlema vaate ülaosas asub tööriistariba nuppudega, mis aktiveeruvad siis, kui vaates valitakse mõni element. Nupud võimaldavad kasutada antud elemendi puhul vaates võimalikke toiminguid. Lisaks sellele saab kasutada kontekstimenüüsid, mis avanevad elementidele hiire parema nupuga klõpsates (neist tuleb juttu allpool). IDEAl aknarežiimis on &automanag;i tiitliribal veel kaks nuppu – kolmnurkne nool paremale ja punktikujuline nupp. Noolenupuga saab akna sulgeda. Punktinupuga aga saab akna avatuna hoida isegi siis, kui valitakse mõni muu &tdevelop;i aken (vastasel juhul suletakse &automanag;i aken automaatselt, kui fookusesse satub mõni muu aken).

### Üldvaate aken

Üldvaate aken sisaldab puukujuliselt kõiki sinu projekti katalooge, mis sisaldavad programmifaile, dokumentatsiooni või andmefaile. Igas sellises kataloogis on oma `Makefile.am` ning &automanag; peab seda alamprojektiks. &kde;-põhises projektis on kolm tüüpilist alamprojekti:

- `src` – rakenduse lähtekoodifailid,

- `doc` – rakenduse käsiraamat,

- `po` – ekstraktib sinu lähtekoodifailidest stringid, mida saab tõlkida muudesse inimkeeltesse (⪚ akende tiitlid, menüüde nimed, nuputekstid, dialoogide tekstid ja mitmesugused teated).

Pane tähele, et alamprojektil `doc` on alati alamprojekt `en`, mida näed, kui klõpsad märgile + sõna `doc` ees. Selle põhjuseks on asjaolu, et &kde; kogu dokumentatsiooni baaskeeleks on Ameerika inglise keel (en). Kui sinu rakendusest saab &kde; osa, võivad &kde; tõlkijate meeskonnad tõlkida sinu dokumentatsiooni teistesse keeltesse ning tõlked suunduvad muudesse alamprojektidesse, mille nimeks on näiteks `de` (saksa keel) või `et` (eesti keel). Alamprojekti `po` stringe saab samuti tõlkida ning salvestada teistesse failidesse kataloogis `po`, mis tagab, et sinu rakendus on arusaadav ka neile inimestele, kes ei valda inglise keelt.

Alamprojektidel `doc` ja `po` on erinev eesmärk. `doc` sisaldab dokumentatsiooni, näiteks rakenduse käsiraamatut, `po` aga kasutajaliidese tõlgitavaid stringe, mis on integreeritud rakenduse lähtekoodi.

Üldvaate aken on — muu hulgas — ka liikumisvahend. Kui valid üldvaate aknas alamprojekti, näidatakse selle üksikasju detailivaate aknas.

### Detailivaate aken

Detailivaade sisaldab puukujuliselt kõiki parajasti üldvaates valitud alamprojekti faile ning antud alamprojekti kompileerimis-, ehitamis- ja paigaldamisreegleid. Nii tagavad kaks vaadet koos sulle ligipääsu oma rakenduse kõigile komponentidele ja kogu infole, kuidas seda kompileerida, ehitada ja paigaldada.

#### Sihtmärgid

Detailivaate nimekirjapuul on kaks tasandit. Ülemine tasand koosneb niinimetatud &automanag;i sihtmärkidest, teine tasand aga sisaldab iga sihtmärgi failide nimekirja.

Sihtmärgi mõiste &automanag;is erineb mõnevõrra sihtmärgi mõistest sellisel kujul, nagu seda `Makefile` enamasti mõistab. Lühidalt:

- Definitsioon, kuidas teatud failikogum kompileerida, ehitada või paigaldada, tähendab sihtmärki &automanag;is, kuid `Automake` tunneb seda muutuja nime all.

- Sihtmärk `make`'is on midagi hoopis muud: käsu `make` parameeter (⪚ `make install` või `make clean`).

  Siiski tähistavad mõned `Makefile.am` muutujad alamsihtmärki `make`'is.

### &automanag;is liikumine

Nii üld- kui detailivaates saab klõpsuga sümbolile + või - alamprojekti või sihtmärgi nime ees puuvaate avada või sulgeda. Üldvaates alamprojekti korral näitab või peidab see järgmise taseme alamprojektid (kui neid on). Detailivaates sihtmärgi korral näitab või peidab see antud sihtmärgi failide nimekirja.

Faili avamine redigeerimiseks

- Klõps &HVN;ga detailivaates faili nimel avab vastava faili &tdevelop;i redaktoriaknas.

&automanag;i tööriistariba nuppude aktiveerimine

- Kui klõpsad &HVN;ga üldvaates alamprojekti või detailivaates sihtmärgi nimel, tõstetakse see nimi esile ning vaate ülaosas muutuvad aktiivseks mõned tööriistariba nupud.

  Soovitatav on kasutada klõpsamist hiire parema nupuga ja kontekstimenüüsid, mitte aga tööriistariba nuppe, sest esimeste korral on märksa lihtsam täpselt aru saada, mis mida teeb.

  Alamprojektide ja sihtmärkidega ettevõetavatel toimingutel on väga suur mõju sinu rakenduse struktuurile, kompileerimisele, ehitamisele ja paigaldamisele.

Toimingute valimine ja kontekstimenüüd

- Kui klõpsad &HPN;ga alamprojekti, sihtmärgi või faili nimel, avaneb kontekstimenüü, kus saad valida mõne alamprojektiga, sihtmärgiga või failiga ettevõetava toimingu, näiteks sihtmärgi lisamise alamprojekti, faili lisamise sihtmärgile või ka valitud faili eemaldamise sihtmärgist.

### &automanag;i kontekstimenüüd

Järgnevalt selgitame lühidalt, millised toimingud on saadaval, kui klõpsata hiire parema nupuga &automanag;i aknas. Need käivad ainult üldvaate kohta. Täpsemalt kirjeldame kõiki toiminguid veidi hiljem.

#### Faili kontekstimenüü

Klõpsates &HPN;ga faili nimel detailivaates, ilmub kontekstimenüü, kus saab valida mitu failiga sooritatavat toimingut. Meie näites on valitud alamprojekti minurakendus/src sihtmärgi minurakendus'e ikooniandmed ikooifail `hi-16app-minurakendus.png`.

| Faili kontekstimenüü põhikirje on Eemalda, mis tähendab faili eemaldamist sihtmärgist (&ie; seda enam selle sihtmärgi korral ei kompileerita, ehitata ega paigaldata). Alammenüü CVS võimaldab failiga ette võtta mitmesuguseid CVS-i toiminguid. Kirje Ava kasutades võimaldab faili avada mitmesugustes redaktorites või rakendustes (⪚ meie näite ikoonifaili saab avada rakenduses TDEIcon). Alammenüü Perforce võimaldab samasuguseid toiminguid nagu CVS, ainult et kommerts-versioonikonrollisüsteemiga Perforce.

#### Sihtmärgi kontekstimenüü

Klõpsates hiire parema nupuga sihtmärgile detailivaates, ilmub kontekstimenüü, kus saab sihtmärgiga mitmeid toiminguid ette võtta. Meie näites on valitud alamprojekti minurakendus/src sihtmärk minurakendus (Rakendus bin-s).

| Kirje Seadistused on kasutatav ainult lähtekoodifailide korral. Ilmuvas dialoogis saab määrata linkuri lipud ja teekide asukohad ning näha, millised teegid tegelikult sinu rakendusega lingitakse. Loo uus fail avab dialoogi, kus saab määrata loodava faili nime ja tüübi (rippmenüüst). Lisa olemasolevaid faile avab dialoogi, kus saab sihtmärgile lisada juba olemasoleva faili. Eemalda lubab eemaldada projekti struktuurist nii sihtmärgi kui ka selle failid. Muuda sihtmärk aktiivseks on kasutatav ainult lähtekoodifaile sisaldava sihtmärgi korral. Uued failid lisatakse alati aktiivsesse sihtmärki. Ehita sihtmärk kutsub välja vajalikud kompileerimis- ja ehitamistoimingud, millega ehitada ainult antud sihtmärgi kood.

#### Alamprojekti kontekstimenüü

Klõpsates &HPN;ga alamprojektile üldvaates, ilmub kontekstimenüü, mis võimaldab ette võtta olulisi muutusi projekti struktuuris ning selle kompileerimise, ehitamise ja paigaldamise viisis. Nii saab laiendada või muuta projekti põhistruktuuri, mis on loodud &appwizard; abil.

| Kirje Seadistused võimaldab määrata, kuidas alamprojekt kompileeritakse, ehitatakse ja paigaldatakse. Ilmuvas dialoogis on kaardid Kompilaator, Kaasatud, Prefiksid ja Ehitamise järjekord. Lisa alamprojekt lisab uue kataloogi ja faili Makefile.am malli. Lisa sihtmärk avab dialoogi, kus saab määrata, kuidas sinu alamprojektis teatud failidekogum kompileeritakse, ehitatakse ja paigaldatakse. Lisa teenus (... veel kirjutamata ...) Lisa rakendus (... veel kirjutamata ...) Lisa olemasolevaid alamprojekte (... veel kirjutamata ...) Eemalda alamprojekt võimaldab korrektselt eemaldada alamprojekti. Sel juhul muudetakse vastavalt ka faile `Makefile.am`. Samuti saad võimaluse kustutada vastavas alamkataloogis kõik failid (või lingid). Mõistagi tuleb seda käsku kasutada äärmise ettevaatusega. Ehita kutsub välja vajalikud kompileerimis- ja ehitamistoimingud, millega ehitada ainult antud alamprojekti kood. Regenereeri (... veel kirjutamata ...) Puhasta (... veel kirjutamata ...) Paigalda (... veel kirjutamata ...) Paigalda (administraatorina) (... veel kirjutamata ...)

## Automake'i projektid

(... veel kirjutamata ...)

### Autoconf

`Makefile.in` -> `Makefile`

    prefix = @prefix@
    INSTALL = @INSTALL@
    build_triplet = @build@
    CXX = @CXX@

    prefix = /home/bernd/kde3
    INSTALL = /usr/bin/ginstall -c -p
    build_triplet = i686-pc-linux-gnu
    CXX = g++

`config.h.in` -> `config.h`

    /* Define if you have libz */
    #undef HAVE_LIBZ
    /* The size of a `int', as computed by sizeof. */
    #undef SIZEOF_INT

    /* Define if you have libz */
    #define HAVE_LIBZ 1
    /* The size of a `int', as computed by sizeof. */
    #define SIZEOF_INT 4

### Automake

(... veel kirjutamata ...)

### &tdevelop;i &automanag;

#### Automake'i halduri pilt

### Teekide ehitamine ja paigaldamine

- -rpath

- PIC

- static

- plugins: no-undefined

## Kohandatud Makefile'id ja ehitamisskriptid

(... veel kirjutamata ...)

## Kompilaatori võtmed

(... veel kirjutamata ...)

## Make'i võtmed

(... veel kirjutamata ...)