Mit preprocesor M4 nainstalovany je pro programatora podminkou pro pouziti Autoconfu - avsak koncovy uzivatel M4 nepotrebuje. Zjednodusene schema pouziti Autoconfu je nasledujici:
AC_INIT( src/kopretina.c )
testy programu
testy knihoven
testy hlavickovych souboru
testy typedef
testy structur
testy charakteristik prekladace
testy funkci knihoven
testy sluzeb systemu
AC_OUTPUT( Makefile ... )
V nasledujicich odstavcich si priblizime vyznam jednotlivych maker.
AC_INIT(jmeno_souboru)Jak jiz jmeno napovida, jedna se o makro, ktere configure inicialisuje - tedy makro, ktere musite v configure.in pouzit jako prve. Parametr (jmeno souboru) umoznuje configure skriptu zkontrolovat, zda se pri jeho spusteni nachazite na pravem miste (v nejvyssim adresari zdrojaku). Nastavuje mimo jine tez promennou top_srcdir (lze ovlivnit parametrem ./configure --srcdir).
AC_OUTPUT(soubor:sablona ...)Jestlize predchozi makro se pouziva v configure.in souborech jako prvni, AC_OUTPUT je vzdy tim poslednim. AC_OUTPUT zapise vysledky sveho badani do zadanych souboru. Jak zapis probiha?
Behem sveho tapani po systemu configure uklada vysledky testu do promennych (napriklad CC - prekladac C, LIBS - knihovny atp). Po ukonceni vsech testu prikaz AC_OUTPUT v sablonach nahradi vyskyt vsech retezcu @PROMENNA@ obsahem teto promenne. Neni-li sablona v prikazu AC_OUTPUT zadana (napriklad AC_OUTPUT(Makefile), pouzije se jako sablona implicitne soubor s priponou .in (v nasem pripade tedy Makefile.in).
Makefile.in: Makefile CFLAGS = @CFLAGS@ @MY_CFLAGS@ CFLAGS = -g -Wall CC = @CC@ CC = gcc
(priklad samo sebou pouze demonstrativni - zahy poznate, ze podobou praci za Vas rad udela automake :)
Autoconf Vam nabizi jiz spoustu standardnich promennych - napriklad bin_dir, data_dir, exec_prefix, libdir, mandir, srcdir, CFLAGS, CC,.... Mimo ne muzete ve svem configure skriptu tez pouzivat promenne vlastni (je to prece skript pro shell). Pokud byste chteli obsah sve promenne zapsat pomoci AC_OUTPUT, musite vsak Autoconf s touto promennou seznamit makrem AC_SUBST:
AC_SUBST(MY_CFLAGS)
Pro snadnou orientaci a prehlednost lze v configure.in pouzivat komentare. Jednak lze pouzit klasicke komentare shellu (#) - ktere budou bez zmeny zapsany pri vytvoreni configure, nebo muzete pouzit prikaz M4 dnl (discard to new line). Je dobrym zvykem napsat na zacatek kazdeho configure.in:
dnl Process this file with autoconf to produce a configure script
Pomoci maker AC_DEFINE a AC_DEFINE_UNQUOTED lze v configure definovat symboly pro preprocesor C. configure zaradi do promenne DEFS retezec "-DSYMBOL[=VALUE]" pro kazdy definovany symbol.
Pokud jste nabyli dojmu, ze Vasich definic je pro prikazovou radku presprilis, muzete pouzitim AC_CONFIGURE_HEADER stanovit, do ktereho hlavickoveho souboru budou vsechny definice zapsany. Program autoheader Vam pomuze takovy hlavickovy soubor pripravit.
Nekdy se muze stat, ze obsahem Vaseho balicku budou dve nebo tri vice mene nezavisle casti. Makrem AC_CONFIG_SUBDIRS urcite, ve kterych podadresarich je treba spustit skript configure. Tyto zaroven spustene configure skripty pak napriklad sdileji config.cache soubory a podobne.
Kdyz jsme se nyni seznamili s nekterymi zakladnimi rysy configure.in souboru, muzeme se vice ponorit do prehrsle standardnich testu, ktere nam configure.in nabizi.
Jak jste si jiz jiste vsimli v casti urcene doporucene strukture configure.in souboru, bylo by mozne rozdelit testy do nekolika skupin. V kazde skupine naleznete bohatou urodu testu - snazil jsem se proto vystihnout pouze testy nejpouzivanejsi ci obecne testy - pripravene sablony - s jejichz pomoci lehce napisete testy vlastni.
AC_PROG_AWK, AC_PROG_CC, AC_PROG_CPP, AC_PROG_CXX, AC_PROG_INSTALL, AC_PROG_LEX..
Jsou jmena alespon nekterych standardnich testu, ktere vyzkousi, zda dany program existuje a nastavi prislusne promenne potrebne pri jeho pouziti (napriklad CC a CFLAGS v pripade AC_PROG_CC).
Jak jsem slibil, tak ke kazdemu okruhu specialisovanych testu existuje nekolik testu obecnych:
AC_CHECK_PROG (VARIABLE, PROG-TO-CHECK-FOR, VALUE-IF-FOUND [, VALUE-IF-NOT-FOUND [, PATH, [ REJECT ]]])
dnl Check for perl AC_CHECK_PROG(PERL, perl, yes, no)
Mimo tento test autoconf zna jeste mnoho dalsich: podobny AC_CHECK_PROG je napriklad AC_PATH_PROG, ktery do promenne ulozi plnou cestu k programu. AC_CHECK_PROGS a AC_PATH_PROGS slouzi k hledani vice nez jednoho programu.
Existenci libovolne knihovny proverime nasledujicim testem:
AC_CHECK_LIB((LIBRARY, FUNCTION [, ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])
dnl Check for math library AC_CHECK_LIB(m, sin)
Jak cely test funguje? configure vytvori maly programek stavajici se z funkce main a volani funkce, kterou hledate. Nakonec se cely zdrojak pokusi prelozit. Pokud je program sestaven bez potizi, je knihovna povazovana za nalezenou.
AC_FUNC_ALLOCA, AC_FUNC_MEMCMP, AC_FUNC_MMAP, AC_FUNC_VFORK...
je jen mala ukazka z velke plejady testu, ktere hledaji ruzne funkce po rozlicnych knihovnach. Pokud je naleznou, definuji symboly HAVE_... - napriklad HAVE_MMAP a podobne.
AC_CHECK_FUNC (FUNCTION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
Je obecnejsi obdobou vyse zminenych funkci. ACTION-IF-FOUND a jeho pruvodce ACTION-IF-NOT-FOUND jsou v autoconf velmi caste konstrukce, proto dale jiz jejich vyznam nebudu vysvetlovat.
Mezi testy, ktere zkoumaji pritomnost ruznych hlavickovach souboru patri napriklad AC_HEADER_STDC, jimz overite existenci standardnich hlavickovych souboru (stdlib.h, string.h, ...), nebo AC_HEADER_DIRENT, ktery Vam pomuze ze zmatku panujicich s ruzne pojmenovanymi soubory dirent.h, sys/ndir.h, sys/dir.h, ndir.h. Neni nad standardy, ze?
Pokud v pestre skale testu autoconfu nenaleznete test prave pro ten Vas hlavickovy soubor, z nesnazi Vam pomuze toto makro:
AC_CHECK_HEADER (HEADER-FILE, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
AC_HEADER_STAT, AC_HEADER_TIME, AC_STRUCT_TM, AC_TYPE_PID_T, AC_TYPE_SIZE_T, ...
... jiste nebudou jedine typy, jejichz existenci lze testovat pomoci autoconf. S AC_CHECK_TYPE si muzete posvitit i na ty nejneobvyklejsi typy, ktere si dovedete predstavit.
AC_CHECK_TYPE (TYPE, DEFAULT)
Prestoze tato kapitola nebyla uvedena mezi prvnimi, testy v ni uvedene patri mezi nejdulezitejsi.
Zrejme budou trosku zklamani ti, kteri z nazvu kapitolky usuzovali na postmoderni pohadku ci nazev noveho vecernicku pro deti :*) Na druhou stranu zcela jiste oblazime programatorska srdecka, jez si jiz stacila oblibit makra, ktere autoconf nabizi:
Jestlize jste jiz nekdy spustili configure skript s parametrem --help a byli jste zaskoceni ponekud rozsahlejsim seznamem moznych parametru tohoto skriptu, pak vezte, ze tento nemaly katalog muzete obohatit tez o vlastni exemplare.
Tato moznost prijde vhod, zejmena pokud Vas balicek obsahuje volitelne komponenty, ktere nejsou k provozu programu nezbytne, ci komponenty, ktere jsou "nadstandardni" (napriklad X front-end). Rovnez je vhodne temito parametry dat uzivateli moznost zakazat (povolit) nektere vlastnosti programu (podpora locales ...)
AC_ARG_WITH (PACKAGE, HELP-STRING, ACTION-IF-GIVEN, ACTION-IF-NOT-GIVEN)
AC_ARG_ENABLE (FEATURE, HELP-STRING, ACTION-IF-GIVEN, ACTION-IF-NOT-GIVEN)
AC_ARG_WITH(pomnenka, podpora pro pomnenky, POMNENKY=jo, POMNENKY=NE)
Ac se to na prvni pohled nezda, autoconf je velmi mocny nastroj v boji proti zmatkum v dnesnich taky-standardech a uspesne pomaha spravcum projektu zapolit s neprehlednou dzungli ruznych obskurnich konfiguraci.
Myslim, ze je zbytecne vytvaret az do konce configure.in pro pomyslny projekt Kopretina. Nejlepsi ucebnici v psani configure.in souboru Vam budou jiz hotove projekty, ktere ve sve distribuci autoconf aktivne pouzivaji (napriklad GIMP, Gtk, GNOME,...). Napsat configure.in zabere i nezkusenemu uzivateli velmi malo casu (zvlast pokud si predstavime, kolik boleni hlavy usetrime jak sobe, tak uzivatelum naseho projektu).
Pro Vasi pribliznou predstavu, jake testy by se mohly objevit v configure.in stredne maleho projektu, zaclenil jsem configure.in, ktery jsem napsal pro GAG (plug-in pro GIMP).
Nasledujici kapitola pojednava o hlavnich rysech
Automake, ktery usetri dalsi furu prace programatorum (tedy, alespon tem, kteri
maji otevrene hlavy a jsou pripraveni se neco noveho naucit :)