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.
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!
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
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.
- $ ./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
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).
|