4. Automake 1.3

Kdyz jsem poprve objevil make a Makefile soubory, blahorecil jsem jeho vynalezcum - soubory Makefile se svymi pravidly velmi usnadnuji praci a preklad i tech nejmensich projektu. Ovsem po delsi dobe venovane sprave vetsiho projektu zacne cloveka bolet hlava z hordy pravidel, ktere nan vystrkuji sve ruzky kamkoliv se pohne. Spousty vynikajicich vlastnosti a moznosti, jenz jsme nejdrive vynaseli do nebe nas unavuji a v slabsich chvilkach zatouzime po jednoduche a z co nejvetsi casti automatizovane sprave pravidel a cilu prekladu (ktera by nam ovsem ponechala moznost sem tam udelat neco "po staru"). Myslim, ze z nazvu kapitoly nebylo tezke usoudit: budu hovorit o nastroji Automake.

4.1 Kterak Automake funguje

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:

make install, make uninstall
Slouzi k instalovani programu, dat i dokumentace (info, man)
make clean, make mostlyclean, make maintainer-clean
Vycisti adresare od nechtenych souboru vytvorenych behem konfigurace ci prekladu (*.o, config.log, ...)
make dist
Vyrobi distribucni balicek, ktery bude pripraven pro koncoveho uzivatele
make tags
Ve spolupraci s programem etags vytvori v kazdem adresari tzv TAGS soubory. V TAGS souborech jsou uchovany informace o vsech definicich a deklaracich ve Vasich zdrojovych souborech. V nekterych editorech (Emacs, vi) se muzete pomoci techto souboru velmi efektivne "prochazet" po svych zdrojacich a kdykoliv lehce vyhledat definici daneho symbolu.

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.

4.2 configure.in

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.

4.3 Druhy balicku

Automake rozlisuje nekolik druhu balicku, jednak dle cleneni adresarove struktury....

Flat
Vsechny soubory jsou v jedinem adresari
Deep
Vsechny zdrojove soubory se nachazeji v podadresarich, v nejvyssim adresari jsou pouze konfiguracni soubory.
Shallow
Vetsina souboru se nachazi v nejvyssim adresari, zatimco nektere casti (knihovny) jsou v podadresarich

... jednak dle pozadavku, ktere na balicek klade...

automake --foreign
Na takovy balicek nebudou kladeny temer zadne naroky
automake --gnu (implicitni)
musite dodrzet GNU standard pro distribucni balicky - napriklad v nejvyssim adresari se musi vyskytovat soubory NEWS, AUTHORS, COPYING (GPL), ChangeLog a dalsi. automake --add-missing za Vas nektere z techto souboru vytvori.
automake --gnits
gnits je ponekud prisnejsi (jeste nespecifikovany :) standard. Navic k souborum vyzadovanym v gnu zde musi byt napriklad soubor THANKS...

4.4 Makefile.am

4.4.1 Komentare

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

4.4.2 Promenne

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

4.4.3 Primarni promenne

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

4.4.4 Podminky

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.

4.5 Distribucni balicky

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.

4.6 Zaver, priklady

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.


(c) 1998 0rfelyus