BerndPol IanWadham 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 &kdevelop;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 &kdevelop; 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 &kdevelop;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 &kdevelop;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 &kdevelop; 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 &kdevelop;. 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_KDEPRINT) # 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 &kdevelop;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 &kdevelop;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 &kdevelop;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 KIcon). 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 autoproject &automake; &autoconf; &libtool; (... veel kirjutamata ...) Autoconf configure skript config.status skript Makefile.in config.h.in 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 ...) &kdevelop;i &automanag;
Automake'i halduri pilt
Teekide ehitamine ja paigaldamine -rpath PIC static plugins: no-undefined
Kohandatud Makefile'id ja ehitamisskriptid Makefile build.xml (... veel kirjutamata ...) Kompilaatori võtmed (... veel kirjutamata ...) Make'i võtmed (... veel kirjutamata ...)