- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 08-09/98

autoconf, automake a libtool aneb Makefile snadno a rychle

Henryk Paluch, 9. září 1998

Tyto tři pomůcky slouží k rychlé tvorbě souborů Makefile, snadné a na platformě nezávislé kompilaci knihoven, včetně dynamických, a také poskytují rozsáhlé možnosti při testování různých specifik systému, na kterém bude program kompilován.

  • libtool unifikuje tvorbu dynamických a statických knihoven. Volá se místo překladače C a podle typu platformy zajistí doplnění příkazové řádky potřebnými parametry pro kompilaci a instalaci staticky nebo dynamicky linkované knihovny.


# Makefile.am - ukázkový program k libtool
AUTOMAKE_OPTIONS = foreign
# druh distribuce
# foreign - nejmírnější pravidla
# gnu     - musí být přítomny soubory README NEWS COPYNG aj.

# další soubory, které jsou součástí distribuce
EXTRA_DIST = aclocal.m4

# vytvořit knihovnu libhello pomoci libtool
# *.la je jméno knihovny, která byla/bude vytvořena pomocí libtool
lib_LTLIBRARIES = libhello.la
# zdrojové soubory knihovny libhello
libhello_la_SOURCES = hello.c foo.c
# číslování verzí je specifické pro libtool, viz. manuál
libhello_la_LDFLAGS = -version-info 3:12:1

# hlavičkové soubory, které se mají nainstalovat do
# ${prefix}/include, jinak je uveďte jen v *_SOURCES
include_HEADERS = foo.h

# spustitelné programy
bin_PROGRAMS = hell hell.static

# zdrojové soubory programu hell
hell_SOURCES = main.c
# knihovny 
hell_LDADD = libhello.la

# totéž pro hell.static
hell_static_SOURCES = main.c
# pokud byste chtěli linkovat knihovnu, která nebyla vytvořena 
# s libtool, tak použijte klasické libxxx.a místo libxxx.la
hell_static_LDADD = libhello.la
hell_static_LDFLAGS = -static

Výpis č. 6: Šablona Makefile Makefile.am

  • automake vytváří standardizované Makefile.in podle šablony Makefile.am. Od verze 1.2 umí také spolupracovat s utilitou libtool. Cílové soubory Makefile generované programem autoconf pak obsahují standardní metody pro kompilaci, instalaci a distribuci programu.

  • autoconf generuje z šablony configure.in konfigurační skript configure. autoconf nám poskytuje bohaté možnosti k otestování systému. Můžeme snadno ověřit přítomnost různých programů, hlavičkových souborů a hlavně knihoven a funkcí. Máme k dispozici např. makra, která zjistí přítomnost X Window System a dodají všechny potřebné parametry, včetně cest k hlavičkovým souborům a knihovnám.
    Skript configure se spouští před samotnou kompilaci našeho programu. Jeho úkolem je otestovat systém, vytvořit Makefile z Makefile.in a provést v něm substituci proměnných. Další činnost tohoto skriptu závisí pochopitelně na šabloně configure.in - např. konfigurace libtool apod.

Instalace

Měli byste nainstalovat tyto RPM balíky (součást distribuce Red Hat Linux 5.1):

# rpm -Uvh autoconf-2.12-3.noarch.rpm \
           automake-1.3-2.noarch.rpm  \
           libtool-1.0h-2.noarch.rpm

Tyto programy na sobě do určité míry závisejí. Pokud si je budete kompilovat sami, ujistěte se, že všechny mají stejný instalační --prefix!

Příklad

Uvedený příklad pochází z ukázkového programu hell-o ke skriptu libtool.

Obsahuje tyto soubory:

  • hello.c a foo.c jsou součástí knihovny libhello
  • main.c je testovací program, který využívá výše zmíněnou knihovnu


dnl AC_INIT - vždy 1. příkaz
dnl parametr - jméno souboru, který je souč. dist
dnl   pro kontrolu
AC_INIT(hello.c)
dnl jméno balíku a číslo verze
AM_INIT_AUTOMAKE(hell,1.0)

dnl otestuje překladač C
AC_PROG_CC
dnl nakonfiguruje libtool
AM_PROG_LIBTOOL

dnl otestuje přítomnost funkce cos() v knihovně
dnl libm.a (resp. libm.so.*)
AC_CHECK_LIB(m, cos)
dnl v případě úspěchu definuje -DHAVE_LIBM

dnl Vygeneruje Makefile z Makefile.in 
dnl a provede substituci proměnných
AC_OUTPUT(Makefile)

Výpis č. 7: Šablona autoconfu configure.in

Generování skriptů

Poprvé zadáme tuto sekvenci:

  • $ libtoolize - vytvoří libtool a další pomocné soubory
  • $ automake -a - vygeneruje Makefile.in. Volba -a navíc zajistí přidání chybějících souborů
  • $ aclocal - přidá makra AM_INIT_AUTOMAKE a AM_PROG_LIBTOOL do aclocal.m4.
  • $ autoconf - vygeneruje configure z configure.in.

Pokud jen modifikujeme např. Makefile.am, pak stačí zadat:

$ automake; aclocal; autoconf;

To už však není nezbytně nutné: Makefile obsahuje všechny potřebné závislosti a všechny konfigurační soubory se znovu vygenerují automaticky.

Kompilace

  • $ ./configure - vytvoří Makefile. Pokud se objeví chybové hlášení AM_INIT_AUTOMAKE: File not found, znamená to, že aclocal.m4 toto makro neobsahuje. Ujistěte se, že všechny tři balíky byly instalovány se stejným prefixem.
  • $ make - zkompiluje program hell a knihovnu libhello
  • $ ./hell - spustí dynamicky linkovaný hell
  • $ ./hell.static - spustí staticky linkovaný hell
  • $ make install - nainstaluje zkompilované programy a knihovny
  • $ make dist - vygeneruje balík vhodný pro distribuci zdrojových textů. Ke kompilaci tohoto balíku nejsou programy autoconf, automake, a libtool vůbec potřebné - ty slouží pouze k vytvoření konfiguračních skriptů.
  • $ make dist-all - vygeneruje kompletní archív
  • $ make clean - vyčistí projekt

Závěr

Tento příspěvek jen nastínil možnosti, které tyto programy nabízejí. Pokud se rozhodnete je používat, zcela jistě vám budou k užitku referenční info manuály David MacKenzie: Autoconf - Creating Automatic Configuration Scripts, David MacKenzie, Tom Tromey: GNU Automake a Gordon Matzigkeit: GNU Libtool. Buďte připraveni na různé problémy a úskalí, která vás mohou potkat. Zvláště automake je někdy poněkud tvrdohlavý a nezbyde vám, než se přizpůsobit jeho stylu. Jako studijní materiál vřele doporučuji skripty z jiných programů (GIMP, gtk, SANE). *


- předchozí článek - následující článek - obsah - úvodní stránka -