domingo, junio 08, 2014

Autotools, tutorial de uso (V): Añadiendo opciones

Cuando se están generando scripts de configuración con ayuda de las autotools, puede que interese activar o desactivar opciones en función de parámetros en la línea de comandos que se le pase al script. Por ejemplo, si se quiere que el script reciba un parámetro que sea --enable-sys-debug, que indique que el programa debe de configurarse para tener depuración interna

La macro que ayuda a implementar de manera sencilla esta funcionalidad es AC_ARG_ENABLE. Esta macro recibe cuatro parámetros, los dos primeros obligatorios y los otros dos opcionales.

  • feature que es la propiedad que deseamos activar a través de la macro.
  • help Que es una cadena que indica el texto de ayuda. Suele ser bastante cómodo usar la macro AS_HELP_STRING que nos ayuda a formatear el texto de ayuda de manera sencilla
  • Acciones si si: Conjunto de shell script (o macros) si usamos la opción que queremos
  • Acciones si no: Conjunto de shell script (o macros) si no usamos la opción.

Por ejemplo, se va a implementar la opcion --enable-sys-debug, la cual si está presente definirá una macro en el preprocesador C que se llamará HAVE_SYS_DEBUG y tendrá valor la cadena "1" mientras que sino está presente dicha macro tendrá el valor "0". Como en los casos anteriores las fuentes están en Autotorial tut3. La parte interesante en este caso está en las siguientes líneas del fichero configure.ac:

AC_ARG_ENABLE(sys-debug,[AC_HELP_STRING([--enable-sys-debug],
    [Habilita la depuración interna (por defecto no)])],
    [AC_DEFINE([HAVE_SYS_DEBUG],["1"],[Activada la propiedad 1])],
    [AC_DEFINE([HAVE_SYS_DEBUG],["0"],[Desactivada la propiedad 1])])

Ahora, el script de configure que se generará tendrá una nueva opción que será --enable-sys-debug. Si partiendo del código fuente de la tercera parte del tutorial generamos el script de configure, y vemos la ayuda:

./autogen.sh
...
Optional Features:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --disable-dependency-tracking  speeds up one-time build
  --enable-dependency-tracking   do not reject slow dependency extractors
  --enable-sys-debug      Habilita la depuración interna (por defecto no)
...

Ahora, si se configura el programa con la opción --enable-sys-debug, compilamos y ejecutamos el programa veremos como el valor de la macro del preprocesador C que hemos definido es "1":

swordcoast:tut3 terron$ ./autogen
swordcoast:tut3 terron$ ./configure --enable-sys-debug
swordcoast:tut3 terron$ make clean
swordcoast:tut3 terron$ make
swordcoast:tut3 terron$ # Omitidas todas las salidas excepto la de este comando
swordcoast:tut3 terron$ ./tut3
HAVE_SYS_DEBUG = 1
swordcoast:tut3 terron$

Si se repite la operación, pero sin pasar el parámetro --enable-sys-debug el resultado de ejecutar el programa sería:

swordcoast:tut3 terron$ ./tut3
HAVE_SYS_DEBUG = 0
swordcoast:tut3 terron

Esta entrada es una introducción al manejo de los parámetros que se le puede pasar en línea de comando a lso configure. Sin embargo hay dos aspectos importantes sobre los cuales se ha pasado por alto:

  • El uso de la macro AC_DEFINE. Hay que explicar donde y como se definen estos valores para usar en el preprocesador de C
  • La lectura de valores en la línea de comandos y como pasar dichos valores a nuestros programas.

Referencias

No hay comentarios: