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