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