Autotools

Publicado en C/C++, Linux el 13 de November, 2009 por Fran.

Si alguien sabe lo que son las autotools, seguramente haya sufrido para saber cómo funcionan. Hacía mucho tiempo que no me peleaba con ellas, hasta que hace unos días leí un pequeño manual sobre cómo configurar los diferentes archivos necesarios y me acordé de un pequeño manual que hice cuando me tocó pegarme con ellas, que voy a recuperar.

¿Qué son las autotools?

Las autotools, son programas que se usan para crear un paquete de código fuente que se pueda distribuir y compilar de una manera sencilla (configure, make y make install). Los programas que forman las autotools son los siguientes:

  • aclocal
  • autoconf
  • automake

Estos programas son la base para crear el paquete de código fuente, para ello se tendrán que generar unos archivos concretos.

Estructura del código fuente a distribuir

Las autotools se usan para generar el paquete «tar.gz» que contiene el código fuente del programa que se va a distribuir, normalmente estos paquetes siguen una estructura estándar. La estructura básica es:

  • src: Directorio del código fuente.
  • AUTHORS: Indica los autores del programa.
  • ChangeLog: Indica los cambios que se han ido produciendo.
  • COPYING: Indica la licencia de distribución que tiene el programa. (Autogenerado)
  • INSTALL: Explica cómo instalar el programa. (Autogenerado)
  • NEWS: Indica las noticias relacionadas con el programa.
  • README: Un pequeño documento en el que se describe el programa y se explican temas concretos de éste.
  • THANKS: Indica los agradecimientos que tenga el autor/es.
  • TODO: Indica una pequeña lista de cosas por hacer.

De este modo, si se van a utilizar las autotools sería aconsejable seguir la estructura anterior, y crear todos los archivos menos los como «autogenerado» que, obviamente, se generarán automáticamente, aunque siempre se pueden crear a mano ya que puede que no se quiera tener el contenido autogenerado.

El archivo «configure.ac»

Sobre este archivo gira toda la generación del programa para su distribución. En él se escriben las macros para los diferentes programas que se ejecutarán: aclocal, autoconf y automake.

AC_PREREQ(2.52)
AC_INIT([hola mundo], [0.1])
AM_INIT_AUTOMAKE([])

AC_PROG_CC
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
  • Programa aclocal: Sirve para generar el archivo «aclocal.m4». ¡Sólo se generará si en el archivo «configure.ac» hay macros de automake!
  • Macros de autoconf: Empiezan por AC_*, y se buscan en el archivo «configure.ac» y en el «aclocal.m4» si existe. Sirven para la configuración correcta del programa.
    • AC_PREREQ(versión) indica la versión de autoconf necesaria.
    • AC_INIT([aplicación], [versión]) inicializa autoconf, recibe como parámetros el nombre del programa y su versión.
    • AC_PROG_CC indica que realizará una compilación de código escrito en C.
    • AC_CONFIG_FILES([Makefile src/Makefile]) indica los archivos «Makefile» que se van a generar a partir de sus respectivos «Makefile.am».
    • AC_OUTPUT indica los archivos que finalmente debe generar el script «configure».
  • Macros de automake: Empiezan por AM_*, y sirven para la generación de los diferentes «Makefile».
    • AM_INIT_AUTOMAKE([]) inicializa automake, se le puede pasar un parámetro que la verdad no sé lo que indica, para mi ejemplo no hace falta pasárselo.

Aviso: Las macros no pueden llevar un espacio entre su nombre y el paréntesis de inicio.

Los archivos «Makefile.am»

Los archivos «Makefile.am» contienen las reglas para generar los archivos «Makefile» correspondientes a los directorios dónde se encuentran, por lo que habrá un archivo por directorio en el que se tenga que realizar alguna operación con make.

De este modo, siempre se debe tener un archivo «Makefile.am» en el directorio raíz del proyecto, este archivo contendrá algo similar a lo siguiente:

SUBDIRS = src
EXTRA_DIST = AUTHORS ChangeLog NEWS README THANKS TODO
  • SUBDIRS enumera los directorios que contienen otros archivos «Makefile.am».
  • EXTRA_DIST enumera los distintos archivos que deberá tener el paquete, para distribuir el código fuente que se generará.

En este caso el directorio «src» es dónde, supuestamente, deberá estar el código fuente de nuestra aplicación y tendrá un archivo «Makefile.am», que indicará las reglas para compilar nuestro código fuente correctamente.

El archivo «Makefile.am» tendrá el siguiente contenido:

bin_PROGRAMS = hola−mundo
hola_mundo_SOURCES = hola−mundo.c
  • bin_PROGRAMS indica el nombre del ejecutable final.
  • hola_mundo_SOURCES indica los archivos con el código fuente de la aplicación.
  • Si se necesitarán bibliotecas se debería añadir hola_mundo_LDADD con las macros necesarias para dichas bibliotecas en el archivo «configure.ac».

Nota: Para generar una biblioteca, se debería usar libexec_PROGRAMS en lugar de bin_PROGRAMS.

Generación del script «configure»

Una vez creados los archivos necesarios, se deben realizar los siguientes pasos:

  1. Generación:
    $ aclocal
    $ autoconf
    $ automake --add-missing
  2. Compilación y ejecución del programa:
    $ ./configure
    $ make
    $ src/hola−mundo
  3. Distribución del programa:
    $ make distcheck

Para ampliar un poco más All you should really know about Autoconf and Automake

Sin comentarios

Comentarios cerrados.