3. Autoconf 2.12

3.1 Uvod do Autoconf

Autoconf je soubor skriptu pro shell a maker pro m4. M4 je vedle cpp tradicni UNIXovy preprocesor maker. Je dobre jej znat, zvlast pokud byste chteli psat pro Autoconf nova makra, avsak v beznych pripadech se pri pouzivani Autoconfu zcela obejdete bez jeho znalosti.

Mit preprocesor M4 nainstalovany je pro programatora podminkou pro pouziti Autoconfu - avsak koncovy uzivatel M4 nepotrebuje. Zjednodusene schema pouziti Autoconfu je nasledujici:

  1. vytvorite configure.in - soubor obsahujici prikazy shellu a jiz pripravena makra (jiz naprogramovane testy zkoumajici ruzne vlastnosti systemu).
  2. prikazem autoconf vytvorite soubor configure. O configure jsme si jiz rekli v predchozich kapitolach. Jedna se o soubor shellovskych prikazu, ktere pred vlastnim prekladem programu instalujici spusti). Tento skript musi byt maximalne prenositelny - proto je nepripustne pouzivat konstrukce specificke pouze pro urcity druh shellu (napriklad bash). V opacnem pripade bychom ztratili velikou vyhodu configure skriptu: prenositelnost.

3.2 Soubory a adresare spriznene s autoconf

/usr/share/aclocal/
V tomto adresari jsou umisteny soubory obsahujici rozlicna standardni M4 makra a testy.
aclocal.m4
Soubor urceny pro Vase makra, ktera nejsou ve standardni distribuci Autoconfu.
config.cache
Provest nektere testy byva casove narocne, provedeni mnoha testu nekolikrat za sebou umorne. Proto si ./configure kesuje vysledky testu do tohoto souboru a testy tedy provede pouze poprve.
config.log
Do tohoto souboru ./configure zaznamenava vysledky testu. Pokud nejaky test selhal (napriklad se nezdarilo nalezt nejakou knihovnu), pak zde jiste naleznete proc.
config.status
Skript, ktery testy neprovadi testy, pouze zapise (jiz ziskane) vysledky do souboru.

3.3 configure.in

3.3.1 autoscan

Autoscan je v Perlu napsany skript, jenz muze slouzit jako berlicka pro zacinajiciho autokonfiguristu (ehm, ... slibuji, ze podobne strileni si z/do ceskeho jazyka se jiz nebude opakovad =), ktery chce ziskat priblizny prehled o testech, ktere by mel ve svem configure.in pouzit. Autoscan prosmejdi vase zdrojaky a vytvori configure.in, ktery muze slouzit jako zaklad pro vase dalsi experimenty. Rozhodne vsak nebudte zklamani, pokud autoscan za Vas neudela vsechnu praci - je to pouze berlicka, nikoliv nahrada za programatora.

3.3.2 Struktura configure.in

Nase studium hlubin souboru configure.in zacneme obecnym prehledem doporucene struktury tohoto souboru:

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.

3.3.3 AC_INIT

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

3.3.4 AC_OUTPUT

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

3.3.5 Promenne

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)

3.3.6 Komentare

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

3.3.7 Define a hlavickove soubory

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.

3.3.8 Podadresare

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.

3.4 Standardni testy

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.

3.4.1 Program

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)

VARIABLE
Do teto promenne bude ulozen vysledek testu (VALUE-IF-FOUND pokud byl program nalezen, v opacnem pripade VALUE-IF-NOT-FOUND). Promenna bude automaticky exportovana makrem AC_SUBST.
PROG-TO-CHECK-FOR
Jaky program hledat
PATH
Kde jej hledat
REJECT
Jake vysledky zamitnout

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.

3.4.2 Knihovny

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)

LIBRARY
je jmeno knihovny, kterou hledame.
FUNCTION
funkce, kterou v knihovne hledame, abychom se ujistili, ze jsme nasli spravnou knihovnu a nikoliv pouze knihovnu se shodnym nazvem (stava se: napriklad GUI knihovna Qt (-lqt) a Quick Threads knihovna pro Guile (v predeslych versich tez -lqt)). Pokud jsme si jmenem jisti ci nam na funkci nezalezi, postaci, pokud zde napiseme main.
ACTION-IF-FOUND, ACTION-IF-NOT-FOUND
jsou shellovske prikazy, ktere budou vykonany podle vysledku testu. Pokud zadne prikazy nespecifikujeme, pak configure prida "-lLIBRARY" do promenne LIBS a definuje symbol HAVE_LIBLIBRARY.
OTHER-LIBRARIES
Pokud prilinkovani jine knihovny je podminkou pro uspesne pouziti testovane knihovny, pak toto je prave misto pro seznam pozadovanych knihoven.

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.

3.4.3 Funkce v knihovnach

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.

3.4.4 Hlavickove soubory

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

3.4.5 Typy

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)

3.4.6 Vlastnosti prekladace a systemu

Prestoze tato kapitola nebyla uvedena mezi prvnimi, testy v ni uvedene patri mezi nejdulezitejsi.

AC_C_BIGENDIAN
v zavislosti na architekture (a poradi, ve kterem jsou ulozeny bajty) definuje WORD_BIGENDIAN.
AC_C_CONST, AC_C_INLINE
Vyzkouma, zda prekladac C podporuje klicova slova const a inline
AC_CHECK_SIZEOF (type,cross-type)
V mnoha pripadech se bez tohoto testu neobejdeme. AC_CHECK_SIZEOF zjisti velikost daneho typu a definuje prislusny symbol pro prekladac


AC_CHECK_SIZEOF(double) => #define SIZEOF_DOUBLE 8

AC_CHECK_SIZEOF(int *) => #define SIZEOF_INT_P 4

3.4.7 Makra, ktera se nevesla do skatulek

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:

AC_PATH_XTRA
hleda X Windows, nastavi X_CFLAGS, X_LIBS,..
AC_TRY_LINK, AC_TRY_COMPILE, AC_TRY_RUN
Tezko si predstavit makra, ktera by predcila tato v universalnosti.
AC_MSG_CHECKING, AC_MSG_RESULT, AC_MSG_ERROR, AC_MSG_WARN
Temito makry muzete uzivatele informovat, co se prave v configure skriptu kutite, popripade upozornit, ze vzhledem ke zjistenym skutecnostem nebudou nektere funkce programu dostupne.

3.4.8 Skatulka posledni: parametry configure skriptu

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) 

3.5 Zaver, priklady

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


(c) 1998 0rfelyus