Automake je nastroj, ktery Vam usnadni pripravu sablon Makefile.in pro Vas configure skript. Autori vybrali Perl pro implementaci automake - ovsem obdobne jako v pripadu Autoconf/M4 musi byt Perl pritomny na Vasem systemu pouze tehdy, kdyz chcete soubory Makefile.in vytvaret. V distribucnim archivu budou tyto soubory obsazeny a pocitac koncoveho uzivatele nemusel o Perlu vubec nikdy slyset (ke sve skode :)
Krome automatickeho pocitani zavislosti (dependencies) Automake na zaklade Vami poskytnutych informaci pripravi soubor Makefile, ve kterem se nachazeji i nasledujici cile:
Ve skutecnosti samozrejme Automake pripravi pouze Makefile.in - pripomenme si vsak, ze tento soubor je velmi blizky vyslednemu souboru Makefile. Pouze misto skutecnych hodnot v nem budou figurovat retezce @PROMENNA@ (napriklad @CFLAGS@ misto pri konfiguraci zvoleneho "-g -Wall").
Makefile.am --(automake)--> Makefile.in --(configure)--> Makefile
Je priblizne schema vytvoreni Makefile souboru. V kazdem podadresari Vaseho projektu vytvorite soubor Makefile.am. Prikazem automake se z kazdeho Makefile.am vytvori Makefile.in, ktery se pri konfiguraci pouzije jako sablona pro Makefile.
Automake nejen predpoklada, ze ve svem projektu pouzivate autoconf, navic klade na configure.in nekolik pozadavku:
Meli byste pouzit makro AM_INIT_AUTOMAKE(jmeno_balicku, verse) (coz je nejjednodussi) nebo explicitne vykonat akce, ktere toto makro provadi (definovat promenne PACKAGE, VERSION a vyvolat nektere testy).
V pripade, ze pouzivate C (C++, lex, yacc,..) musite se v configure.in vyvolat prislusne testy.
Samozrejme nesmite nakonec zapomenout uvest vsechny Makefile soubory mezi parametry AC_OUTPUT.
Jelikoz Automake rozsiruje Autoconf o nova makra, je nutne, aby o nich vedel i program autoconf. Proto je zde program 'aclocal', ktery vsechna nezbytna makra zapise do souboru aclocal.m4 . Cely proces vytvoreni Makefile souboru tedy bude:
grass@meadow:~/kopretina$ autoheader
grass@meadow:~/kopretina$ aclocal
grass@meadow:~/kopretina$ automake
grass@meadow:~/kopretina$ autoconf
grass@meadow:~/kopretina$ configure
Nemusite se vsak obavat, ze misto slibene jednoduchosti automake prinasi pouze dalsi nadbytecne komplikace. Jednak koncovy uzivatel pouzije z techto prikazu jen posledni, jednak i Vy sami vetsinou pouzijete prvni ctyri prikazy pouze jednou - priste se o ne postaraji dependencies v Makefile, ktere zaruci, ze se potrebne prikazy spusti, jakmile se nektere z dulezitych souboru (Makefile.am, configure.in) zmeni.
Automake rozlisuje nekolik druhu balicku, jednak dle cleneni adresarove struktury....
... jednak dle pozadavku, ktere na balicek klade...
Jako obvykle zacnu svuj vyklad veci ze vsech nejdulezitejsi: komentare. Pri psani Makefile.am muzete pouzit celkem dva druhy komentaru - bezne "#" a dale komentare "##", ktere nebudou do vysledku zapsany. Je opet dobrym zvykem zacinat Makefile.am nasledujicim radkem:
## Process this file with automake to produce Makefile.in
Jiste by jste se radi dozvedeli, co jineho muzete zapsat do souboru Makefile.am krome komentaru a explicitnich pravidel, kterymi lze nahradit pravidla zarazene do Makefile automake. Cele kouzlo automake je zalozeno na specialnich promennych - napriklad promennou SUBDIRS reknete v Makefile.am, ktere podadresare do Vaseho projektu patri:
SUBDIRS = docs src data
Vsechny zde uvedene adresare budou zarazeny do distribuce a pokud neurcite jinak, pri kazdem prikazu make se provede tez cd subdir && make. Nemusim jiste pripominat, ze v kazdem podadresari musi byt pripraven soubor Makefile.am a Makefile v tomto adresari musi byt zarazen jako parametr do AC_OUTPUT v configure.in. Jelikoz automake sam pripravi i Makefile.in v podadresarich, neni treba automake explicitne v kazdem adresari spoustet.
Na promenou SUBDIRS se vztahuje pouze jedno omezeni - mohou zde byt uvedeny pouze podadresare, ktere jsou primymi potomky adresare (o nic vsak neprichazite, protoze v kazdem podadresari je opet Makefile.am, ktery muze opet obsahovat promenou SUBDIRS).
Jestlize se v nasem balicku lucnich kvetinek vyskytuji programy pampeliska a jitrocel (mhm, ponekud morbidni priklad... Myslim, ze zacnu uvazovat o prihodnejsich prikladech, vice odlidstenych, pretechnizovanych,...), sdelime to automake vyctem techto programu v promenne bin_PROGRAMS:
## kontrolni otazka - (Vy pretechnizovani) poznate jitrocel? bin_PROGRAMS = jitrocel pampeliska
bin_ je prefix a jim urcite, kam je treba dane programy nainstalovat (jitrocel a pampeliska budou zasazeny do adresare $bindir, ktery uzivatel vybral pomoci parametru --prefix nebo primo --bindir). Dale automake zna napriklad prefix sbin_, libexec_, pkglib_ a noinst_ (neinstaluj).
Krome PROGRAMS - tzv primarni promenne (nebo tez makro - jak libo) - automake zna i jine: LIBRARIES(lib, pkglib), LISP(list), SCRIPTS(bin, sbin, libexecm, pkgdata), DATA(data, sysconf, sharedstate, localstate, pkgdata), HEADERS(include, oldinclude, pkginclude) a dalsi (MANS, TEXINFOS, JAVA,... ). Myslim, ze jejich jmena rikaji vse. Kazde primarni promenne odpovidaji prislusne prefixy uvedene v zavorkach (proc take instalovat DATA do $bindir, ze?)
Pote, co jsme do posledniho vsechny definovali programy, data a dokumentaci, zbyva nam k dokonceni Makefile.am pouze nekolik krucku. V prvnim kroku se v Makefile.am sverime, z kterych zdrojovych souboru je ten ktery program sestaven
spolecne = kytka.h kvet.h kytka.c kvet.c koreny.c pampeliska_SOURCES = $(spolecne) pampeliska.c jitrocel_SOURCES = $(spolecne) jitrocel.c
Prestoze priklad nepatri mezi nejlepsi (krome jiz diskutovanych jmen by meli byt spolecne casti v knihovnach), domnivam se, ze je vice nez demonstrativni. Jmena vsech souboru programu uvedeneho v PROGRAMS jsou nasypana na jedne hromade v promenne prog_SOURCES. V seznamu muzeme pouzivat promenne, programy mohou sdilet zdrojove soubory, na jejichz poradi nezalezi. Dale je treba zde uvest tez jmena hlavickovych souboru.
Jediny zadrhel, ktery nebyl z naseho prikladu zrejmy, je potiz s "podezrelymi" znaky ve jmenech programu. Znaky nepatrici do mnoziny [a-zA-Z0-9_] (alfanumericke znaky spolu s podtrzitkem) je treba nahradit "_" (podtrzitkem). Zdrojove soubory programu "mam-rad-podivne.nazvy" budou zapsany v promenne mam_rad_podivne_nazvy_SOURCES. Uff. (nemam_rad_dlouha_jmena).
V promennych SOURCES se samozrejme mohou vyskytnout soubory .cc, .y (yacc) nebo .l (lex) a automake pro ne vygeneruje prislusna pravidla. Nesmite vsak zapomenout zaradit do configure.in prislusne testy.
Druhy krok, promenne prog_LDADD a prog_LDFLAGS, je samozrejme pouze volitelny. Zde specifikujete knihovny a parametry pro ld, ktere tento program vyzaduje (krome LIBS - ty jsou zarazeny automaticky):
pampeliska_LDADD = -lkytky @KYTKY_LIBS@ mam_rad_podivne_nazvy_LDADD = -losk -llivy -lnaz -lev -lze
Snad se laskavy ctenar nebude citit osizen, kdyz nyni napisi, ze po predchozim paragrafu jiz zna vse podstatne pro psani Makefile.am souboru. Abych rekl pravdu - ona to totiz nejni zadna veda. Nase povidani o Makefile.am souborech ukoncime nekolika radky o podminenem prekladu. Nyni vsak nemam na mysli #if konstrukce ve zdrojovych souborech.
Do naseho projektu kopretina jsme zaradili graficky front-end pro X-windows. Jelikoz se vsak jedna pouze o nadstavbu, nikoliv o klicovy program, je program sestaven pouze pokud si tak uzivatel explicitne vyzada (napriklad parametrem --with-xkopretina, ktery jsme pro tento pripad pridali do configure.in).
Jak tedy resit situaci, kdy je treba postavit pouze nektere z programu? Bystrejsi z ctenaru (tedy ti, kteri nejsou zmateni mymi nemistnymi komentari v zavorkach) si jiz jiste domysleli, ze vhodnym prostredkem bude promenne a AC_SUBST configure.in a retezce uvozene @ v Makefile.am (nezamenujte prosim s primarnimi promennymi ci promennymi, jak je zna Makefile):
configure.in
AC_ARG_WITH(xkopretina, [ --with-xkopretina Postavit X front-end],
XKOPRETINA=xkopretina)
AC_SUBST(XKOPRETINA)
Makefile.am
bin_PROGRAMS = kopretina @XKOPRETINA@ EXTRA_PROGRAMS = xkopretina kopretina_SOURCES = ... xkopretina_SOURCES = ...
Pokud uzivatel spusti "./configure --with-xkopretina", je xkopretina pridana mezi prekladane programy. Jelikoz by se automake mel dozvedet o vsech programech, pribyla do Makefile.am nova promenna s predponou EXTRA_, ve ktere jsme vypsali vsechny volitelne programy. Podobnou promennou pouzijeme i v pripade zdrojovych souboru:
spolecne = kytka.h kvet.h kytka.c kvet.c koreny.c pampeliska_SOURCES = $(spolecne) pampeliska.c jitrocel_SOURCES = $(spolecne) jitrocel.c slunecnice_SOURCES = $(spolecne) slunecnice.c slunecnice.h @SL_OPT@ # tak jako slunecnice kazdym dnem, otacim se ... EXTRA_slunecice_SOURCES = za_sluncem.c
Snad jsem neuvedl tapajici vice ve zmatek, kdyz jsem pouzil na jednom radku primarni promennou, promennou a retezec uvozeny @, ktery je nahrazen configure skriptem. Pro uplnost pouze dodavam, ze v promenne EXTRA_SUBDIRS jsou uvedeny vsechny (v SUBDIRS neuvedene ci uvedene pouze podminene) adresare.
make dist je, jak jsem jiz napsal, velmi uzitecny cil, ktery vytvori .tar.gz soubor pripravena k distribuci. Spolu se zdrojovymi programy, dokumentaci a daty budou do adresare zacleneny soubory uvedene v promenne EXTRA_DIST a samozrejme soubory, jez maji neco spolecneho s konfiguraci (configure, configure.in, Makefile.am, Makefile.in s predpocitanymi dependencies,...). Dale automake zaradi tez soubory README, TODO, NEWS, ChangeLog... - uplny prehled Vam poda automake --help.
Abyste si doplnili svuj obrazek o tom, jaky muze byt .am soubor, zaclenil jsem dva soubory (Makefile.am a src/Makefile.am) z jiz zmineneho balicku GAG. Zvidavejsi z Vas se jeste mohou podivat, co se s temito soubory stane (Makefile.in, src/Makefile.in, Makefile a src/Makefile)
Posledni kapitola meho referatu pojednava o nastroji libtool.