Está en la página 1de 5

6/10/2015

Entendiendo autoconf y automake: Parte 1

Entendiendo autoconf y automake: Parte 1


Germn Poo Caamao
< g p o o @ u b i o b i o . c l >

Se describe el funcionamiento bsico de las herramientas autoconf y automake.

Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los trminos de la Licencia de Documentacin Libre GNU, versin 1.1 o cualquier
versin posterior publicada por la Free Software Foundation. No hay Secciones Invariantes ni Textos de Portada o Contraportada. Puedes consultar una copia de
la licencia en http://www.gnu.org/copyleft/fdl.html.
Tabla de contenidos
1.
2.
3.
4.
5.
6.

Introduccin
aclocal
autoheader
autoconf
automake
Una aplicacin de ejemplo: El proyecto "hola mundo".

Tabla de ejemplos
1. Un archivo configure.in bsico
Tabla de contenidos
1. Introduccin
2. aclocal
3. autoheader
4. autoconf
5. automake
6. Una aplicacin de ejemplo: El proyecto "hola mundo".

1. Introduccin
aclocal genera el archivo aclocal.m4, a partir del cual acceder a las macros de Automake, es decir, prepara el camino para usar Automake.

2. aclocal
aclocal busca macros en todos los archivos .m4 del directorio en donde se ejecuta y finalmente busca en el archivo configure.in. Todas esas macros se incluirn
en el archivo aclocal.m4, as como las macros de las cuales dependen.
El archivo acinclude.m4 sirve para especificar macros locales (propias del proyecto) en configure.
El archivo aclocal.m4 solo ser generado si se encuentran macros de Automake, es decir, que comiencen con AM_
Por ejemplo, un archivo configure.in basico (sin funcionalidad):
Ejemplo 1. Un archivo configure.in bsico
A C _ P R E R E Q ( 2 . 5 2 )
A C _ I N I T ( m i p r o g r a m a , 0 . 1 )
A M _ A U T O M A K E _ V E R S I O N ( 1 . 7 . 2 )
A C _ O U T P U T ( M a k e f i l e )

Despus de ejecutar aclocal, se crear el archivo aclocal.m4 bastante pequeo, y slo es de ejemplo. Si deseamos usar Automake, entonces debemos aadir la
macro AM_INIT_AUTOMAKE, para aadir todas las funcionalidades de Automake.
En ese caso, hemos puesto la macro AM_AUTOMAKE_VERSION para indicar que requerimos de la versin 1.7.2 de automake. En este ejemplo, lo hemos empleado,
para ver como es el archivo aclocal.m4 generado.
Una disgresin entre AC_INIT y AM_INIT_AUTOMAKE. Ambas macros son capaces de inicializar el nombre del paquete y la versin (que ms adelante
emplearemos).
La forma antigua de hacerlo es:
A C _ I N I T
A M _ I N I T _ A U T O M A K E ( m i p r o g r a m a , v e r s i o n )

La forma nueva de hacerlo es:


A C _ I N I T ( m i p r o g r a m a , 0 . 1 )
A M _ I N I T _ A U T O M A K E

Actualmente AM_INIT_AUTOMAKE acepta el nombre del paquete y la versin, pero no hay garanta que en el futuro siga funcionando de esa forma. Por lo tanto,
es conveniente usar el nuevo formato.

http://calcifer.org/documentos/autotools/

1/5

6/10/2015

Entendiendo autoconf y automake: Parte 1

3. autoheader
Autoheader crea una plantilla con un conjunto de directivas #define que pueden emplearse desde C. Para indicar el nombre del archivo se debe emplear la macro
AC_CONFIG_HEADERS. En versiones antiguas, se empleaba AM_CONFIG_HEADER, la cual est obsoleta. La forma de usarlo es:
A C _ C O N F I G _ H E A D E R S ( c o n f i g . h )

Con lo cual Autoheader crear el archivo config.h.in y que en un proceso posterior, pasar a ser config.h El nombre del archivo es arbitrario, pero config.h ya es
estndar en las aplicaciones.
En nuestro ejemplo, tenemos entonces:
A C _ P R E R E Q ( 2 . 5 2 )
A C _ I N I T ( m i p r o g r a m a , 0 . 1 )
d n l A M _ C O N F I G _ H E A D E R i s o b s o l e t e ,
A C _ C O N F I G _ H E A D E R S ( c o n f i g . h )

w e

u s e

A C _ C O N F I G _ H E A D E R S

i n s t e a d

A M _ A U T O M A K E _ V E R S I O N ( 1 . 7 )
A M _ I N I T _ A U T O M A K E
A C _ O U T P U T ( M a k e f i l e )

Si deseamos crear el archivo config.h ejecutaremos:


$

a c l o c a l
a u t o h e a d e r
$

Vemos que sea ha creado el archivo aclocal.m4, config.h.in y autom4te.cache. Los dos ltimos, generados por autoheader. El resultado en config.h.in es el
siguiente:
/ *

c o n f i g . h . i n .

G e n e r a t e d

/ *

N a m e o f p a c k a g e
# u n d e f P A C K A G E

f r o m

c o n f i g u r e . i n

D e f i n e t o t h e a d d r e s s
# u n d e f P A C K A G E _ B U G R E P O R T

w h e r e

D e f i n e t o t h e f u l l
# u n d e f P A C K A G E _ N A M E

n a m e

o f

/ *

n a m e

a n d

b u g

/ *

D e f i n e t o t h e f u l l
# u n d e f P A C K A G E _ S T R I N G
/ *

/ *

t h i s

o f

o f

p a c k a g e

f o r

p a c k a g e .

v e r s i o n

s h o r t

D e f i n e t o t h e v e r s i o n
# u n d e f P A C K A G E _ V E R S I O N

r e p o r t s

t h i s

D e f i n e t o t h e o n e s y m b o l
# u n d e f P A C K A G E _ T A R N A M E

V e r s i o n n u m b e r
# u n d e f V E R S I O N

a u t o h e a d e r .

* /

* /

/ *

/ *

b y

n a m e

t h i s

p a c k a g e

b e

s e n t .

* /

* /

o f

t h i s

p a c k a g e .

* /

o f

t h i s

p a c k a g e .

* /

p a c k a g e .

s h o u l d

* /

* /

Para utilizar Autoheader, requeriremos libtool, el cual se explica ms adelante.

4. autoconf
autoconf genera un script de configuracin a partir de de las definiciones en configure.in, que finalmente nos permitir compilar la aplicacin de acuerdo a la
configuracin del sistema (respecto a la ubicacin de archivos e implementaciones de funciones, etc.)
Autoconf primero busca en las macros que tiene en forma predefinida y luego en el archivo aclocal.m4, si existe, que anteriormente generamos con aclocal.
Despus de ejecutar:
$

a u t o c o n f

Vemos que se ha creado el script 'configure' y que tiene permisos de ejecucin.

5. automake
La utilidad es ampliamente usada en el desarrollo de aplicaciones, ya que a partir de un archivo, llamado Makefile, que contiene reglas de dependencia es capaz de
determinar las acciones a seguir, comunmente determinar que programas deben compilarse para obtener la aplicacin.
Sin embargo, es tedioso crear las reglas para que construya a travs de varios subdirectorios, con seguimiento automtico de dependencias, etc. Si se trabaja en
varios proyectos, significa, prcticamente, reinventar la rueda en cada uno de ellos, sin mecionar los problemas de portabilidad.
Automake permite automatizar esta labor.
Automake emplea el archivo Makefile.am como fuente, en donde se indica lo esencial a construir, y ser necesario por cada uno de los directorios en que

http://calcifer.org/documentos/autotools/

2/5

6/10/2015

Entendiendo autoconf y automake: Parte 1

necesitemos realizar alguna tarea. A partir de ello, generar una plantilla llamada Makefile.in.
Los archivos Makefile.in que se generarn depender exclusivamente de lo que se indique en la macro AC_OUTPUT.
As, despus de eliminar la macro AC_CONFIG_HEADERS (mas adelante se explicar nuevamente) obtendremos el siguiente resultado:
$

a u t
f i
f i
f i
e f
e f
e f
e f
e f
e f

c o n
c o n
c o n
M a k
M a k
M a k
M a k
M a k
M a k

o m a
g u r
g u r
g u r
i l e
i l e
i l e
i l e
i l e
i l e

k e
e . i
e . i
e . i
. a m
. a m
. a m
. a m
. a m
. a m

n :

r e q
r e q
r e q
e q u
e q u
e q u
e q u
e q u
e q u

n :
n :
:

r
:

r
:

r
:

r
:

r
:

u i r
u i r
u i r
i r e
i r e
i r e
i r e
i r e
i r e

e d

f i l e
f i l e
f i l e
i l e `
i l e `
i l e `
i l e `
i l e `
i l e `

e d
e d
d

f
d

f
d

f
d

f
d

f
d

` . /
` . /
` . /
. / C
. / I
. / N
. / R
. / A
. / C

i n s
m k i
m i s
O P Y
N S T
E W S
E A D
U T H
h a n

t a l
n s t
s i n
I N G
A L L
'

n
M E '
O R S
g e L

l - s h
a l l d
g ' n
' n o
' n o
o t f
n o t
' n o
o g '

'

n o
i r s '
o t f
t f o
t f o
o u n d
f o u
t f o
n o t

f o u n d
n o t f o u n d
o u n d
u n d
u n d
n d
u n d
f o u n

Nos indica que faltan archivos, que corresponden al de un proyecto. Los 5 primeros, automake los puede proveer porque son estdares en cada aplicacin, y
salvo que queramos realizar algn cambio, podemos quedarnos con lo que nos sugiera, para ello utilizaremos la opcin '--add-mising' de automake. Sin embargo,
los 4 ltimos son propios de la aplicacin y debemos crearlos, considerando que:
NEWS, es un registro de los cambios visibles al usuario donde los cambios ms recientes se deben colocar al inicio.
README, tiene una descripcin general del paquete. Tambin es posible indicar instrucciones especiales de instalacin.
AUTHORS, contiene la lista de nombres de quienes han trabajado en la aplicacin.
ChangeLog, es un registro de todos los cambios que se han efectuado en la aplicacin.
Adicionalmente, se recomienda incorportar los archivos MAINTAINERS y HACKING, donde:
MAINTAINERS, contiene la lista de nombres de los responsables del proyecto.
HACKING, contiene instrucciones para otros desarrolladores que quieran contribuir a la aplicacin. Aqu se incluyen normas de sana convivencia como es la el
estilo de programacin, tipos de autorizacin para efectuar cambios en forma directa, etc.
Intentamos nuevamente:
$
$
c o
c o
c o
M a
M a

t o u
a u t
n f i
n f i
n f i
k e f
k e f

c h

N E W
k e
e . i
e . i
e . i
. a m
. a m

o m a
g u r
g u r
g u r
i l e
i l e

R E A
d d
i n
i n
i n
i n s
i n s

- - a
n :
n :
n :
:
:

D M E
- m i
s t a
s t a
s t a
t a l
t a l

A U
s s i
l l i
l l i
l l i
l i n
l i n
g

T H O
n g
n g
n g
n g

R S
` . /
` . /
` . /
` . / C
` . / I

C h a n g e L o g
i n s
m k i
m i s
O P Y
N S T

t a l
n s t
s i n
I N G
A L L

l - s h '
a l l d i r s '
g '
'

Es importante revisar el archivo COPYING, puesto que contiene la licecia de uso de la aplicacin. Por omisin, ser GPL.
Luego, se encuentran todos los archivos preparados para ejecutar el script configure. Hay que notar que, cuando distruyamos nuestra aplicacin, no es necesario
que la contraparte disponga de aclocal, autoheader, autoconf y automake.

6. Una aplicacin de ejemplo: El proyecto "hola mundo".


Crearemos el ambiente para que el clsico programa "Hola mundo" podamos distribuirlo fcilmente. Para ello, situaremos nuestro programa "hola_mundo.c" en el
subdirectorio 'src'. Por lo tanto, necesitaremos dos dos archivos 'Makefile.am', uno para el directorio raz del proyecto y otro para el subdirectorio 'src'.
El archivo configure.in quedar de la siguiente forma:
A C _ I N I T ( h o l a - m u n d o , 0 . 1 )
A M _ I N I T _ A U T O M A K E
A C _ P R O G _ C C
A C _ O U T P U T ( [
M a k e f i l e
s r c / M a k e f i l e
] )

Hemos indicado que el nombre de nuestro proyecto se llama 'hola-mundo' y la versin inicial es la 0.1. Hemos aadido la macro AC_PROG_CC, la cual nos proveer
de los verificaciones necesarias para asegurarnos la disponibilidad de un compilador de C.
Finalmente indicamos, que requerimos generar los archivos Makefile del directorio raz y del subdirectorio src.
Nuestro proyecto partir con los siguiente archivos:
$

l s
A U T H O R S
C h a n g e L o g
c o n f i g u r e . i n
$ l s s r c
h o l a _ m u n d o . c
M a k e f i l e . a m

M a k e f i l e . a m

N E W S

R E A D M E

s r c

El archivo Makefile.am del directorio raz contendr:


S U B D I R S

s r c

http://calcifer.org/documentos/autotools/

3/5

6/10/2015

Entendiendo autoconf y automake: Parte 1

E X T R A _ D I S T

A U T H O R S

C h a n g e L o g

N E W S

R E A D M E

En donde se indica, que debe procesar el subdirectorio src. SUBDIRS es una variable genrica, en donde se especifican todos los subdirectorios que se deben
procesar.
Luego, indicamos todos los archivos que son parte extra de la aplicacin y que deseamos que se distribuya.
Y el contenido del archivo src/Makefile.am ser:
b i n _ P R O G R A M S

h o l a m u n d o

h o l a m u n d o _ S O U R C E S

h o l a _ m u n d o . c

La variable bin_PROGRAMS indica como se llamar la aplicacin final, nuestro archivo binario (ejecutable), si deseamos generar una biblioteca y no un programa
ejecutable, emplearemos libexec_PROGRAMS.
Cabe notar que le hemos llamado 'holamundo'. Ese mismo texto se emplear para definir otras variables, como holamundo_SOURCES, holamundo_LDADD, por
nombrar las ms comunes.
Nuestro programa en C, contiene:
# i n c l u d e
i n t
m a i n

< s t d i o . h >

( i n t

a r g c ,

c h a r

* * a r g v )

{
p r i n t f

( " H o l a

m u n d o \ n " ) ;

Ya se encuentra todo preparado. En breve, ejecutaremos:


$

a c l
a u t
a u t
. / c
m a k
$
$
$
$

o c a
o c o
o m a
o n f

l
n f
k e

- - a d d - m i s s i n g
i g u r e

El detalle es:
$

a c l
a u t
a u t
n f i
n f i
n f i
k e f
k e f
c / M
. / c
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
e c k
n f i
n f i
n f i
n f i
m a k
k i n
k e [
u r c
p f i
p m o

$
$
c o
c o
c o
M a
M a
s r
$
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c h
c o
c o
c o
c o
$
M a
m a
s o
d e
d e
g c c
g c c
m a k
m a k
m a k
m a k
$

o c a
o c o
o m a
g u r
g u r
g u r
i l e
i l e
a k e
o n f
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
i n g
g u r
g . s
g . s
g . s

l
n f
k e

- - a
n :
n :
n :

d d i n s
i n s
i n s
: i n s t
: i n s t
e . a m :
r e
r a B S
e t h e r
r g a w k
e t h e r
r g c c .
r C c o
e t h e r
e t h e r
r s u f f
r s u f f
e t h e r
e t h e r
r g c c
r s t y l
p e n d e n
c r e a t i
u s : c r
u s : c r
u s : e x

e . i
e . i
e . i
. a m
. a m
f i l
i g u
f o
w h
f o
w h
f o
f o
w h
w h
f o
f o
w h
w h
f o
f o
d e
e :
t a t
t a t
t a t

m i s
t a l
t a l
t a l
a l l
a l l
i n s

s i n
l i n
l i n
l i n
i n g
i n g
t a l

D - c
b u i
. . .
m a k
. .
m p i
t h e
w e
i x
i x
w e
g c c
o p t

t i b l e i n s t a l l . . . / h o m e / g p o o / b i n / i n s t a l l
n v i r o n m e n t i s s a n e . . . y e s

e a t
e a t
e c u

o m p a
l d e
g a w
e s e
g c c
l e r
C c
a r e
o f e
o f o
a r e
a c c
i o n
f i n
s t y l
. / c o
i n g
i n g
t i n g

n f i
M a k
s r c
d e

g . s
e f i
/ M a
p f i

o u t
w o r
c o m p i
b l e s .
f i l e s
t h e G
g . . .
e p t A
u s e d
c c . . .
t a t u s
l e
k e f i l
l e s c

d i
o . c
l a _
s h
E = \
h o l
d i r
d i
c e
d i r

r e c t
' o b
m u n d
. . / d
" h o l
a m u n
e c t o
r e c t
n a d a
e c t o

o r y
j e c
o . P
e p c
a - m
d o
r y
o r y
p a
r y

` /
t = '
o '
o m p
u n d
h o
` / h
` /
r a
` / h

h o m
h o l
t m p
\
o \ "
l a _
o m e
h o m
` a l
o m e

o
c y
n g

g
g

` . /
` . /
g ` . /
` . / C
` . / I
l i n g

i n s
m k i
m i s
O P Y
N S T
` . /

t a l
n s t
s i n
I N G
A L L
d e p

l - s h '
a l l d i r s '
g '
'
'
c o m p
- c

k
t s

$ ( M A K E ) . . .

y e s

d e f
o m p
c r o
x e c
b j e
u s i
e p t
t o
c l u

a u l
i l e
s s
u t a
c t
n g

. . . a . o u t
. . y e s
g . . . n o

a c c
d e

p u t
k s .
l i n
. .
. . .
N U
y e s
N S I
b y
g c

o f

o
C

c o m p i l e r . . .

y e s

C . . . n o n e n e e d e d
m a k e . . . G N U
c

e
o m m a n d s

e [
e [
e [
e [

s r c
H o l a

a l l
1 ] :
e = '
l e =
d e =
D P A
- g
1 ] :
1 ] :
1 ] :
1 ] :
/ h o
m u n

i n
E n t
o l a
. d e
c c
K A G
O 2
L e a
E n t
N o
L e a
a m u

h
'
g
C
-

s r c
n g
n d
h o
n /
A M
- o
n g
i n g
h a
n g

e r i
_ m u
p s /
/ b i
E _ N
v i
e r
s e
v i

e / g p o o / t m p / a u t o t o o l s / s r c '
a _ m u n d o . o ' l i b t o o l = n o \
d e p f i l e = ' . d e p s / h o l a _ m u n d o . T P o '
- D
m u n
/ g p
e / g
l - a
/ g p

P A C
d o .
o o /
p o o
m ' .
o o /

K A G E _ T A R N A M E = \ " h o l a - m u n d o \ "

- D P A C K A G E _ V E R S I O N = \ " 0 . 1 \ "

- D P A C K A G E _ S T R I N G = \ " h o l a - m u n d o \

0 . 1 \ "

- D P A C K A G E _ B

o
t m p / a u t o t o o l s / s r c '
/ t m p / a u t o t o o l s '
t m p / a u t o t o o l s

n d o

d o

Y ya se encuentra nuestro programa compilado y funcionando.

http://calcifer.org/documentos/autotools/

4/5

6/10/2015

Entendiendo autoconf y automake: Parte 1

Si queremos distribuirlo, entonces ejecutamos:


$

m a k
. ]
= =
a = =

[ . .
= = =
h o l
= = =

d i s t c k e c k
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
m u n d o - 0 . 1 . t a r . g z i s r e a d y f o r d i s t r i b u t i o n
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Es decir, nos ha empaquetado un archivo listo para liberar la versin 0.1 de hola-mundo.
Adems, podemos ejecutar make install, make uninstall, make clean, make distclean.

http://calcifer.org/documentos/autotools/

5/5

También podría gustarte