GNU Autotools I - Introducción

En primer lugar: ¿qué son las Autotools de GNU, y para qué sirven? El nombre "GNU Autotools" se refiera a una colección de paquetes de software: Autoconf, Automake y Libtool. Estos paquetes contienen programas cuyo objetivo es estandarizar y automatizar los procesos de compilación, prueba, entrega e instalación a través de distintas plataformas. En ese sentido, comparte propósito con otras herramientas como CMake. Gran parte de el software de GNU ha sido creado con Autotools; git es un ejemplo célebre.

Más específicamente, lo que las Autotools hacen es generar scripts y Makefiles a partir de archivos de configuración de entrada escritos por el desarrolador. Al generar estos scripts y Makefiles, se considera la portabilidad a través de distintas plataformas a fin de que el paquete funcione en la mayor cantidad de entornos posible.

La perspectiva del usuario

En este contexto, se considerará al usuario como una persona que haya descargado un tarball de código fuente para cierto paquete construido con Autotools, y desee compilarlo e instalarlo en su sistema. A lo largo de los años, ciertos patrones emergieron en la forma en que los usuarios compilaban e instalaban paquetes GNU. Las Autotools han capturado y automatizado muchas de esas convenciones. En primer término, lo primero que un usuario debe hacer luego de descomprimir el tarball, es buscar un archivo de texto llamado INSTALL en el directorio raíz de los archivos descomprimidos. Dicho archivo contiene instrucciones detalladas para configurar, compilar e instalar el paquete en cuestión. Exceptuando casos muy puntuales que se desvíen de la norma, esas instrucciones típicamente serán ejecutar los siguientes comandos en una terminal:


./configure
make
sudo make install

El primer comando ejecuta el script configure, el cual examina el entorno donde está corriendo para asegurarse de que tenga todo lo necesario para compilar el paquete. Esto puede abarcar varias cosas y varía por paquete, pero los requerimientos más comunes son el procesador de macros m4 y un compilador C++, por ejemplo gcc. Al ejecutar este script, su salida constará de dos secciones:

  • La primera sección contiene líneas que empiezan con "checking": las mismas mostrarán un valor de sí/no para cada requerimiento del paquete. En este paso, el script puede fallar si no encuentra alguno de los requerimientos obligatorios. Para poder continuar, estos errores deben ser resueltos, típicamente instalando paquetes que contengan los programas y/o bibliotecas requeridos.
  • La segunda sección contiene líneas que comienzan con "config.status". Éstas son generadas por un script auxiliar, e indican qué archivos son generados para el paso de compilación: Makefiles, config.h y otros. Esto se verá en mayor detalle más adelante.

El segundo comando, make, utiliza los archivos generados en el primer paso para dirigir el proceso de compilación y generar los binarios a partir del código fuente. Dado que la meta del script configure es asegurar el éxito de make, es muy poco probable encontrar errores en este paso. Si los mismos aparecen, serán muy específicos de cada paquete. Si revisar el sitio del paquete y googlear no arrojan una solución, contactar a los mantenedores del paquete será lo más recomendable.

Por último, el tercer paso, que puede requerir privilegios de administrador, copia los archivos binarios generador por make a una ubicación predefinida a fin de efectivamente instalar el paquete. Esto es, por defecto, /usr/local/bin. Para instalar a otra ubicación, incluyendo aquellas que no requieran privilegios de root, es posible pasar la opción --prefix al script configure.

Entre los pasos de make e install, opcionalmente, algunos paquetes ofrecen la posibilidad de ejecutar una suite de tests para asegurar que los programas funcionen correctamente antes de continuar con la instalación. El comando para hacer esto estará especificado en el archivo INSTALL, y típicamente es make check.

Las herramientas en cuestión

Regresando a la perspectiva del desarrollador del paquete, ¿cuáles son los programas específicos que componen la suite Autotools, y qué hace cada uno?

  • Autoconf: Genera los scripts configure y testsuite, siendo el segundo opcional. Tomando archivos de configuración como entrada, genera ambos scripts como salida.
  • Automake: Simplifica el proceso de generar Makefiles.
  • Libtool: Provee una capa de abstracción que permite generar bibliotecas de manera portable.

El mejor caso de uso para Autotools es la construcción de software para sistemas Unix/Linux, especialmente si opera a un nivel cercano al del sistema operativo. Esto incluye sistemas compatibles con POSIX como Cygwin corriendo en Windows, o Mac OS desde la versión 10, Leopard, en adelante. Los lenguajes de programación para los que Autotools ofrece soporte nativo, al momento de escribir estas líneas (marzo 2023), son:

  • C
  • C++
  • Objective C
  • Objective C++
  • Fortran
  • Fortran 77
  • Erlang
  • Go

Cabe aclarar que lo que se entiende por "soporte nativo" para un lenguaje es que Autoconf pueda compilar, enlazar y ejecutar chequeos a nivel código para proyectos construidos con ese lenguaje. Es posible usar Autotools para, por ejemplo, un proyecto Java, pero no habrá macros M4 disponibles para manejar el paso de configure. De todas formas, las Autotools son extensibles, por lo cual es bastante viable agregar soporte para cualquier lenguaje, de ser necesario.

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x