Cambios al entorno de compilación

En general, la configuración de la compilación para una aplicación GNOME 2 será muy parecida a la configuración para GNOME 1. Los únicos cambios requeridos son debidos a versiones más modernas de las herramientas como autoconf y para gestionar la inclusión de pkg-config, en lugar de scripts específicos de biblioteca como gnome-config.

Cambios a autogen.sh

El único cambio que deberías tener en cuenta aquí es el hacer que el script autogen.sh de tu paquete llame al script gnome-autogen.sh con la variable de entorno USE_GNOME2_MACROS inicializada. Por ejemplo, observa el script sample autogen.sh que aparece más abajo. En general es bastante seguro simplemente copiar el autogen.sh de otro sitio, como por ejemplo de los módulos gnome-hello y luego símplemente modificar el nombre del paquete.

Ejemplo A.1. Fichero autogen.sh de ejemplo

#!/bin/sh
# Run this to generate all the initial makefiles, etc.

srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.

PKG_NAME="Gnome Hello Demonstration Application"

(test -f $srcdir/configure.in \
  && test -f $srcdir/ChangeLog \
  && test -d $srcdir/src) || {
    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
    echo " top-level $PKG_NAME directory"
    exit 1
}

which gnome-autogen.sh || {
    echo "You need to install gnome-common from the GNOME CVS"
    exit 1
}
USE_GNOME2_MACROS=1 . gnome-autogen.sh
         

Pkg-config

Como se mencionó en la corta descripción de pkg-config, ésta es la nueva forma de hacer las cosas que se hacían anteriormente con llamadas a scripts específicos de cada aplicación como gnome-config.

Puedes listar todas las bibliotecas que están bajo el control de pkg-config ejecutando el comando pkg-config --list-all. Si lo haces, verás que todas las bibliotecas que son parte de la plataforma GNOME 2 son conocidas pra pkg-config.

En la mayoría de los casos, es suficiente con buscar las bibliotecas de plataforma que aparecen en la parte superior del árbol de dependencias. Esto es, la biblioteca cuyas dependencias incluye a todas las otras bibliotecas que necesitarás. Normalmente, libgnomeui-2.0 suele ser suficiente, dado que sus dependencias incluyen a gtk+, gconf y libbonoboui entre otras. .

Si crees que necesitas algo más específico o más complejo que ésto, échale un vistazo a la página del manual de pkg-config para más información.

Para usar paquetes gestionados por pkg-config, todos los cambios están en configure.in,que se cubre en la sección sobre required changes to configure.in. Si lo que buscas es hacer usable tu propio paquete via pkg-config, entonces necesitas crear un fichero foo.pc apropiado (en caso de que tu paquete se llamara foo).

Normalmente, no crearías el fichero foo.pc directamente, dado que contiene información sobre las localizaciones de los componentes instalados de foo. En lugar de eso, crearías el fichero foo.pc.in con las variables apropiadas que serán luego rellenadas desde configure.in. A modo de ejemplo, aquí mostramos una pequeña variación del fichero gobject.pc.in (la línea Conflicts no es normal y hay algunos comentarios extra). Este fichero será luego convertido en gobject.pc gracias a una línea apropiadamente puesta en la sección AC_OUTPUT del fichero configure.in.

Ejemplo A.2. fichero de ejemplo gobject.pc.in

# This is a comment
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@

Name: GObject                            # human-readable name
Description: Object/type system for GLib # human-readable description
Version: @VERSION@
Requires: glib-2.0 = 1.3.1
Conflicts: foobar <= 4.5
Libs: -L${libdir} -lgobject-1.3
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib/include
         

La mayor parte de lo aquí expuesto no debería sorprender demasiado a aquellas personas acostumbradas a compilar programas: especificar las bibliotecas requeridas, el enlazado y las opciones de C para este paquete y para cualquiera que entre en conflicto con éste. Para más ejemplos, observa la localización estándar donde pkg-config almacena los ficheros *.pc (normalmente $(prefix)/lib/pkgconfig/.

Cambios al configure.in

El fichero configure.in es probablemente el fichero que más cambios requiere de todos los que forman parte de la infraestructura de compilación de la aplicación. Hay varias razones para esto.

En GNOME 2, la necesidad de tener un subdirectorio macros/ para cada módulo CVS, conteniendo un grupo completo de macros .m4 comunes, ha sido eliminada. En su lugar, las macros comunes son parte del módulo gnome-common y normalmente estarán disponibles (cuando estén installadas) bajo el directorio $(prefix)/share/aclocal/gnome2-macros.

De forma similar, en general hay poca necesidad de usar gettext del directorio intl/ que aparece en la mayoría de los módulos, dado que gettext está por lo general ya instalado en la máquina del desarrollador.

Finalmente, se requieren algunos cambios dada la actualización de varias herramientas. Por ejemplo, algunos están recomendados como parte de la actualización a autoconf 2.52. Estos cambios permiten mejores mensajes de diagnóstico, la mayor parte de las veces. La inclusión de pkg-config también requerirá añadir unas cuantas llamadas.

Por supuesto, como en todas las sugerencias de este documento, si necesitas algo más complejo que lo anterior, seguro que ya sabes por qué necesitas algo diferente y tienes el suficiente conocimiento para cambiarlo. Este documento símplemente ofrece una lista de comprobación para la mayoría de las aplicaciones; no se asegura que funcione para aplicaciones con necesidades extrañas o para casos raros y especiales.

Ahora que las justificaciones ya han sido dadas, aquí se muestran los pasos que funcionarán en la mayoría de los casos:

  1. Borrar cualquier llamada a la macro GNOME_COMMON_INIT. Está obsoleta dada la forma en que gnome-autogen.sh configura actualmente el entorno.

  2. En autoconf 2.52, la macro AC_INIT toma ahora dos parámetros, mas un tercero opcional. Los parámetro son package-name, version-number y bug-address, siendo éste último opcional.

    En GNOME 1, tu fichero configure.in habría tenído una línea que dijera algo como

    AC_INIT(foo.c)
    AM_INIT_AUTOMAKE(foo, 1.23)
                   

    Para GNOME 2, esto debería cambiarse por

    AC_INIT(foo, 1.23, http://bugzilla.gnome.org/enter_bug.cgi?product=foo)
    AC_CONFIG_SRCDIR(foo.c)
    AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
                   

    Observa que AM_INIT_AUTOMAKE se beneficia del hecho de que AC_INIT() ahora define las variables AC_PACKAGE_NAME y AC_PACKAGE_VERSION.

  3. Incluir las macros adecuadas para pkg-config es un proceso relativamente simple y directo una vez que determinado el tope superior de tu árbol de dependencias de entre las bibliotecas de la plataforma . En lo que sigue, asumimos que el paquete que quieres compilar se llama foo.

    Para conseguir las opciones de C y del enlazado de bibliotecas, usa la siguiente secuencia de macros.

    PKG_CHECK_MODULES(FOO, libgnomeui-2.0)
    AC_SUBST(FOO_CFLAGS)
    AC_SUBST(FOO_LIBS)
                   

    Ahora tu fichero Makefile.am puede hacer referencias a las variables $(FOO_CFLAGS) y $(FOO_LIBS) en las líneas de asignación INCLUDES y LDADD respectivamente.

    En el inusual caso de que requirieras ciertas versiones mínimas de algunas bibliotecas (por ejemplo, para evitar un bug presente en una versión anterior), podrías hacer algo como lo que se muestra en el siguiente extracto.

    dnl En general es una 'buena práctica' poner los requerimientos de  pkg-config
    dnl al comienzo, para que los cambios en sucesivas versiones sean más fáciles de realizar
    GTK_REQUIRED=1.3.1
    LIBGNOMEUI_REQUIRED=1.96.0
    
    PKG_CHECK_MODULES(FOO, gtk+-2.0 >= $GTK_REQUIRED
                           libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED)
    AC_SUBST(FOO_CFLAGS)
    AC_SUBST(FOO_LIBS)
                
  4. Finalmente, si deseas usar una versión instalada en local de gettext, se recomienda usar AM_GLIB_GNU_GETTEXT. Esto reemplaza cualquier llamada a AM_GNOME_GETTEXT o incluso AM_GNOME2_GETTEXT.

    También necesitarás definir la constante GETTEXT_PACKAGE usando algo como lo siguiente.

    GETTEXT_PACKAGE=foo
    AC_SUBST(GETTEXT_PACKAGE)
    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE")
                   

    Observa que si tu aplicación está pensada para ser instalada en paralelo junto a su versión para GNOME 1, deberías entonces escribir GETTEXT_PACKAGE=foo-2.0. En cualquier caso, cada vez que llames a funciones gettext como bindtextdomain() ó bind_textdomain_codeset() en tu código, deberías utilizar GETTEXT_PACKAGE en lugar del nombre literal del paquete como primer argumento para estas funciones.

  5. Elimina todas referencias a intl/Makefile, macros/Makefile. Éstas ya no se necesitan, dados los cambios anteriores.

  6. Si estás generando funciones para hacer marshalling de señales (signal marshallers) en gtk, necesitarás determinar la localización de glib-genmarshal. El cambio requerido en el fichero configure.in .

Cambios en Makefile.am

Normalmente, no necesitarás realizar cambios significativos en tu Makefile.am, dado que símplemente contiene la cantidad mínima de información necesaria para poder compilar tu aplicación. Lo único necesario sería eliminar cualquier referencia a los directorios intl y macros en variables como DIST_SUBDIRS y SUBDIRS.