Autotools 2 …

7 11 2007
Automake

Automake es una herramienta para generar automáticamente ficheros Makefile.in que cumplan con los estándares de GNU. Está desarrollado en Perl y requiere de un intérprete acorde para su funcionamiento. Los ficheros generados se crean a partir de ficheros Makefile.am que están compuestos por una serie de definiciones de variables, con reglas que se declaran en ocasiones.

Entre las ventajas que presenta la herramienta podemos señalar como las más importantes las siguientes:

  • Instalación Básica: Brinda un procedimiento de instalación común para todos los proyectos desarrollados con ella
  • Destinos estándares: Provee de un conjunto de salidas o destinos estándares.
  • Variables de directorio estándares: Es posible configurar un listado de variables de directorios
  • Variables de configuración estándares: Se pueden configurar variables a la hora de configuración para gestionar el proyecto
  • Construcción VPATH: Creación de árboles de construcción paralelos
  • Instalación en 2 partes: Instalar información y programas separadamente
  • Compilación cruzada: Construcción para otras arquitecturas
  • Renombrando: Renombrar los programas a la hora de instalación
  • DESTDIR: Construcción de paquetes de bibliotecas binarios con DESTDIR
  • Preparación de distribuciones: Creación de archivos compactados con todo el proyecto
  • Seguimiento de dependencias: Seguimiento de dependencias automáticas
  • Paquetes anidados: El sistema de construcción puede ser anidado

Nos apoyaremos para comenzar en el ejemplo del “Hola Mundo”.

Makefile.am:

bin_PROGRAMS = hola_mundo

hola_mundo_SOURCES = main.cpp

Comenzaremos enumerando algunas directivas sencillas. Si deseamos construir un ejecutable necesitamos de la primera directiva bin_PROGRAMS a la que le pasaremos el identificador de nuestra regla. Muchas reglas usan la filosofía del identificador con el cual se añadirán otros elementos a su uso y configuración. Noten más abajo como usamos la directiva _SOURCES para especificar los ficheros que se compilarán. Están en lo cierto si intuyeron que el identificador se usó en ella para declarar los ficheros que construirá.

Para muchas formas de compilación bastará sólo con la especificación del tipo de lenguaje en el fichero de configuración ( fichero que crea el configure.ac o que podemos crear manualmente ). Sin embargo hay programas que requieren de que especifiquemos manualmente sus dependencias. Aquí entran en juego dos directivas importantes las de compilación y vinculación.

Pondremos el ejemplo para nuestro programa hecho en C++ suponiendo que requiera de la biblioteca matemática estándar ( math ) y de la biblioteca visual gtkmm.

Makefile.am:

bin_programs = hola_mundo
hola_mundo_SOURCES = main.cpp
hola_mundo_CXXFLAGS = -I/usr/include/gtkmm-2.4
hola_mundo_LDFLAGS = -lm -lgtkmm-2.4

En este ejemplo no se incluyeron todas las dependencias para gtkmm para ganar en rapidez. Noten como lo que se añaden a las dependencias tanto de compilación y vinculación son las mismas directivas que les pasamos al compilador y al vinculador.

Pondremos ahora el ejemplo para el caso en que querramos construir toda una jerarquía de carpetas. Nos auxiliaremos de otras 2 directivas: SUBDIRS y DIST_SUBDIRS. Supongamos que tenemos otros ficheros: Clase.cpp y Clase.h en una carpeta que queremos compilar también. Usaremos una vía que, aunque no es la única para enlazar todos los ficheros objetos que vamos creando, ayuda a mantener organizado nuestro proyecto. Para ello deberemos añadir al configure una referencia al programa ranlib el cual generará en los ficheros objetos que se vayan creando un índice que ayudará al enlazador en su labor. Si estamos usando el autoconf simplemente añadimos AC_PROG_RANLIB. Quedaría todo de esta forma entonces:

Makefile.am:

SUBDIRS = clase

bin_programs = hola_mundo
hola_mundo_SOURCES = main.cpp
hola_mundo_LDADD = clase/libClase.a
hola_mundo_CXXFLAGS = -I/usr/include/gtkmm-2.4
hola_mundo_LDFLAGS = -lm -lgtkmm-2.4

clase/Makefile.am:

noinst_LIBRARIES = libClase.a
libClase_a_SOURCES =  Clase.cpp

La metodología que utilizamos para construir nuestro programa se basa en la creación de objetos estáticos ( más adelante veremos cómo hacer objetos dinámicos ). Por cada carpeta crearemos un objeto estático que luego vincularemos a los restantes para crear el ejecutable final.

El automake creará primero las reglas de las subcarpetas definidas en SUBDIRS y DIST_SUBDIRS. Por último construirá las reglas de la carpeta actual. Si quisiéramos distribuir ( compartir mediante un archivo compactado ) en nuestro proyecto bibliotecas o códigos que no compilaremos necesitamos usar DIST_SUBDIRS. Un ejemplo podría ser una carpeta por ejemplo que contenga documentación web sobre nuestro código.

A continuación enumeraremos algunas de las reglas de producción que podemos llamar una vez que usemos el automake para crear los Makefile:

make // Llama a make all
make all // Construye todas las reglas de producción definidas
make clean // Limpia el proyecto.  Elimina los objetos que surgieron de la compilación
make dist // Crea un fichero compactado que contiene a todo el proyecto listo para ser compilado
make distclean // Elimina los ficheros necesarios para la construcción de las reglas
make install // Instala todo lo que pueda ser instalado ( binarios, objetos, cabeceras ) a partir de las reglas de producción
make install-data // Instala las cabeceras que se declaren ( se verán más adelante en el curso )
make install-libLTLIBRARIES // Instala las bibliotecas definidas usando libtool ( se verá más adelante en el curso )
make uninstall // Desistanla todo lo que se pudo haber instalado dando make install
make [regla_producción] // Podemos también llamar a cualquier regla que definamos en el fichero
Advertisements

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s




%d bloggers like this: