Sunteți pe pagina 1din 30

Gua de iniciacin de Autotools

Autoconf, Automake, libtool, etc.


ersin IFH

Autor: Luis Daz Ms

http://plagatux.es

ist or est jo un lieni eonoimientoExo omeril PFS isp de gretive gommonsF r ver un opi de est lieniD visite httpXGGretiveommonsForgGliensesGyE nGPFSGesG o envie un rt gretive gommonsD IUI eond treetD uite QHHD n prnE isoD gliforni WRIHSD eF sted es lire deX

opirD distriuir y omunir plimente l or

her ors derivds

fjo ls siguientes ondiionesX

ReconocimientoF hee reonoer los rditos de l or de l mner espei(d por el utor o el lienidor @pero no de un mner que sugier que tiene su poyo o poyn el uso que he de su orAF Compartir bajo la misma licenciaF i lter o trnsform est
orD o gener un or derivdD slo puede distriuir l or generd jo un lieni idnti stF

el reutilizr o distriuir l orD tiene que her refereni l utor y l sitio e del utorF el reutilizr o distriuir l orD tiene que dejr ien lro los trminos de l lieni de est orF elgun de ests ondiiones puede no plirse si se otiene el permiso del titulr de los derehos de utor xd en est lieni menos o restringe los derehos morles del utorF vs fuentes en utilizds pr relizr este doumento son ls siguientesX httpXGGwwwFlrdeFepitFfrG dlGutotoolsFhtml httpXGGwwwFgnuForgGsoftwreGutoonfGmnulG httpXGGwwwFgnuForgGsoftwreGutomkeGmnulG httpXGGwwwFgnuForgGsoftwreGlitoolGmnulG httpXGGwwwFioinfFuniEfreiurgFdeGmmnnGrowoGutomkeFhtml5doxteps

ndice general

1. Introduccin IFIF Autoconf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IFPF Automake F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IFQF Libtool F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 2. Ejemplo sencillo: HelloWorld!
PFIF gontenido sio F F F PFIFIF gon(gureF F F PFIFPF wke(leFm F F PFIFQF srGwke(leFm PFIFRF srGminF F F F PFPF reprndo el pquete F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F

P Q Q

4
S S S S S S

3. Los dos paquetes principales


QFIF eutoreonf F F F F F F F QFPF ixpliin del ejemplo QFPFIF gon(gureF F F QFPFPF wke(leFm F F QFPFQF srGwke(leFm

F F F F F F F F rello orld F F F F F F F F F F F F F F F F F F F F F F F F

V W W IH IH

4. Usando Autoconf

RFIF v estrutur de congure.ac F F F F RFIFIF reludio F F F F F F F F F F F F RFIFPF gomproiones de progrms RFIFQF wros de in de Autoconf RFIFRF gomproiones de lirers F RFIFSF gomproiones de eers RFIFTF gomndos de slid F F F F F F RFPF hesuriendo wR F F F F F F F F F F F

12

IP IP IQ IQ IR IR IR IS

5. Usando Automake 16 SFIF sndo Automake en el congure.ac F F F F F F F F F F F F F F F F F F F F F F IT


SFPF gonvenin pr delrr ojetivos F F F F F F SFPFIF ijemplo IX gompilin de progrms SFPFPF ijemplo PX virers esttis F F F F F SFPFQF ijemplo QX virers de onvenieni F SFQF hiretorios F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F

IT IU IV IV IV

SFQFIF 6@srdirA y er SFRF fnders preEojetivo F F SFSF u se distriuyec F F F F SFTF gondiionles F F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

F F F F F F F F F F

IW IW IW PH

6. Libtool

TFIF virers omprtidsX n in(erno pr l portilidd TFPF gon(gurndo Libtool F F F F F F F F F F F F F F F F F F F TFPFIF n hello world3 on Libtool F F F F F F F F F F F TFQF gontruyendo lirers esttis o dinmis F F F F F F F TFRF vos progrms son relmente sripts F F F F F F F F F F TFSF ersionndo ls lirers F F F F F F F F F F F F F F F F F

21

PI PI PP PQ PQ PQ

7. Integrando doxygen con las Autotools

25

Captulo 1
Introduccin

hesde IWWI lgunos desrrolldores de qx trjn en l elorin de iertos sripts pr filitr l vid los desrrolldores de pquetes softwre qxF il onjunto de tods ests herrmients es onoido omo AutotoolsF hesde entones el sript configure es de uso oligtorio en ulquier pquete del proyeto qxF

pigur IFIX lids de l ejeuin de on(gure il sript configure prue el sistem pr el onjunto de funionesD lirers y herrE mients requeridsF gundo se ejeut gener un (hero cong.h on todos los #denes y (heros Makele pr onstruir el pquete @ver (g IFIAF odo esto se reliz pr que el proedimiento de instlin de estos pquetes pr el usurio (nl se tn simple omo ejeutr los siguientes omndosX

~ % tar zxf paquete.tar.gz ~ % cd paquete ~/paquete % ./configure ... ~/paquete % make ... ~/paquete % sudo make install ...
qris l uso de ls Autotools se simpli( tnto el trjo de los usurios omo el de los mntenedores o desrrolldores de los pquetesF gon l simple ejeuin del omndo make dist se re el pquete del proyeto softwre pr poder ser redistriuidoD mientrs que on el omndo make distcheck dems de onstruirse el pquete se relizn ls siguientes omproionesX e segur de que mke lenD mke distlenD y mke uninstll no omiten (herosF

1.1 Autoconf
gomprue que ls instliones DESTDIR funionnF ijeutn l suite de tests @mke hek y mke instllhekAF

hr slid un pquete que fll en l ejeuin del omndo mke disthek signi( estr dndo slid un pquete que fllr vrios usuriosF is ltmente reomendle pror diho omndo ntes de pulir nuestro pquete en ulquier sitioF i intentrs imitr el sistem de onstruin proporiondo por Autotools por tu propi uent desurirs queX il sistem de onstruin qx tiene muhs rterstis que nos ostrn muhE simo tiempo de implementr por nosotros mismosF elgunos usurios pueden esperr rterstis que tu no hs implementdoF smplementr este sistem de form portle es un trjo difil y exhustivoF @iens en los sripts de sistems que desonoes FFFAF heers de tulizr tu on(gurin pr seguir los mios de los estndrres de odi(in de qxF vs Autotools de qx nos proveen deX rerrmients pr rer el sistem de onstruin qx prtir de simple instruE ionesF n lugr donde se relizn orreiones y mejors ontinumenteF e ontinuin se present un reve resumen del ometido de ls priniples herrmients de AutotoolsF

1.1. Autoconf
Autoconf es un herrmient pr produir shell sripts que on(gurn utomtimente pquetes de digo fuente pr dptrse vrios tipos de sistems osixElikeF vos sripts de on(gurin produidos por Autoconf son independientes de Autoconf undo se ejeutnD por lo que sus usurios no tienen que her nd on AutoconfF
vos sripts de on(gurin produidos por Autoconf o requieren intervenin mnul del usurio undo se ejeutnY normlmente ni requieren que se espei(que el tipo del sisteE m @lo reonoe utomtimenteAF in vez de elloD ompruen individulmente l preseni de d un de ls rterstis requeridsF gomo resultdoD lleg un uen uerdo on sistems hridos yGo personlizdosF in d pquete softwre en el que se us AutoconfD se re un sript de on(gurin prtir de un plntill que list ls rterstis del sistem que el pquete neesitr o usrF i ms trde neesitmos justr el sript por ulquier rznD solo neesitremos mirlo en este sript y no en todos los sudiretorios del proyetoF

1.2 Automake

il prinipl ojetivo de Autoconf es her l vid del usurio ms senillY her ms senill l vid del desrrolldor es solo un ojetivo seundrioF hiho de otr mnerD el prinipl ojetivo no es her l generin del sript configure de form utomti pr los mntenedoresY en vez de elloD el ojetivo es her el configurefil de trtrD portle y predeile pr los pquetes suministrdos los usuriosD y en este sentidoD Autoconf onE sigue su ojetivoF

Autoconf o soluion todos los prolems reliondos on l relizin de pquetes softwre portlesF r soluiones ompletsD Autoconf dee ser usdo en onjunto on otrs herrmients de onstruin de qx omo Automake y LibtoolF ists otrs herrE mients sumen trjos omo l rein de Makele s reursivos on todos los ojetivos estndrD linkdo de lirers omprtidsD etF

1.2. Automake
Automake es un herrmient pr generr utomtimente rhivos Makele.in prE tir de rhivos Makele.amF gd Makele.am es simente un serie de de(niiones de vriles make on regls que se lnzn osionlmenteF vos Makele.in generdos estn justdos los estndres de qx sore MakeleF
il ojetivo de Automake es eliminr el mntenimiento de Makele F vos (heros hiE tules Automake ontienen simplemente un serie de de(niiones de vrilesF gd uno de estos (heros es proesdo pr re un Makele.inF heer her generlmente un Makele.am por diretorio en el proyetoF

Automake impli ierts restriiones sore un proyetoX por ejemploD sume que el proE yeto us AutoconfD y fuerz ierts restriiones en el ontenido del congure.acF edems requiere de perl pr generr los Makele.inF in emrgoD ls distriuiones reds on Automake o requieren perl pr ser onstruidsF

1.3. Libtool
Libtool impli( el trjo del desrrolldor pr enpsulr ls dependenis espeE (s de l pltformD y l interfz de usurio en un simple sriptF ist disedo tl que l funionlidd omplet de d tipo de host est disponile trvs de un interfz genE riD de form que ls peuliriddes desgrdles estn oults pr el progrmdorF
v interfz onsistente de Libtool es trnquilizdor FFF los usurios no neesitn leer l osur doumentin pr poder tener su pquete fuente onstruido omo un lirer dinmiF olo tendrn que ejeutr el sript configure y Libtool relizr todo el trjo suioF

Captulo 2
Ejemplo sencillo: HelloWorld!

vos proyetos softwre deern estr orgnizdos siempre que se pued en surpeE tsD por lo que prtiremos de est ideF sdelmenteD todos los (heros fuente deern estr en un rpet llmd sr dentro de l rpet del proyetoD y on el resto de (heros @omo mke(lesD sripts on(gureD y (heros de textoA seprdos en l rz del proyetoF vos proyetos on vrios niveles de rpets suelen ser llmdos proyetos profundosF he momento empezremos on el ejemplo ms senillo posileD un proyeto softwre on un progrm tpio de hol mundo3F vos tres (heros que deen generrse en este proyeto softwre son los siguientesX

congure.acF Makele.inF
srGMakele.inF

pigur PFIX piheros generr en un proyeto softwre e prtir de estos (heros se gener el sript configure y los (heros Fin on ls de(E niiones y regls neesris pr posteriormente generr los Makele @ver (gF PFIAF gmo veremos ontinuin el ontenido de estos (heros pr un proyeto senillo es muy reve y muy similr pr diferentes proyetosF

2.1 Contenido bsico

2.1. Contenido bsico


in ls siguientes suseiones se muestr el ontenido de d uno de los (heros sios y se hr un reve omentrio quells lnes que lo neesitenF mos rer un diretorio que se llme hello y vmos generr los siguientes (heros dentro de lF

1 3 5

2.1.1. Congure.ac

AC_INIT( [ amhello ] , [ 1 . 0 ] , [ bugreport@address ] ) AM_INIT_AUTOMAKE([ Wall Werror foreign ] ) AC_PROG_CC AC_CONFIG_HEADERS( [ config . h ] ) AC_CONFIG_FILES( [ Makefile src / Makefile ] ) AC_OUTPUT

2.1.2. Makele.am

SUBDIRS = src
2.1.3. src/Makele.am

bin_PROGRAMS = hello hello_SOURCES = main . c

2.1.4. src/main.c

2 4 6 8

#include <config . h> #include <stdio . h> int main ( void )


{ } puts ( " Hello World !" ) ; puts ( " This is " PACKAGE_STRING return 0;
"."

);

2.2. Preparando el paquete


n vez que hemos generdo dihos (heros ejeutmos el omndoX

$ autoreconf --install configure.ac:2: installing `./install-sh'

2.2 Preparando el paquete


configure.ac:2: installing `./missing' src/Makefile.am: installing `./depcomp'

oservremos que se hor tenemos disponiles nuevos (heros en nuestros diretoriosD tl y omo muestr l pigF PFPF

pigur PFPX piheros generdos trs ejeutr autoreconf install vos (heros Makele.inD srGMakele.inD configureD y cong.h.in son ls plntills de on(gurin esperdsF aclocal.m4 es un (hero on de(niiones pr ls mros de tereE ros usds en congure.acF depcompD install.sh y missing son herrmients uxilires usds durnte l onstruinF autom4te.cache es un diretorio que ontiene los (heros h de AutotoolsF ehor podemos ejeutr el sript configure pr on(gurr el progrmF

pipo@pipo-desktop: $ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc ... checking dependency style of gcc... gcc3 configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: executing depfiles commands
i no hy prolemsD podemos ejeutr el omndo make pr relizr l ompilin del progrmF gundo el progrm se ompile orretmente lo ejeutmos pr ver que todo funion orretmenteF

pipo@pipo-desktop: $ make make all-recursive make[1]: se ingresa al directorio ... Making all in src make[2]: se ingresa al directorio ... gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c mv -f .deps/main.Tpo .deps/main.Po gcc -g -O2 -o hello main.o

2.2 Preparando el paquete


... pipo@pipo-desktop: $ src/hello Hello World! This is amhello 1.0.

or ltimoD y omo omentmos nteriormenteD ejeutndo el omndo make distcheck ompromos si nuestro pquete est listo pr distriuirseF

pipo@pipo-desktop: $ make distcheck ... ============================================= amhello-1.0 archives ready for distribution: amhello-1.0.tar.gz =============================================

Captulo 3
Los dos paquetes principales

gomo se h podido oservrD el proeso de on(gurin y generin de un pquete es relmente senillo hiendo uso de ls AutotoolsF ist simpliidd se l deemos priniE plmente GNU Autoconf y GNU AutomakeF e ontinuin se muestrn los priniples omndos y rterstis que nos ofreen dihos progrmsF

Autoconf
autoconf X gre el configure prtir del congure.acF autoheaderX grete el cong.h.in prtir del congure.acF autoreconf X ijeut tods ls herrmients en el orden deudoF autoscanX ixmin los fuentes en squed de prolems omunes de portiE liddD y de mros perdids en congure.acF autoupdateX etuliz ls mros osolets en congure.acF ifnamesX ene los identi(dores de tods ls diretivs #if/#ifdef/... autom4teX il orzn de AutoconfF wnej el lenguje wR e implement ls rterstis usds por l myor de ls herrmients de rriF til pr rer lgo ms que un simple configureF

Automake
automakeX gre los Makele.in prtir de los Makele.am y congure.acF aclocalX ixmin congure.ac pr el uso de mros de tererosD y rene ls de(niiones en aclocal.m4F

3.1. Autoreconf
r supuesto uno de los myores vnes dentro de ls AutotoolsF v (gur QFI muestr los omndos que se tenn que ejeutr nteriormente que preier este omndoD mientrs que l (gur QFP muestr el pnorm tulF eutoreonf nos ofree ls siguientes ventjsX xo tienes que reordr l form de interin de tods ls herrmientsF s autoreconf install pr on(gurr el pquete iniilmenteF

3.2 Explicacin del ejemplo Hello World

pigur QFIX gomndos ejeutr ntes de l priin de utoreonf

pigur QFPX gomndo ejeutr on l priin de utoreonf gontr on ls regls de reonstruin @slid de Makele s pr volver ejeutr ls herrmients deuds undo ejeutes lgn (hero fuenteF olo neesits un ide somer del propsito de d herrmient pr omprender los erroresF @u herrmient se quej y sore quecA

3.2. Explicacin del ejemplo Hello World


3.2.1. Congure.ac

3.2 Explicacin del ejemplo Hello World

1 3 5 7 9 11

10

AC_INIT( [ amhello ] , [ 1 . 0 ] , [ bugreport@address ] ) #I n i c i a l i z a autoconf . #Especifica nombre del paquete , numero de version y direccion para #reportar errores . AM_INIT_AUTOMAKE([ Wall Werror foreign ] ) #I n i c i a l i z a automake . #Activa los alarmas de automake y las reporta como errores . #foreign hace que se ignoren algunos estandares de codificacion GNU AC_PROG_CC #Comprueba la existencia de un compilador de C AC_CONFIG_HEADERS( [ config . h ] ) #Declara a config . h como cabecera de #salida AC_CONFIG_FILES( [ Makefile src / Makefile ] ) #Declara a Makefile y #src / Makefile como ficheros de salida AC_OUTPUT #Da salida a todos los ficheros declarados
e ontinuin se muestrn ls slids on l opin foreign y sin ellF gon foreign

$ autoreconf --install configure.ac:2: installing `./install-sh' configure.ac:2: installing `./missing' src/Makefile.am: installing `./depcomp'
in foreign

$ autoreconf --install configure.ac:2: installing `./install-sh' configure.ac:2: installing `./missing' src/Makefile.am: installing `./depcomp' 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' autoreconf: automake failed with exit status: 1

3.2.2. Makele.am

SUBDIRS = src #Construccion recursiva en src /


3.2.3. src/Makele.am

1 3 5

bin_PROGRAMS = hello #Construccion de programas . Al tener el p r e f i j o #bin , los programas se instalaran en bindir . Solo hay un programa #a construir : hello . hello_SOURCES = main . c #Para crear el programa hello , solo se compila #el fichero main . c

3.2 Explicacin del ejemplo Hello World

11

in l l QFI se puede preir omo se orgniz el sistem de (heros hitulmente l trjr en este tipo de proyetos softwreF hiretory vrile

prefix exec-prefix bindir libdir FFF includedir datarootdir datadir mandir infodir FFF

hefult vlue /usr/local prefix exec-prefix/bin exec-prefix/lib

prefix/include prefix/share datarootdir datarootdir/man datarootdir/info

l QFIX terrqu del sistem de (heros estndr

Captulo 4
Usando Autoconf

que he uso de instruiones de tipo mroD en el configureD un shell sript ompletoF Autoconf ofree vris mros pr relizr omproiones omunes de on(gurinF xo es extro tener un congure.ac sin onstrutores de shellD usndo solo mrosF il proesdor rel de mros es tulmente qx wRF Autoconf ofree un infrestrutur enim de qx wRD dems del onjunto de mrosF

Autoconf es un proesdor de mrosF gonvierte el congure.acD que es un shell sript

4.1. La estructura de congure.ac

1 3 5 7 9 11

# Preludio . AC_INIT( [ amhello ] , [ 1 . 0 ] , [ bugreport@address ] ) # Comprobaciones para programas # Comprobaciones para l i b r e r i a s # Comprobaciones para ficheros de cabecera # Comprobaciones para typedefs , structures , y # c a r a c t e r i s t i c a s del compilador # Comprobaciones para funciones de l i b r e r i a # Ficheros de salida AC_CONFIG_FILES( [ FILES ] ) AC_OUTPUT
4.1.1. Preludio
AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS) sniilizin oligtori de AutoconfF

odemos prtir siempre de un plntill omo l siguienteX

AC_PREREQ(VERSION) equerir un versin mnim de AutoconfF FeF AC_PREREQ(2.61) AC_CONFIG_SRCDIR(FILE) n omproin de seguriddF FILE dee ser un (hero fuente distriuidoD y esto se segur de que configure no se ejeut desde un espio exteriorF FeF AC_CONFIG_SRCDIR([src/main.c])F

4.1 La estructura de congure.ac

13

AC_CONFIG_AUX_DIR(DIRECTORY) vos sripts uxilires omo install-sh y depcomp deen enontrrse en el DIRECTORYF FeF AC_CONFIG_AUX_DIR([build-aux])F i esto no se inluye se tom por defeto el diretorio tulF

4.1.2. Comprobaciones de programas


AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, ... gomproiones del ompildorF @wnej l squed ruzd de ompildores si es neesrioA AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, ... fus uens implementiones y on(gure $SEDD $YACCD $LEXD etF AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND]) he(ne VAR pr el primer PROGS enontrdoD o VAL-IF-NOT-FOUND en so ontrrioF

1 3

AC_CHECK_PROGS( [TAR] , [ tar gtar ] , [ : ] ) if test " $TAR " = : ; then AC_MSG_ERROR( [ Este paquete necesita tar . ] )

fi

FFF y muhos ms

4.1.3. Macros de accin de Autoconf


AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS]) smprime ERROR-DESCRIPTION @in config.logA ort configureF AC_MSG_WARN(ERROR-DESCRIPTION) vo mismoD pero no ortF AC_DEFINE(VARIABLE, VALUE, DESCRIPTION) smprime lo siguiente config.hF
2

/ DESCRIPTION / #define VARIABLE VALUE AC_SUBST( [FOO] , [ foo ] )

AC_SUBST(VARIABLE, [VALUE]) he(ne $(VARIABLE) omo VALUE en MakefileF



1


2

FOO=foo AC_SUBST( [FOO] ) AC_SUBST( [FOO] ) FOO=foo


odos son equivlentesF

4.1 La estructura de congure.ac

14

4.1.4. Comprobaciones de libreras


AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT]) gomprue si l lirer LIBRARY existe y ontiene l funin FUNCTF ijeut ACT-IF-FOUND si s ourreD ACT-IF-NOT en so ontrrioF
2

AC_CHECK_LIB( [ efence ] , [ malloc ] , [EFENCELIB= lefence ] ) AC_SUBST( [EFENCELIB] )

FFF deermos usr ms trde $(EFENCELIB) en l regl de linkdoF i ACT-IF-FOUND no se estlee y l lirer se enuentrD AC_CHECK_LIB hr que LIBSaElLIBRARY $LIBS y #define HAVE_LIBLIBRARYF @Automake us $LIBS pr el linkdo de tods ls ossFA

4.1.5. Comprobaciones de cabeceras


AC_CHECK_HEADERS(HEADERS...) gomproiones de HEADERS y #define HAVE_HEADER_H pr d eer enontrE dF
2

AC_CHECK_HEADERS( [ sys /param . h unistd . h ] ) AC_CHECK_HEADERS( [ wchar . h ] )

5de(ne HAVE_SYS_PARAM_HD HAVE_UNISTD_HD y HAVE_WCHAR_HF


2

#if HAVE_UNISTD_H # include <unistd . h> #endif 

AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT]) gomprue solo un eer

4.1.6. Comandos de salida


AC_CONFIG_HEADERS(HEADERS...) gre HEADER por d HEADER.inF se solo un de dihs eers no ser que onoz lo que est hiendo @autoheader re HEADER.in solo pr el primer HEADERAF HEADERS ontiene de(niiones hehs on AC_DEFINEF
1

AC_CONFIG_HEADERS( [ config . h : config . hin ] )

grer config.h prtir de config.h.in @htq suport solo I puntoAF

AC_CONFIG_FILES(FILES...) gre FILE por d FILE.inF FILES ontiene de(niiones hehs on AC_SUBSTF
1

AC_CONFIG_FILES( [ Makefile sub/ Makefile script . sh : script . in ] )

eutomke re FILE.in por d FILE que tiene un FILE.amF isto tmin sirve pr proesr (heros que no son Makele sF

4.2 Descubriendo M4

15

4.2. Descubriendo M4
er muy til onoer fondo el lenguje de progrmin wRF odis enontrr ms detlles en httpXGGwwwFlrdeFepitFfrG dlGutotoolsFhtml

Usando

Automake

Captulo 5

Automake yud l rein de Makele portles y que umplen el estndr qx generndo los Makele.in prtir de los Makele.amF vos Makele.am siguen somermente l mism sintxis que los MakeleD sin emrgoD usulmente solo ontienen de(niiones de vrilesF Automake re regls de onstruin prtir de dihs de(niionesF edems puedes seguir diendo regls Makele los (heros Makele.amD y que Automake ls
preservr en l slidF

5.1. Usando Automake en el congure.ac

AM_INIT_AUTOMAKE( [OPTIONS] )

in l eF PFIFI pree l mro que iniiliz AutomakeD y que omprue l preseni de ls herrmients neesris pr su orreto funionmientoF intre ls diferentes opiones que podemos inluir en AM_INIT_AUTOMAKE tenemos ls siguientesX

-WallX etiv tods ls lrms @wrningsAF -WerrorX eport ls lrms omo erroresF foreignX elj iertos requerimientos del estndr qxF 1.10.1X equiere un versin mnim de AutomakeF dist-bzip2X min re rhivos trFzP durnte make dist y make distcheckF tar-ustarX gre rhivos tr usndo el formto ustrF

AC_CONFIG_FILES( [ Makefile sub/ Makefile ] )

wedinte AC_CONFIG_FILES Automake re un (hero psviFin por d psviFmF

5.2. Convencin para declarar objetivos

option_where_PRIMARY = targets . . .

v delrin de ojetivos en los (heros Makele.am sigue l siguiente formX

5.2 Convencin para declarar objetivos


honde PRIMARY puede serX

17

PROGRAMSX rogrmsF LIBRARIESX virers esttisF LTLIBRARIESX virers dinmisF HEADERSX geersF SCRIPTSX riptsF DATAX htos diionlesF
where puede tomr los vloresX

bin_X rogrms ejeutles que se instln en 6@indirA lib_X virers que se instln en 6@lidirA custom_X goss que se instln en 6@ustomdirAD donde diho diretorio dees de(E nirlo previmenteF noinst_X xo instlleF
por ltimoD option puede serX

dist_X e distriuyen los targets @si no se espei( est es l opin por defetoAF nodist_X xo se distriuyenF

1 3

#Makefile .am bin_PROGRAMS = foo runme foo_SOURCES = foo . c foo . h print . c print . h run_me_SOURCES = run . c run . h print . c
vos progrms foo y run-me se instlrn en $(bindir)F n detlle uriosoD es que los rteres no lphEnumrios @omo el guin o signo menos EA son siempre mpedos guiones jos F Automake lul utomtimente medinte l list de (heros fuente indidosD los ojetos onstruir y los linkdos relizrF vs eers no se ompilnD pero se indin qu pr que sen distriuidsF

5.2.1. Ejemplo 1: Compilacin de programas

5.3 Directorios

18

2 4

5.2.2. Ejemplo 2: Libreras estticas

#Makefile .am lib_LIBRARIES = l i b f o o . a libbar . a libfoo_a_SOURCES = foo . c privfoo . h libbar_a_SOURCES = bar . c privbar . h include_HEADERS = foo . h bar . h

r onstruir lirers esttis deemos dir l congure.ac l mro AC_PROG_RANLIBF hihs lirers se instlrn en $(libdir)F vs lirers siempre deen seguir l nomenlE tur lib*.aF vs eers plis @lne RA se instlrn en $(includedir)F vs eers privds @(heros Fh en lnes P y QA no se instlrn omo (heros fuente ordinriosF

5.2.3. Ejemplo 3: Libreras de conveniencia


1 3

#l i b / Makefile .am noinst_LIBRARIES = libcompat . a libcompat_a_SOURCES = xalloc . c xalloc . h

on quells lirers que solo se usn l hor de onstruir nuestro pqueteF

1 3 5 7

#src / Makefile .am bin_PROGRAMS = foo runme foo_SOURCES = foo . c foo . h print . c print . h run_me_SOURCES = run . c run . h print . c LDADD=../ l i b /libcompat . a AM_CPPFLAGS = I \$( srcdir ) / . . / l i b #run_me_LDADD = . . / l i b /libcompat . a #run_me_CPPFLAGS = I \$( srcdir ) / . . / l i b
LDADD se de undo se enlzn todos los progrmsF AM_CPPFLAGS ontiene nders pr el preproesdor diionlesF vs dos ltims lnes omentds hen refereni que se pueden usr vhehh y gpveq pr progrms independientesF

5.3. Directorios
#configure . ac AC_CONFIG_FILES( [ Makefile l i b / Makefile src / Makefile src / dira / Makefile src / dirb / Makefile ] ) # Makefile .am SUBDIRS = l i b src

heemos tener un Makele @uno por d Makele.am A por diretorio y todos ellos deen estr delrdos en congure.acF


1

gd Makele.am dee estleer el orden en que sus diretorios se reorren usndo l vrile SUBDIRSF

i no espei(mos el diretorio tul medinte un punto FD este se ompilr impliE tmente despus de los sudiretoriosF

5.4 Banderas pre-objetivo

19

# src / Makefile .am SUBDIRS = . dira dirb


5.3.1. $(srcdir) y VPATH
is importnte reordr que un (hero fuente no est neesrimente en el diretorio tulF ry dos roles gemelosX el build tree y el source treeF

Makele y los (heros ojeto estn en el build treeF Makele.in y Makele.am y los (heros fuente estn en el source treeF
i se ejeut FGconfigure en el diretorio tulD los dos roles sern el mismoF is posile que neesitemos utilizr l vrile srcdir undo espei(quemos nders pr herrmientsD o esrimos omndos propiosF FeFD pr indirle l ompildor que inluy eers de /dirD tendremos que esriir -I$(srcdir)/dirF

5.4. Banderas pre-objetivo


esummos que foo es un progrm o lirerX

foo_CFLAGSX fnders diionles pr el ompildor de gF foo_CPPFLAGSX fnders diionles pr el preproesdor @Ess y EhsAF foo_LDADDX vinkdo de ojetos diionlD Els y Evs @si foo es un progrmA foo_LIBADDX vinkdo de ojetos diionlD Els y Evs @si foo es un lirerA foo_LDFLAGSX fnders de linkdo diionlesF
il vlor por defeto pr foo_XXXFLAGS es 6@ewpveqAF

5.5. Qu se distribuye?
vos omndos make dist y make distcheck rern un trll que ontendrX odos los (heros fuente delrdos usndo ..._SOURCESF ods ls eers delrds usndo ..._HEADERSF odos los sripts delrdos usndo dist_..._SOURCESF odos los dtos delrdos usndo dist_..._SOURCESF piheros omunes omo ghngevogD xiD etF piheros o diretorios extr listdos en EXTRA_DISTF

5.6 Condicionales

20

5.6. Condicionales

2 4 6


1 3 5

#Programas condicionales bin_PROGRAMS = foo if WANT_BAR bin_PROGRAMS += bar endif foo_SOURCES = foo . c bar_SOURCES = bar . c #Fuentes condicionales bin_PROGRAMS = foo foo_SOURCES = foo . c if WANT_BAR foo_SOURCES += bar endif

il uso de ondiionles nos permite relizr pquetes inondiionles on onstruiones ondiionlesF

in estos ejemplos se dn ls siguientes peuliriddesX

bar es onstruido si WANT_BAR es verdderoF @1er ejemploA bar.o es linkdo en foo si WANT_BAR es verdderoF @2o ejemploA foo.c y bar.c son distriuidos pesr de WANT_BARF WANT_BAR se dee delrr y se le dee dr un vlor en congure.acF

#configure . ac AC_CHECK_HEADER( [ bar . h ] , [ use_bar=yes ] ) AM_CONDITIONAL( [WANT_BAR] , [ test " $use_bar " = yes ] )

Captulo 6
Libtool

6.1. Libreras compartidas: Un inerno para la portabilidad


gd pltform tiene su propi form de implementr l ide de lirers omprtids o dinmisD y por lo tnto hy vris herrmients neesris pr onstruir dihs lirersF Libtool deleg dihs herrmients espe(s de d pltform y le d l desrrolldor un onjunto simple de opiones pr relizr todo el trjoF elgunos de los formtos de lirers dinmis existentes sonX lihelloFso lihelloFdll lihelloFsl lihelloFdyli wedinte Libtool disponemos de un nuevo formto que stre todos los demsX libhello.la @litool arhiveAF n sript es el enrgdo de trduir ls operiones inE volurds on los (heros lib*.la operiones orrets pr el sistem tul usndo l lirer relF in Makele.am simplemente tenemos que rer y linkr ontr los (heros *.laF

6.2. Congurando Libtool


il primer pso es indispensleD deemos llmr l mro AC_PROG_LIBTOOL en congure.acF hespusD pr delrr un lirer dinmi medinte Libtool usremos _LTLIBRARIES en los Makele.amF or ltimoD podremos usr _LDADD pr linkr ontr los rhivos loles generdor on LibtoolF

1 3 5

#Makefile .am lib_LTLIBRARIES = l i b f o o . la libfoo_la_SOURCES = foo . c foo . h etc . c bin_PROGRAMS = runme

6.2 Congurando Libtool

22

runme_SOURCES = main . c runme_LDADD = l i b f o o . la

6.2.1. Un hello world! con

Libtool

1 3 5 7 9

#include <config . h> #include <stdio . h> void say_hello ( void )


{


/ l i b /say . c

puts ( " Hello World !" ) ; puts ( " This is " PACKAGE_STRING

"."

);

void say_hello ( void ) ; 

/ l i b /say , h

2 4 6 8

#include "say.h" int main ( void )


{


/ src /main . c

return 0;

say_hello ( ) ;


1 3 5

#l i b / Makefile .am lib_LTLIBRARIES = l i b h e l l o . la libhello_la_SOURCES = say . c say . h #src / Makefile .am AM_CPPFLAGS = I ( srcdir ) / . . / l i b / bin_PROGRAMS = hello hello_SOURCES = main . c hello_LDADD = . . / l i b / l i b h e l l o . la #Makefile .am SUBDIRS = l i b src


2 4 6 8

AC_INIT( [ amhello ] , [ 2 . 0 ] , [ bugreport@address ] ) AC_CONFIG_AUX_DIR( [ build aux ] ) AM_INIT_AUTOMAKE([ Wall Werror foreign ] ) AC_PROG_LIBTOOL AC_PROG_CC AC_CONFIG_HEADERS( [ config . h ] ) AC_CONFIG_FILES( [ Makefile l i b / Makefile src / Makefile ] ) AC_OUTPUT

6.3 Contruyendo libreras estticas o dinmicas

23

6.3. Contruyendo libreras estticas o dinmicas


or defetoD se onstruyen tnto ls lirers esttis omo ls dinmisF isto se puede mir usndo ls siguientes mrosX

AC_DISABLE_SHAREDX xo onstruye ls lirers dinmisF AC_DISABLE_STATICX xo onstruye ls lirers esttisF


il usurio puede soreesriir l on(gurin usndo ls opiones del configureX

enable-shareX gonstruye lirers dinmisF disable-shareX xo lo heF enable-staticX gonstruye lirers esttisF disable-staticX xo lo heF

6.4. Los programas son realmente scripts


in el ejemplo nteriorD src/hello puede ser un sript dependiendo de l on(gurin de LibtoolF il inrio rel se onstruye siempre pero Libtool lo oult en el built treeF il sript ejeut el inrio rel y se orgniz de tl form que enuentr ls lirers que n no hn sido instldsF he est form src/hello puede ejeutrse por ejemploD en un entorno de pruesF el ser src/hello un sriptD este no puede ser diretmente depurdo on un herrE mient omo gd

~/prueba % gdb -q src/hello "src/hello": not in executable format: File format not recognized (gdb)
enemos que dir el siguiente pre(joX libtool mode=execute

~/prueba % libtool --mode=execute gdb -q src/hello (gdb)

6.5. Versionando las libreras


hndo diferentes versiones ls lirers podemos her que oexistn vris versiones de l mism lirerF isto segur que los progrms usen l lirer que implementen l interfz que requiernF vs interfes son identi(ds usndo enterosF n progrm reuerd los nmeros de interfz de ls lirers ontr ls que est linkdoF is importnte tener en uent que los nmeros de interfz no son los nmeros de lnzmientoF enemos ls siguientes triplets de vloresX

CURRENTX v ltim interfz implementdF

6.5 Versionando las libreras

24

REVISIONX il nmero de implementin de CURRENTF ist reliondo on


el nmero de ugs orregidosF

AGEX il nmero de interfes implementds menos unoF

2 4

#l i b / Makefile .am lib_LTLIBRARIES = l i b h e l l o . la libhello_la_SOURCES = say . c say . h libhello_la_LDFLAGS = version info CURRENT:REVISION:AGE

hihos nmeros deen ser espei(dos usndo -version-infoF

Integrando doxygen con las

Autotools

Captulo 7

lguns extensiones de rD g5 y hF roporion un mquinri genri pr generr un proyeto de doumentin ien formtedo diretmente del digo fuente y de los dtos externosF v doumentin resultnte est disponile en vrios formtosD pFeF pdfD htmlD hmD etF r dir el soporte de Doxygen ls AutotoolsD voy explir el ejemplo suministrdo por l we de wrtin wnnF gon diho ejemplo se proporion un serie de prmetro que se pueden dir l configurepr generr de form rpid y senill diferentes tipos de doumentin medinte DoxygenF hiho ejemplo puede ser desrgdo de quF vos psos relizr pr integrr Doxygen on ls Autotools en nuestro proyeto son los siguientesX houmentr nuestro digo siguiendo l gu de doumentin doxygenF grer un soporte de Autotools pr nuestro proyetoD tl y omo hemos ido explindo lo lrgo de este doumentoF hesrgr el hoxmpleEvPFIFtrFgz en l rpet rz de nuestro proyetoF snluir l lne 9inlude 6@topsrdirAGminludeFm9 l (hero Makele.am de nuestro diretorio rzF edir l lne 'DX_INIT_DOXYGEN($PACKAGE_NAME, MYDOXYGENCONFIG)' nuestro congure.acF @$PACKAGE_NAME se estlee utomtimente medinte AC_INIT repreE sentndo l nomre del proyetoD y MYDOXYGENCONFIG es el (hero de on(gurin Doxygen que viene on hoxmple pr nuestro proyetoF 'DX_INIT_DOXYGEN ept un terer prmetro opionl pr indir el diretorio de slid pr l doumentinD que por defeto es doxygenEdoF or d modo de slid puedes estleer su soporte medinte ls funiones DX_HTML_FEATURED DX_CHM_FEATURED DX_CHI_FEATURED DX_MAN_FEATURED DX_RTF_FEATURED DX_XML_FEATURED DX_PDF_FEATURED DX_PS_FEATURE diendo l lne DX_XXX_FEATURE(ON) o DX_XXX_FEATURE(OFF) tu congure.ac ntes de l lne DX_INIT_DOXYGEN(..)F n vez generdo el configureD podemos ver ls opiones relionds on doxygen ejeutndo './configure help'F uedes usr dihs opiones pr determinr el tipo de

Doxygen es un sistem de doumentin pr gCCD gD tvD yjetiveEgD ythonD shvD

Integrando doxygen con las Autotools

26

slid por defeto de doxygen @pFeF 9!disleEdoxygenEdo9 o 9!enleEdoxygenEpdf9AF gon 'make doxygen-doc' generrs (nlmente l doumentin Doxygen determind por el (hero de on(gurin DoxygenF od l doumentin ser situd en un nuevo sudiE retorio llmdo por defeto doxygenEdoF

S-ar putea să vă placă și