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
Logo
VývojářProjekt GNU
Aktuální verze2.72 (22. prosince 2023)
Operační systémUN*X
Vyvíjeno vm4
Typ softwaruprogramátorský nástroj, knihovna a GNU balíček
LicenceGNU General Public License, version 3.0 or later
Webwww.gnu.org/software/autoconf/autoconf.html
Některá data mohou pocházet z datové položky.

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

editovat
 
Způsob použití nástrojů autoconf a automake. Ve starších verzích autoconf se soubor "configure.ac" jmenoval "configure.in".

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

editovat

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

editovat

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

editovat

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

CC příkaz volající překladač jazyka C
CFLAGS příznaky (řádkové parametry) pro překladač jazyka C
LDFLAGS příznaky (řádkové parametry) pro linker (např. -Ladresář, pokud se má program linkovat s knihovnami umístěnými v nestandardním adresáři)
CPPFLAGS příznaky (řádkové parametry) pro preprocesor jazyka C (např. -Iadresář, pokud program používá hlavičkové soubory umístěné v nestandardním adresáři)
CPP příkaz fungující jako C preprocesor

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

editovat

Program "Hello, world":

  1. Vytvořit zdrojový text hello.c:
    #include <stdio.h>
    
    int main() {
        printf("Hello, world!\n");
        return 0;
    }
    
  2. 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
    
  3. 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
    
  4. Přejmenujeme configure.scan na configure.ac a doplníme informace do řádku AC_INIT
  5. 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
    
  6. Do configure.ac přidáme za řádek AC_INIT řádek
    AM_INIT_AUTOMAKE
    
  7. Pustíme aclocal; vytvoří aclocal.m4 a v adresáři autom4te.cache soubory traces.1 a output.1 a aktualizuje requests
  8. 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.

  9. Spustit autoconf; aktualizuje soubor requests a vytvoří skript configure.
  10. Použít postup jako při instalaci balíčku:
    $ ./configure
    $ make
    $ /bin/su -
    $ make install
    
  11. Po úpravě zdrojových textů znovu pustit autoscan; porovnat configure.scan s configure.ac, aktualizovat configure.ac a spustit autoreconf.

Kritika

editovat

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í[1][2].
  • 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[3]. Přestože mnoho vývojářů nerespektuje žádné konvence, tyto konvence existují a jejich používání je stále častější[4].
  • Pokud má autoconf obsahovat nestandardní kontroly, musí se vývojáři naučit používat poměrně málo známý makroprocesor M4[3][5]
  • Kvůli slabé zpětné i dopředné kompatibilitě je nutné používat wrapper skript[6].
  • 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[1][7].

Reference

editovat

V tomto článku byl použit překlad textu z článku Autoconf na anglické Wikipedii.

  1. a b NEUNDORF, Alexander. Why the KDE project switched to CMake -- and how [online]. 2006-06-21. Dostupné online. 
  2. KAMP, Poul-Henning. A Generation Lost in the Bazaar. ACM Queue. 2012-08-15, roč. 10, čís. 8. Dostupné online. 
  3. a b MCCALL, Andrew. Stop the autoconf insanity! Why we need a new build system [online]. 2003-06-21. Dostupné online. 
  4. GNU Coding Standards [online]. Dostupné online. 
  5. KAMP, Poul-Henning. Did you call them autocrap tools? [online]. 2010-04-20 [cit. 2018-04-10]. Dostupné v archivu pořízeném dne 2017-09-11. 
  6. DICKEY, Thomas. why i still use autoconf 2.13 [online]. Dostupné online. 
  7. www.blender.org [online]. [cit. 21-09-2014]. Dostupné v archivu pořízeném dne 02-12-2008. 

Literatura

editovat
  • John Calcote. Autotools: a Practical Guide to GNU Autoconf, Automake, and Libtool. [s.l.]: [s.n.], 2010-07-23. ISBN 1593272065. 

Související články

editovat

Externí odkazy

editovat