viernes, abril 19, 2013

Autotools: Tutorial de uso (I)

Para bien o para mal, me toca de vez en cuando mantener un software que usa el conjunto de herramientas de GNU para poder compilar. Este conjunto de herramientas - autoconf, automake y libtool - pretende facilitar la configuración de software que se distribuye en código fuente, facilitando al usuario la instalación del mismo. Algunas de las posibilidades que permite un programa que utilice de manera correcta estas utilidades para detectar el entorno de compilación son:

  • Detectar y configurar las rutas de librerias y programas que se necesita para compilar.
  • Especificar diferentes opciones de configuración del código fuente que se quiere compilar.
  • Especificar la ruta a cualquier elemento necesario para la compilación de un software.
  • Generar toda una serie de ficheros Makefiles, con una serie de regla estándar.
  • Facilitar la compilación cruzada de herramientas.

Estos programas parten de una serie de plantillas, con unos nombres estándar, que una vez procesado por los mismos genera un fichero shell script llamado configure. Cuando se ejecuta este shell script, analizará el sistema para saber cual es el entorno de compilación que está presente, generará los ficheros que se le indique , en especial los Makefile, de tal manera que se tenga la tan común manera de instalar fuentes en el mundo Unix:

./configure --prefix=/usr/local
make
make check
# Como superusuario
make install

Sin embargo, no todo es tan bonito como describe el manual del autoconf (Those who do not understand Autoconf are condemned to reinvent it, poorly., en especial porque han surgido multitud de alternativas para sustituir a las autotools1). Alguno de los problemas que he encontrado a lo largo del tiempo que he usado estos programas:

  • Están diseñados para facilitar la vida al usuario del mismo, pero no al desarrollador que utiliza el paquete. Esto es un arma de doble filo, porque muchas veces esa falta de facilidad para generar las plantillas, hace que se den demasiadas cosas por supuestas, dificultando la vida a los usaurios.
  • El lenguaje que utiliza autoconf , M4, no es precisamente cómodo. Si a esto le sumanos que se puede mezclar trozos de shell scripts en las plantillas puede que se acabe generando ficheros de configuración no tan portables como pueden parecer a primera vista.
  • Hay gran cantidad de scripts que parece que sólo se han probado en sistemas Linux. Cuando se intenta usar en otros Unix, no funcionan correctamente.

Arquitectura general

Los autotools parten de una serie de ficheros de plantilla que serán procesados por cada programa para generar los ficheros de salida. Los programas que se van a manejar son automake, autoconf, autoheader y aclocal. Cada uno de estos tienen una determinada plantilla de entrada, y generará una salida:

  • aclocal Este programa se utiliza para generar el fichero aclocal.m4, consolidando en un único fichero macros que vienen de varios paquetes más las que el usuario quiera añadir, de tal manera que sean fácilmente accesibles por autoconf. Sin embargo, en las últimas versiones de autoconf existe la posibilidad de espcificar un directorio. El funcionamiento de este programa es buscar en todos los ficheros .m4 que encuentre, para posteriormetne analizar la plantilla configure.ac y copiar la definición de las macros que se usen en esta última plantilla al fichero aclocal.m4.
  • automake Este programa lee las plantillas define en Makefile.am , configure.ac para generar el fichero Makefile.in. Este último f¡chero será posteriormente procesado en la ejecución del configure para generar los ficheors Makefile definitivos que permitirán compilar el proyecto.
  • autoheader Este programa va usar como entrada la plantilla configure.ac, la cual va a procesar buscando posibles definiciciones para genera el fichero config.h.in. Este programa nos ayuda a tener en un sólo fichero las posibles definiciones del preprocesador que se realizan en la plantilla. Posteriormente, cuando se ejecute el script configure, definirá las macros de acuerdo al entorno que vaya detectando durante su ejecución
  • autoconf Este programa, por último, usar como entrada la plantilla configure.ac, aclocal.m5 o el directorio de macros especificado para procesar todo el conjunto y generar el fichero shell script configure, el cual al ejecutarse intentará detectar el entorno donde se está ejecutando, teniendo en cuenta parámetros de línea de comandos y las plantillas, procesar los ficheros que acaben en .in - como por ejemplo Makefile.in o config.h.in -, realizando las correspondientes sustituciones de variables y valores, para generar los ficheros definitivos que permitan la compilación del programa.

Normalmente, todos estos programas se llaman desde un fichero, que por convención llamamos autogen.sh cuyo contenido es el siguiente suponiendo que en el directorio donde llamamos al programa tengamos las correspondientes plantillas en los ficheros configure.ac y Makefile.am, además de las posibles macros m4 que necesitemos en el directorio m4.

#!/bin/sh
aclocal -I m4 && \
rm -rf autom4te.cache/ && \
autoheader && \
automake --foreign &&
autoconf

Todo el esquema anterior puede verse en el siguiente gráfico:

En el gráfico anterior, las cajas transparentes son los ficheros que utiliza de entrada cada una de las herramientas, con sus nombres por defecto, de tal manera que no sea necesario especificarlos en la línea de comandos. Las cajas sombreadas corresponde a cada uno de los comandos que se llaman.

Ejemplo básico

Un primer ejemplo puede encontrarse en el tutorial 1 que he subido al proyecto Auto Tools tutorial de Sourceforge. En el primer tutorial tenemos dos ficheros muy básicos, más el código fuente del programa y el script que se encarga de generar el fichero configure. Se puede bajar con git, ver como no hay ningun fichero make ni configure, y ejecutar la secuencia:

./autogen.sh
./configure
make
./tut1

Tras la ejecución del último programa nos debe de devolver la palabra Ok.En la próxima entrada explicaré en que consiste cada una de estas plantillas.

Documentación

Notas

  1. qmake,cmake,ant, o incluso porqué no decirlo, un simple Makefile bien hecho, como han demostrado proyectos como Plan 9 o Qmail.

Technorati Tags: ,

No hay comentarios: