Autoconf
Autoconf je nástroj pro vytváření softwarových balíčků kompilovaných ze zdrojových textů. Usiluje o překlenutí rozdílů mezi různými systémy a umožňuje, aby činnost při instalaci, která zahrnuje rozbalení distribučního archivu se zdrojovými texty, překlad (build) programů a instalaci vytvořených souborů, bylo možné provést pevnou posloupností příkazů, a pokud možno bez detailních znalostí cílového systému.

Autoconf je použitelný na systémech, na kterých je dostupný Bourne shell a program make. Lze jej používat pro build programů v různých programovacích jazycích, např. C, C++, Fortran, Fortran 77, Erlang nebo Objective-C.

Skript configure spouští řadu testů, pomocí kterých přizpůsobí zdrojové texty pro build a instalaci na konkrétní cílový systém. Pro přizpůsobení spouští na cílovém systému řadu testů, na jejichž základě vygeneruje hlavičkové soubory a soubory Makefile ze šablon. Autoconf spolu s programy Automake a Libtool tvoří GNU Build System, který zahrnuje několik dalších nástrojů, především Autoheader.

Účel programu autoconf 

Autoconf je nástroj pro vytváření softwarových balíčků kompilovaných ze zdrojových textů. Balíčky jsou zpravidla šířeny jako .tar.gz soubory. Autoconf by měl správci balíčku umožnit překlenout rozdíly mezi různými systémy, takže pro rozbalení, překlad a nainstalování balíčku by mělo stačit zadat příkazy:

$ tar zxvf balíček-verze.tar.gz
$ cd balíček-verze
$ ./configure
$ make
$ /bin/su -
$ make install

Historie 
Autoconf vytvořil v létě 1991 David Mackenzie pro podporu své práce v Free Software Foundation. V následující letech byla do autoconfu zahrnuta vylepšení od množství autorů a stal se nejpoužívanějším nástrojem pro vytváření přenositelných balíčků ve světě svobodného softwaru.

Filozofie 
Autoconf se podobá balíčku Metaconfig používanému jazykem Perl. Velmi podobným nástrojem je také systém imake používaný do verze X11R6.9 pro build X Window System, který však má jinou filozofii.

Přístup Autoconfu k přenositelnosti je testovat dostupnost funkčností, nikoli čísla verzí. Například nativní překladač jazyka C na SunOS 4 nepodporuje ISO rozšíření. Ale uživatel nebo správce mohl na počítač nainstalovat ISO C-kompatibilní překladač. Přítomnost ISO překladače jazyka C nelze odhalit na základě testování verze systému, ale při testování vlastností je skript configure schopen ISO překladač jazyka C objevit. Tento přístup přináší následující výhody:

 skript configure je použitelný i na novějších nebo neznámých systémech
 na systémech, na kterých správce nainstaloval vylepšené verze vývojových nástrojů, umožňuje využívat jejich možností
 nevyžaduje udržování detailních seznamů, které verze obsahují podporu jakých vlastností

Příkaz configure 
Příkaz ./configure může doplněn parametry; jejich seznam se vypíše zadáním

$ ./configure --help

Mezi důležité parametry patří --prefix=PREFIX, udávající, v jakém stromě adresářů budou umístěny soubory potřebné pro provozování programů z balíčku a --exec-prefix=EPREFIX, udávající, v jakém stromě adresářů budou umístěny binární programy. Konkrétní jména adresářů lze zadat pomocí parametrů—bindir=DIR           user executables [EPREFIX/bin]
  --sbindir=DIR          system admin executables [EPREFIX/sbin]
  --libexecdir=DIR       program executables [EPREFIX/libexec]
  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
  --libdir=DIR           object code libraries [EPREFIX/lib]
  --includedir=DIR       C header files [PREFIX/include]
  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
  --infodir=DIR          info documentation [PREFIX/info]
  --mandir=DIR           man documentation [PREFIX/man]

Od verze 1.3 automake navíc umožňuje zadáním

$ DESTDIR=kořen make install

při instalaci předřadit před PREFIX a EPREFIX jméno adresáře, do kterého má být celá struktura souborů instalována (což je vhodné při vytváření RPM balíčků nebo instalaci na disk jiného počítače zpřístupněný pomocí například NFS jako adresář kořen).

Pokud balíček umožňuje vytvářet varianty s různou funkčností nebo předpokládající přítomnost určitého balíku na cílovém systém, lze tyto
varianty vybírat pomocí—enable-VLASTNOST—enable-VLASTNOST=hodnota—disable-VLASTNOST—with-BALÍK—without-BALÍK

Další parametry je možné skriptu configure dodat pomocí parametrů tvaru jméno=hodnota – například

Pro zadání architektury lze použít parametry --build=ARCHITEKTURA, při křížovém překladu --host=ARCHITEKTURA nebo
--target=ARCHITEKTURA.

Program automake vytváří ze souboru Makefile.am soubor Makefile.in, autoconf vytváří z *.in souborů soubory bez .in.

Příklad použití autoconf 
Program "Hello, world":

 Vytvořit zdrojový text hello.c:

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

 Vytvořit Makefile.am obsahující řádek bin_PROGRAMS se jmény všech binárních programů v projektu oddělená mezerami. Pro každý program je použit řádek jméno_SOURCES obsahující seznam zdrojových souborů (*.c i *.h), které jsou potřeba k vytvoření programu:

bin_PROGRAMS = hello
hello_SOURCES = hello.c

 Pustit autoscan. Vypíše chyby:

autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1

a vytvoří autoscan.log a configure.scan obsahující:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

 Přejmenujeme configure.scan na configure.ac a doplníme informace do řádku AC_INIT

 Pustíme autoheader. Vytvoří adresář autom4te.cache se soubory output.0, requests a traces.0 a soubor config.h.in s obsahem:

/* config.h.in.  Generated from configure.ac by autoheader.  */

/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT

/* Define to the full name of this package. */
#undef PACKAGE_NAME

/* Define to the full name and version of this package. */
#undef PACKAGE_STRING

/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME

/* Define to the version of this package. */
#undef PACKAGE_VERSION

 Do configure.ac přidáme za řádek AC_INIT řádek

AM_INIT_AUTOMAKE

 Pustíme aclocal; vytvoří aclocal.m4 a v adresáři autom4te.cache soubory traces.1 a output.1 a aktualizuje requests

 Spustíme automake --add-missing --copy; vypíše

configure.ac: installing `./install-sh'
configure.ac: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
Makefile.am: installing `./depcomp'

a vytvoří soubory install-sh, missing, INSTALL, COPYING, depcomp a Makefile.in. Doplní do utom4te.cache soubory traces.2 a output.2 a aktualizuje soubor requests.

 Spustit autoconf; aktualizuje soubor requests a vytvoří skript configure.

 Použít postup jako při instalaci balíčku:

$ ./configure
$ make
$ /bin/su -
$ make install

 Po úpravě zdrojových textů znovu pustit autoscan; porovnat configure.scan s configure.ac, aktualizovat configure.ac a spustit autoreconf.

Kritika 
Systém autoconf bývá kritizován, že používá zastaralé technologie, které mají různá omezení a autorům skriptů configure.ac zbytečně komplikují i jednoduché scénáře. K často citovaným slabinám systému autoconf patří:

 Složitost používání systému, kdy u většiny projektů je potřeba vícenásobné opakování.
 Vygenerovaný skript configure je interpretován Bourne shellem, díky čemuž je generování Makefile pomalé.
 Někteří lidé se domnívají, že skripty configure vytvořené programem autoconf poskytují pouze ručně prováděné rozhraní příkazového řádku bez jakékoli standardizace. Přestože mnoho vývojářů nerespektuje žádné konvence, tyto konvence existují a jejich používání je stále častější.
 Pokud má autoconf obsahovat nestandardní kontroly, musí se vývojáři naučit používat poměrně málo známý makroprocesor M4
 Kvůli slabé zpětné i dopředné kompatibilitě je nutné používat wrapper skript.
 Skripty generované příkazem autoconf jsou obvykle rozsáhlé a dosti složité. I když produkují obsáhlé ladicí výstupy, jejich ladění může být obtížné.

Kvůli těmto omezením několik projektů, které používaly GNU Build System přešlo na jiné buildovací systémy, jako například CMake a SCons.

Odkazy

Reference

Literatura

Související články 
 Configure
 Svatá trojkombinace – instalace softwaru ze zdrojových textů z pohledu běžného uživatele
 CMake – Alternativní systém pro překlad softwarových balíčků
 GNU build system
 pkg-config – Detekce závislostí mezi balíčky

Externí odkazy 
 
 Oficiální web systému autoconf
 GNU Autoconf macro archive
 The Goat Book homepage (aka the Autobook) 
 Using Automake and Autoconf with C++
 Using C/C++ libraries with Automake and Autoconf.
 Autotoolset home page
 Autotools: A practitioner's guide to Autoconf, Automake and Libtool
 Autotools Mythbuster

Automatizace sestavování softwaru
Programovací software
Konfigurace softwaru