4. Autotools

Los dos archivos elementales con los que debe contar el proyecto en su directorio raíz son Makefile.am y configure.in. Estos archivos son usados por automake y autoconf para generar los archivos Makefile y el script configure que permiten automatizar el proceso de compilación, empaquetado e instalación del proyecto. Esto es fundamental, dado que todo proyecto GNOME debe hacer uso de estas herramientas para facilitar la instalación de el proyecto en múltiples plataformas, sin hacer más complicado el proceso para una u otra.

4.1. configure.in

Este archivo se encarga de generar el script configure que hará todas las pruebas necesarias en el sistema para determinar si están dadas las condiciones necesarias para la instalación del programa. Por ejemplo, se encargará de buscar las bibliotecas que son necesarias para la compilación, un compilador de C, etc.

A continuación vamos a incluir el código de dicho archivo y lo explicaremos en detalle.


	AC_INIT([hellolibglade], [0.1], [http://baboon.utalca.cl/~csaavedra])

	AM_INIT_AUTOMAKE

	AC_PROG_CC

	pkg_modules="libgnomeui-2.0, libglade-2.0"
	PKG_CHECK_MODULES(HELLOLIBGLADE, [$pkg_modules])

	AC_SUBST(HELLOLIBGLADE_CFLAGS)
	AC_SUBST(HELLOLIBGLADE_LIBS)

	AC_OUTPUT([
	Makefile
	src/Makefile
	src/glade/Makefile
	])
	

En gral., los archivos configure.in deben comenzar con una llamada a la macro AC_INIT, que se encarga de realizar varias inicializaciones y verificaciones. El formato de uso es el siguiente:


	AC_INIT(package, version, [bug-report], [tarname])

donde:

package

Indica el nombre del paquete, en nuestro caso, la aplicación.

version

Un número para identificar la versión del paquete.

bug-report

(opcional) Una referencia donde un usuario o desarrollador puede dirigirse para hacer comentarios sobre errores en el programa. Puede ser una dirección de correo electrónico o una URL.

tarname

(opcional) Este parámetro difiere de package en que este debe ser un nombre corto y sin espacios, para ser utilizado como nombre del archivo tarball, mientras que el primero puede ser un nombre extenso.

AM_INIT_AUTOMAKE es una macro que debe se incluida para indicar a autoconf que se utilizará automake para generar y procesar los archivos Makefile.

Para poder chequear la existencia de un compilador de C utilizamos la macroAC_PROG_CC. Además esta macro se encarga de definir una variable de entorno que indicará el compilador a usar, ya sea gcc, cc, etc.

Con la macro PKG_CHECK_MODULES (MYAPP, modules) verificamos la existencia en el sistema de las bibliotecas indicadas por modules, que en este caso controlamos mediante una variable $packages.

AC_SUBST(variable, [value]) es utilizada para explicitar que la variable variable debe ser reemplazada en los archivos de salida con el valor del entorno, o con el valor value que puede ser especificado opcionalmente.

automake utiliza la macro AC_OUTPUT para determinar los archivos que debe crear. Todos los archivos Makefile listados son tratados como tal, y los otros se tratan de un modo diferente. Normalmente, la única diferencia es que los archivos Makefile son limpiados al hacer un make distclean mientras que el resto se eliminan con make clean.

4.2. Makefile.am

Este archivo incluye información elemental sobre la estructura del proyecto, y es utilizado para generar los complejos archivos Makefile.in de modo automático gracias a automake.

Cada subdirectorio del proyecto que debe ser procesado debe contener un archivo Makefile.am, indicando los archivos a compilar de ese subdirectorio, los subdirectorios que deben ser procesados recursivamente, entre otros datos.

A continuación incluimos los archivos Makefile.am para los directorios hola, hola/src/ y hola/src/glade de nuestro proyecto.

4.2.1. hola/Makefile.am


	SUBDIRS = \
		src

Cuando nuestro proyecto consta de mas de un directorio que debe ser analizado recursivamente, utilizamos la macro SUBDIRS para indicar los subdirectorios directos que deben ser analizados. Si se desea analizar un subdirectorio de niveles inferiores, no pueden incluirse directamente en este archivo, sino que debe crearse un Makefile.am en el directorio padre de éste que incluya la macro SUBDIRS.

Como en nuestro directorio raíz del proyecto no hay nada que construir, este archivo solo servirá de guía para que el proceso continúe en el subdirectorio hola/src.

4.2.2. hola/src/Makefile.am


	SUBDIRS = \
	        glade

	gladedir = $(datadir)/hellolibglade/glade

	INCLUDES = \
	        -DHELLOLIBGLADE_DATA_DIR=\""$(gladedir)"\" \
	        @HELLOLIBGLADE_CFLAGS@
 
	bin_PROGRAMS = hellolibglade
 
	hellolibglade_LDFLAGS = -export-dynamic

	hellolibglade_SOURCES = \
	        main.c

	hellolibglade_LDADD = @HELLOLIBGLADE_LIBS@

Además de incluir el subdirectorio glade para que este sea considerado como parte del proyecto que necesita ser procesado, en este subdirectorio realizamos varias tareas.

INCLUDES se utiliza para indicar los flags que deben ser pasados al compilador. En nuestro caso, le pasamos el flag -DMACRO=macro_value, que asigna a la macro MACRO el valor especificado por macro_value en la compilación de nuestro proyecto. @HELLOLIBGLADE_CFLAGS@ es simplemente una variable de entorno definida por configure, que contiene los flags que el proyecto necesita.

bin_PROGRAMS indica el nombre del archivo binario que se construirá en esta etapa. hellolibglade_LDFLAGS indica los flags necesarios para enlazar el proyecto. Utilizamos el flag -export-dynamic dado que este permite auto conectar los manejadores definidos en el ejecutable principal.

hellolibglade_SOURCES indica los archivos fuentes que van a ser compilados.

hellolibglade_LDADD especifica las librearías que deben ser pasadas al enlazador para construir el objeto. Estas bibliotecas son las especificadas por la variable HELLOLIBGLADE_LIBS definida en configure.

4.2.3. hola/src/glade/Makefile.am


	gladedir = $(datadir)/hellolibglade/glade
 
	glade_DATA = hello.glade
 
	EXTRA_DIST = $(glade_DATA)

El archivo de interfaz hello.glade no es parte del proyecto, en el sentido de que no es necesario para construir el binario. Sin embargo, al momento de ejecutar el proyecto este debe estar presente para poder construir la interfaz. Archivos de este tipo, conocidos como misceláneos, pueden ser incluidos en la distribución mediante el uso de las variables DATA. glade_DATA es una macro que indica los archivos que son datos del proyecto, referentes a glade. En este caso, solo el archivo hello.glade. En caso de que hayan mas interfaces, estas deben ser incluidas aquí.

Mediante EXTRA_DIST podemos indicar que archivos extras deben ser distribuidos con la aplicación. En este caso indicamos que hello.glade debe ser distribuido, y que debe ser almacenado en el subdirectorio .../hellolibglade/glade de la aplicación.