•     
  •     
  •     
  • Chuletas
  • News
  • PVPC
  • autoconf

    No tiene sentido reproducir aquí punto por punto las definiciones que proporciona el manual, sino proporcionar una visión de conjunto que permita al desarrollador novato en esto adquirir una visión general de su funcionamiento. Por eso, los detalles específicos de cada uno de estos apartados deben consultarse en el citado manual.

    Una visión general del flujo de trabajo con autotools:

    autotools_diagrama.png

    1. Introducción

    autoconf genera configure un guión shell que, asu vez, genera diversos ficheros que permiten construir un programa adaptado al entorno en que se va a ejecutar.

    El procesado de un fichero configure.ac se realiza mediante la aplicación de una serie de macros, generalmente predefinidas, pero que también puede definir de forma específica el desarrollador. Las macros estan escritas en m4, un lenguaje relativamente fácil de aprender, pero aquí no se va a tratar el tema del desarrollo de macros, sino del uso de las que ya estan definidas en autoconf.

    Se puede preparar un bosquejo de la plantilla que servirá para la generación de configure mediante autoscan, al que se le indica el directorio donde está el código y produce un fichero llamado configure.scan que es el punto de partida para que el desarrollador prepare su configure.ac (a veces denominado configure.in)

    Debe tenerse en cuenta que la operación de configure se divide en dos fases: primero, configure propiamente dicho realiza los tests indicados y genera config.status, que ejecuta una vez finalizadas todas las operaciones indicadas. Es config.status quien realmente genera los ficheros de salida. Esa distinción es necesaria para entender adecuadamente ciertos detalles del funcionamiento de autoconf.

    Uno de los ficheros fundamentales que genera el configure producido por autoconf es uno o mas Makefile, normalmente a partir de Makefile.in. De la misma manera que existe autoconf para generar procesar el modelo configure.ac existe automake para generar Makefile.in a partir de Makefile.am.

    2. Los diferentes tipos de macros.

    Existe un cierto orden a respetar en la confección de configure.ac, porque ciertas marcas esperan que existan ciertas definiciones que han creado otras que se llamaron antes.

    Hay dos macros que son de ubicación obligada, al principio una y al final otra: AC_INIT y AC_OUTPUT.

    Entre las demas, la mayor parte son de comprobaciones, con las que se utilizan ciertas macros de acción que indican a cada macro de comprobación qué hacer según el resultado de la comprobación.

    El orden a seguir es este:

    1. AC_INIT(...)
    2. Macros de información sobre el programa
    3. Macros de comprobación de existencia de programas
    4. Macros de comprobación de existencia de librerías
    5. Macros de comprobación de existencia de ficheros cabeceras de código fuente
    6. Macros de comprobación de existencia de tipos
    7. Macros de comprobación de existencia de estructuras (¿es que no son tipos?)
    8. Macros de comprobación de características del compilador
    9. Macros de comprobación de existencia de funciones de librería
    10. Macros de comprobación de existencia de servicios del sistema
    11. AC_CONFIG_FILES(...)
    12. AC_OUTPUT

    3. Macros de acción

    Toda macro de comprobación realiza una acción según el resultado de la misma. En este apartado se repasan las diferentes operaciones que se pueden realizar como resultado de las distintas comprobaciones.

    3.1. Macros de definición de símbolos

    A menudo, las macros de comprobación generan la defición de un símbolo para el pre-procesador, lo que se les indica mediante la macro AC_DEFINE (o AC_DEFINE_UNQUOTED), que tienen dos sintaxis alternativas:

    AC_DEFINE(x,y,[desc])

    define x a y y, si se indica desc y se utiliza AC_CONFIG_HEADERS (ver mas abajo), se incluye el comentario en la línea anterior a la que contiene la instrucción de preprocesador (#define x y).

    AC_DEFINE(x)

    simplemente define x a 1 (#define x 1). Pero esta versión no se recomienda: podría no ser compatible con futuras versiones de autoconf.

    Las variantes AC_DEFINE_UNQUOTED se utilizan cuando x y/o y son variables de entorno.

    3.2. Macros de variables de salida

    Las variables de salida son valores que configure utiliza para sustituir marcas que encuentra cuando genera ficheros de salida.

    AC_SUBST

    Hace que configure sustituya las ocurrencias de, p.e., %variable% por el valor que la variable de entorno variable tenga cuando se llama a AC_OUTPUT

    AC_SUBST_FILE

    En este caso configure, en lugar del valor de una variable de entorno utiliza el contenido del fichero al que apunta esa variable.

    4. Macros de generación

    Hay algunas macros que generan ficheros, aparte del propio configure:

    4.1. AC_CONFIG_HEADERS

    Hace que configure genere el o los ficheros de configuración, es decir, el habitual config.h que contiene las definiciones que luego usa el código para decidir si hace las cosas de una forma o de otra. Se suele construir a partir de la plantilla config.h.in preparada por el desarrollador. Si no se utiliza, se generan las correspondientes opciones de definición en el comando de invocación del compilador (-Dsymbol=value)

    La plantilla se limita a incluir líneas con #undef ..., que corresponden a macros AC_DEFINE y que son o bien sustituídas por el correspondiente #define o bien eliminadas.

    4.2. AC_CONFIG_FILES

    Se utiliza para que configure genere otros diversos ficheros a partir de plantillas preparadas por el desarrollador, principalmente Makefile, a partir de Makefile.in, utilizando los valores de las variables de salida para las sustituciones especificadas en los ficheros de entrada.

    Otras macros de generación auxiliares permiten crear enlaces en el sistema de ficheros o http://www.gnu.org/software/autoconf/manual/html_node/Configuration-Commands.html#Configuration-Commandsejecutar| comandos.

    5. Macros de mensajería

    AC_MSG_NOTICE y AC_MSG_WARN se utilizan a voluntad del desarrollador sin mas resultado que la comunicación al usuario.

    AC_MSG_ERROR y AC_MSG_FAILURE, sin embargo, ademas del mensaje, provocan la finalización de configure con un código de error específico. En el segundo caso, adicionalmente, se comunica al usuario que puede encontrar detalles adicionales en config.log

    Para notificar al usuario que se va a ejecutar una comprobación se usa AC_MESSAGE_CHECKING y para notificar el resultado AC_MESSAGE_RESULT.

    6. Macros de comprobación

    Cuando la macro tiene argumentos de acción-si-cierto y accion-si-falso, es habitual utilizar AC_DEFINE en el caso de cierto y AC_MSG_xxx si falso (recuerdese que AC_MSG_ERROR y AC_MSG_FAILURE ademas del mensaje abortan configure).

    6.1. Comprobaciones de programas y ficheros

    Comprueban la existencia de ciertos programas o preparan variables de salida cuyo valor es un programa capaz de realizar una determinada tarea. Por ejemplo, AC_PROG_INSTALL pone en la variable de salida INSTALL el nombre del programa adecuado para ejecutar la instalación, AC_PROG_MKDIR_P pone en la variable MKDIR_P un programa capaz de crear directorios y sus ancestros si es necesario.

    Otras hacen lo propio con programas como awk, distintas variantes de grep, sed y otros predefinidos.

    Para comprobar la existencia de un programa no predefinido por autoconf se puede utilizar AC_CHECK_PROG, AC_CHECK_PROGS, AC_PATH_PROG, AC_PATH_PROGS, así como otras con diferentes refinamientos

    Y para comprobar la existencia de ficheros, AC_CHECK_FILE o AC_CHECK_FILES.

    6.2. Comprobaciones relacionadas con librerías

    AC_CHECK_LIB comprueba si existe una librería, mientras que AC_SEARCH_LIBS busca una librería que provea la función indicada.

    Ambas añaden la opción apropiada a la variable LIBS, que contiene las librerías que se le pasan al enlazador (en el caso de AC_CHECK_LIB solo como acción por defecto si se encuentra la librería). Notese que esa misma variable se utiliza en las comprobaciones, por lo que, si una librería depende de otra, la comprobación ha de realizarse en el orden adecuado para que al comprobar una, la variable ya incluya las librerías de las que depende. También se puede utilizar el último argumento de ambas macros para indicar esas librerías, pero en ese caso no se realiza la comprobación y consecuentes acciones para ellas.

    Una serie de macros comprueban la existencia de funciones C que pueden plantear problemas de portabilidad:

    AC_FUNC_ALLOCA, AC_FUNC_CHOWN, AC_FUNC_FORK, AC_FUNC_MEMCMP, AC_FUNC_MBRTOWC, AC_FUNC_STRNLLEN, AC_FUNC_VPRINTF, ...

    AC_CHECK_FUNC comprueba si existe una función arbitraria y AC_CHECK_FUNCS varias (relacionadas entre sí, generalmente).

    AC_LIBOBJ instruye a configure para que se incluya un determinado fuente, que incluye la definición de una determinada función, lo que suele ser una acción a tomar si no se ha encontrado una función estándar que se necesita o la que se ha encontrado presenta algún problema de compatibilidad.

    6.3. Comprobaciones relacionadas con ficheros fuente cabecera.

    Aparte de AC_HEADER_STDBOOL, comprueba la accesibilidad de stdbool.h, casi todos las demas comprobaciones de ficheros cabecera específicos estan obsoletas.

    Para comprobrar uno arbitrario existe AC_CHECK_HEADER, y AC_CHECK_HEADERS cuando son varios relacionados.

    6.4. Comprobaciones de símbolos en general

    ... sean funciones, variables o constantes: AC_CHECK_DECL o AC_CHECK_DECLS.

    6.5. Comprobaciones de tipos

    Como es habitual, hay las específicas y las de tipos arbitrarios (#AC_CHECK_TYPE# y AC_CHECK_TYPES).

    Entre las de tipos específicos, cabe mencionar AC_TYPE_INT8_T ... AC_TYPE_INT64_T y AC_TYPE_UINT8_T... AC_TYPE_UINT64Ŧ, que si no encuentran definido el tipo particular, lo definen. AC_TYPE_INTPTR_T comprueba