Autotools (I)

Comienza con este texto una serie de artículos dedicados a las herramientas Autotools de GNU, que nos permitiran crear scripts configure y archivos Makefile cuyo objetivo será la compilación de nuestra aplicación en varias plataformas UNIX.

Si alguna vez hemos tenido que compilar algún programa desde su código fuente, lo más seguro es que hayamos tenido que teclear lo siguiente:

./configure
make
make install

¿Qué significa cada uno de estos pasos? La primera línea ejecuta un script llamado configure. Este script comprueba si el sistema dispone de todos los recursos necesarios para compilar la aplicación (librerías, compilador, etc.) y genera uno o más archivos Makefile, que a continuación veremos para qué sirven. El comando make es una de las herramientas de compilación de Unix originales para la ingeniería del software. La idea de este comando es automatizar y optimizar la construcción de programas. make va a buscar un fichero llamado Makefile, que contiene una serie de directivas que indican cómo se deben compilar los archivos del código fuente. A la hora de compilar solo se compilarán aquellos ficheros que se hayan modificado o que dependan de algún fichero modificado.
El fichero Makefile se encarga de establecer una serie de dependencias. Por ejemplo, observemos el siguiente fichero Makefile:

# Ejemplo de Makefile

# Definición de macros
CC = gcc
LFLAGS = -lm
CFLAGS = -g
# Sección de reglas

main: main.o primero.o segundo.o
        $(CC) $(CFLAGS) -o main main.o primero.o segundo.o $(LFLAGS)
main.o: main.cc
        $(CC) $(CFLAGS) -c main.cc
primero.o: primero.cc
        $(CC) $(CFLAGS) -c primero.cc
segundo.o: segundo.cc
        $(CC) $(CFLAGS) -c segundo.cc
clean:
        rm *.o -f

En este fichero, los comentarios van precedidos por el símbolo #. Lo primero que se hace es declarar una serie de macros, de tal forma que cada vez que se encuentre el nombre de la macro encerrado entre $( y ), se sustituirá por su correspondiente valor. En este ejemplo, todas las ocurrencias de $(CC) serán sustituidas por la cadena gcc. Se suelen usar macros para definir el ejecutable del compilador, así como los distintos parámetros de la compilación.
En la segunda parte de este archivo de ejemplo es donde se encuentra lo más importante, las dependencias. La estructura de las mismas es la siguiente:


objetivo: dependencia1 dependencia2 ...
        regla1
        regla2
        ...

solo cuando se haya producido algún cambio en alguna de las dependencias, se disparará el objetivo, teniendo como resultado el que se ejecuten las reglas. Las dependencias pueden ser a su vez otros objetivos o archivos de nuestro código fuente. Si ejecutamos make sin ningún parámetro se comprobará el primer objetivo. También es posible ejecutar make objetivo, en cuyo caso se comprobarán las dependencias del objetivo especificado.
Tomemos como ejemplo el archivo Makefile anterior. Supongamos que hemos ejecutado make y ha cambiado el contenido del fichero segundo.cc. En ese caso, la dependencia del objetivo segundo.o ha cambiado, siendo este objetivo a su vez una dependencia del objetivo principal main. Por lo tanto, primero se ejecutará el comando asociado al objetivo segundo.o ($(CC) $(CFLAGS) -c segundo.cc), y después el comando asociado al objetivo main ($(CC) $(CFLAGS) -o main main.o primero.o segundo.o $(LFLAGS)).
Por otra parte, si ejecutáramos make clean, al no tener el objetivo clean ninguna dependencia, su regla correspondiente se ejecutaría siempre. Esto se suele utilizar para hacer una limpieza del código fuente, eliminando los archivos objeto.

Una vez vista la estructura de un archivo Makefile y para qué sirve un script configure, ya somos capaces de utilizar las herramientas de Autotools, cuyo uso será explicado en posteriores documentos.

[VOLVER]