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.
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:
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.
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.
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.
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.
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.